[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