From af70a90cbc239f820f6c33ac54c207829fd8847a Mon Sep 17 00:00:00 2001 From: Peter Kohaut Date: Thu, 29 Sep 2016 21:00:36 +0200 Subject: [PATCH] BLADERUNNER: fixed loading of new set/scene, fixed memoryleak in lights --- engines/bladerunner/aud_stream.cpp | 3 +- engines/bladerunner/bladerunner.cpp | 15 +++++++- engines/bladerunner/gameinfo.cpp | 10 +++--- engines/bladerunner/gameinfo.h | 4 +-- engines/bladerunner/lights.cpp | 10 +++--- engines/bladerunner/lights.h | 7 ++-- engines/bladerunner/scene.cpp | 56 +++++++++++++++++++++-------- engines/bladerunner/scene.h | 8 +++-- engines/bladerunner/settings.cpp | 7 +++- engines/bladerunner/vqa_player.cpp | 2 -- 10 files changed, 83 insertions(+), 39 deletions(-) diff --git a/engines/bladerunner/aud_stream.cpp b/engines/bladerunner/aud_stream.cpp index 28f85313a4c..97623f9b7ec 100644 --- a/engines/bladerunner/aud_stream.cpp +++ b/engines/bladerunner/aud_stream.cpp @@ -95,7 +95,8 @@ int AudStream::readBuffer(int16 *buffer, const int numSamples) { samplesRead += 2 * bytesConsumed; } } else { - assert(0 && "readBuffer: Unimplemented"); + //assert(0 && "readBuffer: Unimplemented"); + warning("AudStream::readBuffer unknown compression type %d", _compressionType); } return samplesRead; diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp index 88d441db6cf..dee0c6135c8 100644 --- a/engines/bladerunner/bladerunner.cpp +++ b/engines/bladerunner/bladerunner.cpp @@ -613,7 +613,7 @@ void BladeRunnerEngine::gameTick() { _walkSoundId = -1; } -#if 0 //_DEBUG +#if _DEBUG //draw scene objects int count = _sceneObjects->_count; if (count > 0) { @@ -667,6 +667,19 @@ void BladeRunnerEngine::gameTick() { } } + + for (int i = 0; i < (int)_lights->_lights.size(); i++) { + Light *light = _lights->_lights[i]; + Matrix4x3 m = light->_matrix; + Vector3 pos = Vector3(m(0, 3), m(1, 3), m(2, 3)); + Vector3 size = Vector3(5.0f, 5.0f, 5.0f); + int colorR = (light->_color.r * 31.0f); + int colorG = (light->_color.g * 31.0f); + int colorB = (light->_color.b * 31.0f); + int color = (colorR << 10) + (colorG << 5) + colorB; + drawBBox(pos-size, pos+size, _view, &_surface2, color); + + } #endif _system->copyRectToScreen((const byte *)_surface2.getBasePtr(0, 0), _surface2.pitch, 0, 0, 640, 480); diff --git a/engines/bladerunner/gameinfo.cpp b/engines/bladerunner/gameinfo.cpp index 19037c8cebf..a5c01c10750 100644 --- a/engines/bladerunner/gameinfo.cpp +++ b/engines/bladerunner/gameinfo.cpp @@ -32,14 +32,14 @@ namespace BladeRunner { GameInfo::GameInfo(BladeRunnerEngine *vm) : _vm(vm) { - _set_names = nullptr; + _scene_names = nullptr; _sfx_tracks = nullptr; _music_tracks = nullptr; _outtakes = nullptr; } GameInfo::~GameInfo() { - delete[] _set_names; + delete[] _scene_names; delete[] _sfx_tracks; delete[] _music_tracks; delete[] _outtakes; @@ -73,9 +73,9 @@ bool GameInfo::open(const Common::String &name) { (void)unk; - _set_names = new char[_set_names_count][5]; + _scene_names = new char[_set_names_count][5]; for (uint32 i = 0; i != _set_names_count; ++i) - s->read(_set_names[i], 5); + s->read(_scene_names[i], 5); _sfx_tracks = new char[_sfx_track_count][13]; for (uint32 i = 0; i != _sfx_track_count; ++i) @@ -97,7 +97,7 @@ bool GameInfo::open(const Common::String &name) { if (false) { for (uint32 i = 0; i != _set_names_count; ++i) - debug("%3d: %s", i, _set_names[i]); + debug("%3d: %s", i, _scene_names[i]); for (uint32 i = 0; i != _sfx_track_count; ++i) debug("%3d: %s", i, _sfx_tracks[i]); for (uint32 i = 0; i != _music_track_count; ++i) diff --git a/engines/bladerunner/gameinfo.h b/engines/bladerunner/gameinfo.h index f9074399b50..b77251d8642 100644 --- a/engines/bladerunner/gameinfo.h +++ b/engines/bladerunner/gameinfo.h @@ -49,7 +49,7 @@ class GameInfo { uint32 _cover_waypoint_count; uint32 _flee_waypoint_count; - char (*_set_names)[5]; + char (*_scene_names)[5]; char (*_sfx_tracks)[13]; char (*_music_tracks)[13]; char (*_outtakes)[13]; @@ -75,7 +75,7 @@ public: uint32 getCoverWaypointCount() { return _cover_waypoint_count; } uint32 getFleeWaypointCount() { return _flee_waypoint_count; } - const char *getSetName(int i) { return _set_names[i]; } + const char *getSceneName(int i) { return _scene_names[i]; } const char *getSfxTrack(int i) { return _sfx_tracks[i]; } const char *getMusicTrack(int i) { return _music_tracks[i]; } const char *getOuttake(int i) { return _outtakes[i]; } diff --git a/engines/bladerunner/lights.cpp b/engines/bladerunner/lights.cpp index e8660a27dba..a996c2819cb 100644 --- a/engines/bladerunner/lights.cpp +++ b/engines/bladerunner/lights.cpp @@ -9,7 +9,6 @@ Lights::Lights(BladeRunnerEngine *vm) { _ambientLightColor.g = 0.0; _ambientLightColor.b = 0.0; - _lightsCount = 0; _lights.clear(); _frame = 0; } @@ -23,9 +22,8 @@ void Lights::read(Common::ReadStream *stream, int framesCount) { _ambientLightColor.g = stream->readFloatLE(); _ambientLightColor.b = stream->readFloatLE(); - _lightsCount = stream->readUint32LE(); - int i; - for (i = 0; i < _lightsCount; i++) { + uint _lightsCount = stream->readUint32LE(); + for (uint i = 0; i < _lightsCount; i++) { Light *light; int type = stream->readUint32LE(); switch (type) { @@ -54,7 +52,7 @@ void Lights::read(Common::ReadStream *stream, int framesCount) { } void Lights::removeAnimated() { - for (int i = (int)(_lights.size() - 1); i > 0; i--) { + for (int i = (int)(_lights.size() - 1); i >= 0; i--) { if (_lights[i]->_animated) { delete _lights.remove_at(i); } @@ -106,7 +104,7 @@ void Lights::setupFrame(int frame) { } void Lights::reset() { - for (int i = (int)(_lights.size() - 1); i > 0; i--) { + for (int i = (int)(_lights.size() - 1); i >= 0; i--) { delete _lights.remove_at(i); } _lights.clear(); diff --git a/engines/bladerunner/lights.h b/engines/bladerunner/lights.h index 486e6905e7b..ca2e77b1fdf 100644 --- a/engines/bladerunner/lights.h +++ b/engines/bladerunner/lights.h @@ -39,12 +39,9 @@ class Lights { BladeRunnerEngine *_vm; - Color _ambientLightColor; - - int _lightsCount; + Color _ambientLightColor; Common::Array _lights; - - int _frame; + int _frame; //char gap[28]; public: diff --git a/engines/bladerunner/scene.cpp b/engines/bladerunner/scene.cpp index 29d73f30709..65efe1306be 100644 --- a/engines/bladerunner/scene.cpp +++ b/engines/bladerunner/scene.cpp @@ -32,7 +32,6 @@ #include "bladerunner/slice_renderer.h" #include "common/str.h" -#include "common/stream.h" namespace BladeRunner { @@ -44,7 +43,7 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) { _setId = setId; _sceneId = sceneId; - const Common::String setName = _vm->_gameInfo->getSetName(_sceneId); + const Common::String setName = _vm->_gameInfo->getSceneName(_sceneId); if (isLoadingGame) { // TODO: Set up overlays @@ -70,10 +69,15 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) { vqaName = Common::String::format("%s_%d.VQA", setName.c_str(), MIN(currentResourceId, 3)); } - if (!_vqaPlayer.open(vqaName)) + if (_vqaPlayer != nullptr) + delete _vqaPlayer; + + _vqaPlayer = new VQAPlayer(_vm); + + if (!_vqaPlayer->open(vqaName)) return false; - Common::String sceneName = _vm->_gameInfo->getSetName(sceneId); + Common::String sceneName = _vm->_gameInfo->getSceneName(sceneId); if (!_vm->_script->open(sceneName)) return false; @@ -124,20 +128,44 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) { // TODO: add all items to scene // TODO: calculate walking obstacles?? - // if (_playerWalkedIn) { // TODO: Not _playerWalkedIn - // _vm->_script->PlayerWalkedIn(); - // } + if (_specialLoopMode) { + _vm->_script->PlayerWalkedIn(); + } return true; } +bool Scene::close(bool isLoadingGame) { + bool result = true; + if (getSetId() == -1) { + return true; + } + + //_vm->_policeMaze->clear(!isLoadingGame); + if (isLoadingGame) { + _vm->_script->PlayerWalkedOut(); + } +// if (SceneScript_isLoaded() && !SceneScript_unload()) { +// result = false; +// } + if (_vqaPlayer != nullptr) { + //_vqaPlayer->stop(); + delete _vqaPlayer; + _vqaPlayer = nullptr; + } + _sceneId = -1; + _setId = -1; + + return result; +} + int Scene::advanceFrame(Graphics::Surface &surface, uint16 *&zBuffer) { - int frame = _vqaPlayer.update(); + int frame = _vqaPlayer->update(); if (frame >= 0) { - surface.copyFrom(*_vqaPlayer.getSurface()); - memcpy(zBuffer, _vqaPlayer.getZBuffer(), 640*480*2); - _vqaPlayer.updateView(_vm->_view); - _vqaPlayer.updateLights(_vm->_lights); + surface.copyFrom(*_vqaPlayer->getSurface()); + memcpy(zBuffer, _vqaPlayer->getZBuffer(), 640*480*2); + _vqaPlayer->updateView(_vm->_view); + _vqaPlayer->updateLights(_vm->_lights); } if (frame < 0) { @@ -145,12 +173,12 @@ int Scene::advanceFrame(Graphics::Surface &surface, uint16 *&zBuffer) { } _frame = frame; - if (_specialLoopMode == 0 && frame == _vqaPlayer.getLoopEndFrame(_specialLoop)) { + if (_specialLoopMode == 0 && frame == _vqaPlayer->getLoopEndFrame(_specialLoop)) { _playerWalkedIn = true; _specialLoopMode = -1; } if (_specialLoopMode == 0 && !_defaultLoopSet) { - _vqaPlayer.setLoop(_defaultLoop + 1); + _vqaPlayer->setLoop(_defaultLoop + 1); _defaultLoopSet = true; } diff --git a/engines/bladerunner/scene.h b/engines/bladerunner/scene.h index e4a2406eea7..6a34fcd2493 100644 --- a/engines/bladerunner/scene.h +++ b/engines/bladerunner/scene.h @@ -41,7 +41,7 @@ public: Set *_set; int _setId; int _sceneId; - VQAPlayer _vqaPlayer; + VQAPlayer *_vqaPlayer; int _defaultLoop; int _defaultLoopSet; @@ -69,7 +69,7 @@ public: _set(new Set(vm)), _setId(-1), _sceneId(-1), - _vqaPlayer(vm), + _vqaPlayer(nullptr), _defaultLoop(0), _nextSetId(-1), _nextSceneId(-1), @@ -83,9 +83,13 @@ public: delete _set; delete _regions; delete _exits; + if (_vqaPlayer != nullptr) { + delete _vqaPlayer; + } } bool open(int setId, int sceneId, bool isLoadingGame); + bool close(bool isLoadingGame); int advanceFrame(Graphics::Surface &surface, uint16 *&zBuffer); void setActorStart(Vector3 position, int facing); diff --git a/engines/bladerunner/settings.cpp b/engines/bladerunner/settings.cpp index 0c3a774a4fb..daf876c40bb 100644 --- a/engines/bladerunner/settings.cpp +++ b/engines/bladerunner/settings.cpp @@ -57,6 +57,9 @@ bool Settings::openNewScene() { if (_startingGame) { // Stop ambient audio and music +// ambient::removeAllNonLoopingSounds(Ambient, 1); +// ambient::removeAllLoopingSounds(Ambient, 1); +// music::stop(Music, 2); } int currentSet = _vm->_scene->_setId; @@ -65,7 +68,9 @@ bool Settings::openNewScene() { _newSet = -1; _newScene = -1; - + if (currentSet != -1) { + _vm->_scene->close(!_loadingGame && !_startingGame); + } if (_chapterChanged) { if (_vm->_chapters->hasOpenResources()) _vm->_chapters->closeResources(); diff --git a/engines/bladerunner/vqa_player.cpp b/engines/bladerunner/vqa_player.cpp index 2c408066fdf..4d948fd2aca 100644 --- a/engines/bladerunner/vqa_player.cpp +++ b/engines/bladerunner/vqa_player.cpp @@ -65,7 +65,6 @@ int VQAPlayer::update() { queueAudioFrame(_decoder.decodeAudioFrame()); _surface = _decoder.decodeVideoFrame(); _zBuffer = _decoder.decodeZBuffer(); - //_view = _decoder.getView(); } _decodedFrame = calcNextFrame(_curFrame); @@ -89,7 +88,6 @@ int VQAPlayer::update() { if (_curFrame >= 0) { _surface = _decoder.decodeVideoFrame(); _zBuffer = _decoder.decodeZBuffer(); - //_view = _decoder.getView(); } _decodedFrame = calcNextFrame(_curFrame);