[Scummvm-git-logs] scummvm master -> a25467c6dfd50dc8d380a0c1c4b3c293d37782f7

npjg nathanael.gentrydb8 at gmail.com
Wed Jul 1 17:10:14 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
a25467c6df DIRECTOR: Finish implementing puppetTransition


Commit: a25467c6dfd50dc8d380a0c1c4b3c293d37782f7
    https://github.com/scummvm/scummvm/commit/a25467c6dfd50dc8d380a0c1c4b3c293d37782f7
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-01T13:10:07-04:00

Commit Message:
DIRECTOR: Finish implementing puppetTransition

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/score.cpp
    engines/director/score.h
    engines/director/stage.cpp
    engines/director/stage.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index dfedb52411..d412469034 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1747,7 +1747,6 @@ void LB::b_puppetTempo(int nargs) {
 
 void LB::b_puppetTransition(int nargs) {
 	// puppetTransition whichTransition [, time] [, chunkSize] [, changeArea]
-	Score *score = g_director->getCurrentMovie()->getScore();
 	Stage *stage = g_director->getStage();
 	uint16 duration = 250, area = 1, chunkSize = 1, type = 0;
 	if (nargs == 4) {
@@ -1771,7 +1770,12 @@ void LB::b_puppetTransition(int nargs) {
 		ARGNUMCHECK(1);
 	}
 
-	stage->playTransition(duration, area, chunkSize, ((TransitionType)type), score->getCurrentFrame());
+	if (stage->_puppetTransition) {
+		warning("b_puppetTransition: Transition already queued");
+		return;
+	}
+
+	stage->_puppetTransition = new TransParams(duration, area, chunkSize, ((TransitionType)type));
 }
 
 void LB::b_ramNeeded(int nargs) {
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 3cfdc0dfa9..3ce9567f13 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -535,23 +535,35 @@ void Score::update() {
 }
 
 void Score::renderFrame(uint16 frameId, RenderMode mode) {
-	Frame *currentFrame = _frames[frameId];
-
-	if (currentFrame->_transType != 0 && mode != kRenderUpdateStageOnly) {
-		// TODO Handle changing area case
-		g_director->getStage()->playTransition(currentFrame->_transDuration, currentFrame->_transArea, currentFrame->_transChunkSize, currentFrame->_transType, frameId);
-	} else {
+	if (!renderTransition(frameId))
 		renderSprites(frameId, mode);
-	}
 
 	_vm->_wm->renderZoomBox();
 	g_director->getStage()->render();
 	_vm->_wm->draw();
 
-	if (currentFrame->_sound1 != 0 || currentFrame->_sound2 != 0)
+	if (_frames[frameId]->_sound1 || _frames[frameId]->_sound2)
 		playSoundChannel(frameId);
 }
 
+bool Score::renderTransition(uint16 frameId) {
+	Frame *currentFrame = _frames[frameId];
+	TransParams *tp = g_director->getStage()->_puppetTransition;
+
+	if (tp) {
+		g_director->getStage()->playTransition(tp->duration, tp->area, tp->chunkSize, tp->type, frameId);
+
+		delete g_director->getStage()->_puppetTransition;;
+		g_director->getStage()->_puppetTransition = nullptr;
+		return true;
+	} else if (currentFrame->_transType) {
+		g_director->getStage()->playTransition(currentFrame->_transDuration, currentFrame->_transArea, currentFrame->_transChunkSize, currentFrame->_transType, frameId);
+		return true;
+	} else {
+		return false;
+ }
+}
+
 void Score::renderSprites(uint16 frameId, RenderMode mode) {
 	if (_vm->_newMovieStarted)
 		mode = kRenderForceUpdate;
diff --git a/engines/director/score.h b/engines/director/score.h
index 6d13ffaa1a..7493e80a8e 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -58,6 +58,41 @@ enum RenderMode {
 	kRenderNoUnrender
 };
 
+struct TransParams {
+	TransitionType type;
+	uint frame;
+	uint duration;
+	uint chunkSize;
+	uint area;
+
+	int steps;
+	int stepDuration;
+
+	int xStepSize;
+	int yStepSize;
+
+	int xpos, ypos;
+
+	int stripSize;
+
+	TransParams() {
+		type = kTransNone;
+		frame = 0;
+		duration = 250;
+		chunkSize = 1;
+		area = 0;
+		steps = 0;
+		stepDuration = 0;
+		stripSize = 0;
+
+		xStepSize = yStepSize = 0;
+		xpos = ypos = 0;
+	}
+
+	TransParams(uint16 d, uint16 a, uint16 c, TransitionType t) :
+		duration(d), area(a), chunkSize(c), type(t) {}
+};
+
 struct MacShape {
 	InkType ink;
 	byte spriteType;
@@ -116,6 +151,7 @@ public:
 	bool checkSpriteIntersection(uint16 spriteId, Common::Point pos);
 	Common::List<Channel *> getSpriteIntersections(const Common::Rect &r);
 
+	bool renderTransition(uint16 frameId);
 	void renderFrame(uint16 frameId, RenderMode mode = kRenderModeNormal);
 	void renderSprites(uint16 frameId, RenderMode mode = kRenderModeNormal);
 
diff --git a/engines/director/stage.cpp b/engines/director/stage.cpp
index da0c2f84f8..59d9bf70f6 100644
--- a/engines/director/stage.cpp
+++ b/engines/director/stage.cpp
@@ -35,6 +35,7 @@ namespace Director {
 Stage::Stage(int id, bool scrollable, bool resizable, bool editable, Graphics::MacWindowManager *wm)
 	: MacWindow(id, scrollable, resizable, editable, wm) {
 	_stageColor = 0;
+	_puppetTransition = nullptr;
 }
 
 bool Stage::render(bool forceRedraw, Graphics::ManagedSurface *blitTo) {
diff --git a/engines/director/stage.h b/engines/director/stage.h
index 0c1597a4d8..6465823dcb 100644
--- a/engines/director/stage.h
+++ b/engines/director/stage.h
@@ -34,38 +34,7 @@ class MacWindowManager;
 namespace Director {
 
 struct Channel;
-
-struct TransParams {
-	TransitionType type;
-	uint frame;
-	uint duration;
-	uint chunkSize;
-	uint area;
-
-	int steps;
-	int stepDuration;
-
-	int xStepSize;
-	int yStepSize;
-
-	int xpos, ypos;
-
-	int stripSize;
-
-	TransParams() {
-		type = kTransNone;
-		frame = 0;
-		duration = 250;
-		chunkSize = 1;
-		area = 0;
-		steps = 0;
-		stepDuration = 0;
-		stripSize = 0;
-
-		xStepSize = yStepSize = 0;
-		xpos = ypos = 0;
-	}
-};
+struct TransParams;
 
 class Stage : public Graphics::MacWindow {
  public:
@@ -91,6 +60,7 @@ class Stage : public Graphics::MacWindow {
 public:
 	Common::List<Common::Rect> _dirtyRects;
 	Common::List<Channel *> _dirtyChannels;
+	TransParams *_puppetTransition;
 
 private:
 	uint _stageColor;




More information about the Scummvm-git-logs mailing list