[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