[Scummvm-git-logs] scummvm master -> f5b9dda7819b8342e0a2be802509b8f429692d85
moralrecordings
noreply at scummvm.org
Mon Jun 24 15:04:53 UTC 2024
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
3cef329523 DIRECTOR: Fix film loop playback
f5b9dda781 DIRECTOR: Fix detection of builtin palettes
Commit: 3cef329523b8943039e182a985876acb3747b7df
https://github.com/scummvm/scummvm/commit/3cef329523b8943039e182a985876acb3747b7df
Author: Scott Percival (code at moral.net.au)
Date: 2024-06-24T22:33:25+08:00
Commit Message:
DIRECTOR: Fix film loop playback
Previously, film loops were incremented from Score::updateSprites() by
Channel::setClean(), however this wasn't guaranteed to be run only once
per frame and lead to animation frames being skipped.
This has now been moved into Score::renderFrame.
Changed paths:
engines/director/castmember/filmloop.cpp
engines/director/channel.cpp
engines/director/score.cpp
engines/director/score.h
engines/director/window.cpp
diff --git a/engines/director/castmember/filmloop.cpp b/engines/director/castmember/filmloop.cpp
index 251d3f51d1f..a80a7b74db7 100644
--- a/engines/director/castmember/filmloop.cpp
+++ b/engines/director/castmember/filmloop.cpp
@@ -84,7 +84,7 @@ Common::Array<Channel> *FilmLoopCastMember::getSubChannels(Common::Rect &bbox, C
_subchannels.clear();
- if (channel->_filmLoopFrame >= _frames.size()) {
+ if (channel->_filmLoopFrame < 0 || channel->_filmLoopFrame >= _frames.size()) {
warning("FilmLoopCastMember::getSubChannels(): Film loop frame %d requested, only %d available", channel->_filmLoopFrame, _frames.size());
return &_subchannels;
}
diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 0a65116f606..f859ae0072f 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -418,22 +418,8 @@ void Channel::setClean(Sprite *nextSprite, bool partial) {
((DigitalVideoCastMember *)nextSprite->_cast)->startVideo();
}
} else if (nextSprite->_cast->_type == kCastFilmLoop) {
- // brand new film loop, reset the frame counter
- _filmLoopFrame = 0;
- }
- }
-
- // if the next sprite in the channel shares the cast member
- if (nextSprite->_cast && _sprite->_castId == nextSprite->_castId) {
- if (nextSprite->_cast->_type == kCastFilmLoop) {
- FilmLoopCastMember *fl = ((FilmLoopCastMember *)nextSprite->_cast);
- if (!fl->_frames.empty()) {
- // increment the film loop counter
- _filmLoopFrame += 1;
- _filmLoopFrame %= ((FilmLoopCastMember *)nextSprite->_cast)->_frames.size();
- } else {
- warning("Channel::setClean(): invalid film loop in castId %s", nextSprite->_castId.asString().c_str());
- }
+ // brand new film loop, reset the frame counter.
+ _filmLoopFrame = 1;
}
}
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index fd0f343ed23..bef2e084ae8 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -47,6 +47,7 @@
#include "director/sprite.h"
#include "director/window.h"
#include "director/castmember/castmember.h"
+#include "director/castmember/filmloop.h"
#include "director/castmember/transition.h"
namespace Director {
@@ -706,22 +707,25 @@ void Score::renderFrame(uint16 frameId, RenderMode mode) {
if (_window->_newMovieStarted)
renderCursor(_movie->getWindow()->getMousePos(), true);
+
if (_skipTransition) {
+ incrementFilmLoops();
_window->render();
_skipTransition = false;
} else if (g_director->_playbackPaused) {
updateSprites(mode);
+ incrementFilmLoops();
_window->render();
} else if (!renderTransition(frameId, mode)) {
bool skip = renderPrePaletteCycle(mode);
setLastPalette();
updateSprites(mode);
+ incrementFilmLoops();
_window->render();
if (!skip)
renderPaletteCycle(mode);
}
-
playSoundChannel(false);
playQueuedSound(); // this is currently only used in FPlayXObj
@@ -759,6 +763,21 @@ bool Score::renderTransition(uint16 frameId, RenderMode mode) {
return false;
}
+void Score::incrementFilmLoops() {
+ for (auto &it : _channels) {
+ if (it->_sprite->_cast && it->_sprite->_cast->_type == kCastFilmLoop) {
+ FilmLoopCastMember *fl = ((FilmLoopCastMember *)it->_sprite->_cast);
+ if (!fl->_frames.empty()) {
+ // increment the film loop counter
+ it->_filmLoopFrame += 1;
+ it->_filmLoopFrame %= fl->_frames.size();
+ } else {
+ warning("Score::updateFilmLoops(): invalid film loop in castId %s", it->_sprite->_castId.asString().c_str());
+ }
+ }
+ }
+}
+
void Score::updateSprites(RenderMode mode) {
if (_window->_newMovieStarted)
mode = kRenderForceUpdate;
@@ -1912,13 +1931,13 @@ Common::String Score::formatChannelInfo() {
Sprite &sprite = *channel._sprite;
Common::Point position = channel.getPosition();
if (sprite._castId.member) {
- result += Common::String::format("CH: %-3d castId: %s, visible: %d, [inkData: 0x%02x [ink: %d, trails: %d, stretch: %d, line: %d], %dx%d@%d,%d type: %d (%s) fg: %d bg: %d], script: %s, colorcode: 0x%x, blendAmount: 0x%x, unk3: 0x%x, constraint: %d, puppet: %d, moveable: %d, movieRate: %f, movieTime: %d (%f)\n",
+ result += Common::String::format("CH: %-3d castId: %s, visible: %d, [inkData: 0x%02x [ink: %d, trails: %d, stretch: %d, line: %d], %dx%d@%d,%d type: %d (%s) fg: %d bg: %d], script: %s, colorcode: 0x%x, blendAmount: 0x%x, unk3: 0x%x, constraint: %d, puppet: %d, moveable: %d, movieRate: %f, movieTime: %d (%f), filmLoopFrame: %d\n",
i + 1, sprite._castId.asString().c_str(), channel._visible, sprite._inkData,
sprite._ink, sprite._trails, sprite._stretch, sprite._thickness,
channel.getWidth(), channel.getHeight(), position.x, position.y,
sprite._spriteType, spriteType2str(sprite._spriteType), sprite._foreColor, sprite._backColor,
sprite._scriptId.asString().c_str(), sprite._colorcode, sprite._blendAmount, sprite._unk3,
- channel._constraint, sprite._puppet, sprite._moveable, channel._movieRate, channel._movieTime, (float)(channel._movieTime/60.0f));
+ channel._constraint, sprite._puppet, sprite._moveable, channel._movieRate, channel._movieTime, (float)(channel._movieTime/60.0f), channel._filmLoopFrame);
} else {
result += Common::String::format("CH: %-3d castId: 000\n", i + 1);
}
diff --git a/engines/director/score.h b/engines/director/score.h
index 12317acc0e0..5f0117d5246 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -119,6 +119,7 @@ public:
bool renderTransition(uint16 frameId, RenderMode mode);
void renderFrame(uint16 frameId, RenderMode mode = kRenderModeNormal);
+ void incrementFilmLoops();
void updateSprites(RenderMode mode = kRenderModeNormal);
bool renderPrePaletteCycle(RenderMode mode = kRenderModeNormal);
void setLastPalette();
diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index 6b65cb85559..43f7501906c 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -214,8 +214,8 @@ bool Window::render(bool forceRedraw, Graphics::ManagedSurface *blitTo) {
Common::Rect bbox = channel->getBbox();
blitTo->frameRect(bbox, g_director->_wm->_colorWhite);
- font->drawString(blitTo, Common::String::format("m: %d, ch: %d", channel->_sprite->_castId.member, i), bbox.left + 3, bbox.top + 3, 128, g_director->_wm->_colorBlack);
- font->drawString(blitTo, Common::String::format("m: %d, ch: %d", channel->_sprite->_castId.member, i), bbox.left + 2, bbox.top + 2, 128, g_director->_wm->_colorWhite);
+ font->drawString(blitTo, Common::String::format("m: %d, ch: %d, fr: %d", channel->_sprite->_castId.member, i, channel->_filmLoopFrame ? channel->_filmLoopFrame : channel->_movieTime), bbox.left + 3, bbox.top + 3, 128, g_director->_wm->_colorBlack);
+ font->drawString(blitTo, Common::String::format("m: %d, ch: %d, fr: %d", channel->_sprite->_castId.member, i, channel->_filmLoopFrame ? channel->_filmLoopFrame : channel->_movieTime), bbox.left + 2, bbox.top + 2, 128, g_director->_wm->_colorWhite);
}
}
}
Commit: f5b9dda7819b8342e0a2be802509b8f429692d85
https://github.com/scummvm/scummvm/commit/f5b9dda7819b8342e0a2be802509b8f429692d85
Author: Scott Percival (code at moral.net.au)
Date: 2024-06-24T22:34:30+08:00
Commit Message:
DIRECTOR: Fix detection of builtin palettes
Changed paths:
engines/director/director.h
engines/director/graphics.cpp
engines/director/movie.cpp
engines/director/score.cpp
diff --git a/engines/director/director.h b/engines/director/director.h
index e93e4d16578..d695e48fd14 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -191,6 +191,7 @@ public:
void shiftPalette(int startIndex, int endIndex, bool reverse);
void clearPalettes();
PaletteV4 *getPalette(const CastMemberID &id);
+ bool hasPalette(const CastMemberID &id);
void loadDefaultPalettes();
const Common::HashMap<CastMemberID, PaletteV4> &getLoadedPalettes() { return _loadedPalettes; }
diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 420833c548f..08dded7405d 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -144,6 +144,10 @@ PaletteV4 *DirectorEngine::getPalette(const CastMemberID &id) {
return &_loadedPalettes[id];
}
+bool DirectorEngine::hasPalette(const CastMemberID &id) {
+ return _loadedPalettes.contains(id);
+}
+
void DirectorEngine::addPalette(CastMemberID &id, byte *palette, int length) {
if (id.castLib < 0) {
warning("DirectorEngine::addPalette(): Negative cast library ids reserved for default palettes");
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 58995fc429d..3908ef83357 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -216,7 +216,7 @@ bool Movie::loadArchive() {
}
_stageColor = _vm->transformColor(_cast->_stageColor);
// Need to check if the default palette is valid; if not, assume it's the Mac one.
- if (isValidCastMember(_cast->_defaultPalette, kCastPalette)) {
+ if (g_director->hasPalette(_cast->_defaultPalette)) {
_defaultPalette = _cast->_defaultPalette;
} else {
_defaultPalette = CastMemberID(kClutSystemMac, -1);
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index bef2e084ae8..1a5470fdabc 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -970,14 +970,14 @@ void Score::setLastPalette() {
CastMemberID currentPalette = _currentFrame->_mainChannels.palette.paletteId;
// Director allows you to use palette IDs for cast members
// that have long since been erased. Check all of them.
- if (!_movie->isValidCastMember(currentPalette, kCastPalette))
+ if (!g_director->hasPalette(currentPalette))
currentPalette = CastMemberID();
// Palette not specified in the frame
if (currentPalette.isNull()) {
// Use the score cached palette ID
isCachedPalette = true;
currentPalette = _currentFrame->_mainChannels.scoreCachedPaletteId;
- if (!_movie->isValidCastMember(currentPalette, kCastPalette))
+ if (!g_director->hasPalette(currentPalette))
currentPalette = CastMemberID();
// The cached ID is created before the cast gets loaded; if it's zero,
// this corresponds to the movie default palette.
More information about the Scummvm-git-logs
mailing list