diff --git a/engine.cpp b/engine.cpp index 23300b61140..c85a3e00c26 100644 --- a/engine.cpp +++ b/engine.cpp @@ -84,61 +84,75 @@ void Engine::mainLoop() { // Run asynchronous tasks lua_runtasks(); - if (SCREENBLOCKS_GLOBAL == 1) - screenBlocksReset(); + if (_mode == ENGINE_MODE_SMUSH) { + if (g_smush->isPlaying()) { + movieTime_ = g_smush->getMovieTime(); + if (g_smush->isUpdateNeeded()) { + g_driver->prepareSmushFrame(g_smush->getWidth(), g_smush->getHeight(), g_smush->getDstPtr()); + g_smush->clearUpdateNeeded(); + } + g_driver->drawSmushFrame(g_smush->getX(), g_smush->getY()); + } + // Draw text + for (text_list_type::iterator i = textObjects_.begin(); i != textObjects_.end(); i++) { + (*i)->draw(); + } + g_driver->flipBuffer(); + } else if (_mode == ENGINE_MODE_NORMAL) { + if (SCREENBLOCKS_GLOBAL == 1) + screenBlocksReset(); - // Update actor costumes - for (actor_list_type::iterator i = actors_.begin(); i != actors_.end(); i++) { - Actor *a = *i; - assert(currScene_); - if (a->inSet(currScene_->name()) && a->visible()) - a->update(); - } + // Update actor costumes + for (actor_list_type::iterator i = actors_.begin(); i != actors_.end(); i++) { + Actor *a = *i; + assert(currScene_); + if (a->inSet(currScene_->name()) && a->visible()) + a->update(); + } - g_driver->clearScreen(); + g_driver->clearScreen(); - if (SCREENBLOCKS_GLOBAL == 1) - screenBlocksBlitDirtyBlocks(); + if (SCREENBLOCKS_GLOBAL == 1) + screenBlocksBlitDirtyBlocks(); - if (!g_smush->isPlaying() || (g_smush->isPlaying() && !g_smush->isFullSize())) { Bitmap::prepareDraw(); if (currScene_ != NULL) currScene_->drawBackground(); - } - if (g_smush->isPlaying()) { - movieTime_ = g_smush->getMovieTime(); - if (g_smush->isUpdateNeeded()) { - g_driver->prepareSmushFrame(g_smush->getWidth(), g_smush->getHeight(), g_smush->getDstPtr()); - g_smush->clearUpdateNeeded(); + if (g_smush->isPlaying()) { + movieTime_ = g_smush->getMovieTime(); + if (g_smush->isUpdateNeeded()) { + g_driver->prepareSmushFrame(g_smush->getWidth(), g_smush->getHeight(), g_smush->getDstPtr()); + g_smush->clearUpdateNeeded(); + } + g_driver->drawSmushFrame(g_smush->getX(), g_smush->getY()); } - g_driver->drawSmushFrame(g_smush->getX(), g_smush->getY()); - } - glMatrixMode(GL_MODELVIEW); + glMatrixMode(GL_MODELVIEW); - glEnable(GL_DEPTH_TEST); - if (currScene_ != NULL) - currScene_->setupCamera(); + glEnable(GL_DEPTH_TEST); + if (currScene_ != NULL) + currScene_->setupCamera(); - // Draw actors - if (!g_smush->isPlaying() || (g_smush->isPlaying() && !g_smush->isFullSize())) { - glEnable(GL_TEXTURE_2D); - for (actor_list_type::iterator i = actors_.begin(); i != actors_.end(); i++) { - Actor *a = *i; - if (a->inSet(currScene_->name()) && a->visible()) - a->draw(); + // Draw actors + if (!g_smush->isPlaying()) { + glEnable(GL_TEXTURE_2D); + for (actor_list_type::iterator i = actors_.begin(); i != actors_.end(); i++) { + Actor *a = *i; + if (a->inSet(currScene_->name()) && a->visible()) + a->draw(); + } + glDisable(GL_TEXTURE_2D); + //screenBlocksDrawDebug(); } - glDisable(GL_TEXTURE_2D); - //screenBlocksDrawDebug(); - } - // Draw text - for (text_list_type::iterator i = textObjects_.begin(); i != textObjects_.end(); i++) { - (*i)->draw(); - } + // Draw text + for (text_list_type::iterator i = textObjects_.begin(); i != textObjects_.end(); i++) { + (*i)->draw(); + } - g_driver->flipBuffer(); + g_driver->flipBuffer(); + } // don't kill CPU SDL_Delay(1); diff --git a/engine.h b/engine.h index 2b246b491ce..1ba857f936e 100644 --- a/engine.h +++ b/engine.h @@ -26,6 +26,12 @@ class Actor; +#define ENGINE_MODE_IDLE 0 +#define ENGINE_MODE_PAUSE 1 +#define ENGINE_MODE_NORMAL 2 +#define ENGINE_MODE_SMUSH 3 +#define ENGINE_MODE_DRAW 4 + // Fake SDLK_* values for joystick and mouse events enum { SDLK_JOY1_B1 = SDLK_LAST, @@ -86,6 +92,8 @@ public: return instance_; } + void setMode(int mode) { _mode = mode; } + void mainLoop(); unsigned frameStart() const { return frameStart_; } unsigned frameTime() const { return frameTime_; } @@ -137,6 +145,7 @@ private: ~Engine() { } Scene *currScene_; + int _mode; unsigned frameStart_, frameTime_, movieTime_; diff --git a/lua.cpp b/lua.cpp index 4e4bb2c64bf..44a4bbbad93 100644 --- a/lua.cpp +++ b/lua.cpp @@ -1028,6 +1028,7 @@ static void GetTextObjectDimensions() { static void StartFullscreenMovie() { bool mode = getbool(2); + Engine::instance()->setMode(ENGINE_MODE_SMUSH); pushbool(g_smush->play(luaL_check_string(1), 0, 0)); } @@ -1035,6 +1036,7 @@ static void StartMovie() { bool mode = getbool(2); int x = lua_getparam(3); int y = lua_getparam(4); + Engine::instance()->setMode(ENGINE_MODE_NORMAL); pushbool(g_smush->play(luaL_check_string(1), x, y)); } diff --git a/main.cpp b/main.cpp index 815bc61215c..f05a8cc63e1 100644 --- a/main.cpp +++ b/main.cpp @@ -121,6 +121,7 @@ int main(int argc, char *argv[]) { lua_call("BOOT"); lua_endblock(); + Engine::instance()->setMode(ENGINE_MODE_NORMAL); Engine::instance()->mainLoop(); delete g_smush; diff --git a/smush.cpp b/smush.cpp index f235ea822be..a414b408eac 100644 --- a/smush.cpp +++ b/smush.cpp @@ -25,6 +25,7 @@ #include "mixer/mixer.h" #include "driver_gl.h" #include "resource.h" +#include "engine.h" Smush *g_smush; @@ -217,6 +218,11 @@ bool Smush::setupAnim(const char *file, int x, int y) { return true; } +void Smush::stop() { + deinit(); + Engine::instance()->setMode(ENGINE_MODE_NORMAL); +} + bool Smush::play(const char *filename, int x, int y) { deinit(); diff --git a/smush.h b/smush.h index 3aafc860862..f87fd81bb22 100644 --- a/smush.h +++ b/smush.h @@ -74,7 +74,7 @@ public: ~Smush(); bool play(const char *filename, int x, int y); - void stop() { deinit(); } + void stop(); void pause(bool pause) { _videoPause = pause; } bool isPlaying() { return !_videoFinished; } bool isUpdateNeeded() { return _updateNeeded; } @@ -84,7 +84,6 @@ public: int getWidth() {return _width; } int getHeight() { return _height; } void clearUpdateNeeded() { _updateNeeded = false; } - bool isFullSize() { return ( _width == 640 && _height == 480); } int32 getMovieTime() { return _movieTime; } private: