diff options
-rw-r--r-- | engines/bladerunner/actor.cpp | 2 | ||||
-rw-r--r-- | engines/bladerunner/bladerunner.cpp | 24 | ||||
-rw-r--r-- | engines/bladerunner/bladerunner.h | 6 | ||||
-rw-r--r-- | engines/bladerunner/item.cpp | 2 | ||||
-rw-r--r-- | engines/bladerunner/item_pickup.cpp | 2 | ||||
-rw-r--r-- | engines/bladerunner/outtake.cpp | 5 | ||||
-rw-r--r-- | engines/bladerunner/scene.cpp | 8 | ||||
-rw-r--r-- | engines/bladerunner/scene.h | 2 | ||||
-rw-r--r-- | engines/bladerunner/vqa_decoder.cpp | 28 | ||||
-rw-r--r-- | engines/bladerunner/vqa_decoder.h | 10 | ||||
-rw-r--r-- | engines/bladerunner/vqa_player.cpp | 9 | ||||
-rw-r--r-- | engines/bladerunner/vqa_player.h | 8 |
12 files changed, 46 insertions, 60 deletions
diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp index 49a66d9ef6..6265a0480a 100644 --- a/engines/bladerunner/actor.cpp +++ b/engines/bladerunner/actor.cpp @@ -672,7 +672,7 @@ bool Actor::draw(Common::Rect *screenRect) { // TODO: Handle SHORTY mode - _vm->_sliceRenderer->drawInWorld(_animationId, _animationFrame, drawPosition, drawAngle, drawScale, _vm->_surface2, _vm->_zbuffer->getData()); + _vm->_sliceRenderer->drawInWorld(_animationId, _animationFrame, drawPosition, drawAngle, drawScale, _vm->_surfaceGame, _vm->_zbuffer->getData()); _vm->_sliceRenderer->getScreenRectangle(screenRect, _animationId, _animationFrame, drawPosition, drawAngle, drawScale); return !screenRect->isEmpty(); diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp index 17e117baaf..83a07bbd69 100644 --- a/engines/bladerunner/bladerunner.cpp +++ b/engines/bladerunner/bladerunner.cpp @@ -110,9 +110,6 @@ BladeRunnerEngine::~BladeRunnerEngine() { // delete _audioPlayer; // delete _ambientSounds; - // _surface1.free(); - // _surface2.free(); - delete _zbuffer; delete _itemPickup; @@ -154,7 +151,9 @@ Common::Error BladeRunnerEngine::run() { bool BladeRunnerEngine::startup(bool hasSavegames) { bool r; - _surface1.create(640, 480, createRGB555()); + _surfaceGame.create(640, 480, createRGB555()); + _surfaceInterface.create(640, 480, createRGB555()); + _surface4.create(640, 480, createRGB555()); r = openArchive("STARTUP.MIX"); if (!r) @@ -506,8 +505,9 @@ void BladeRunnerEngine::shutdown() { _gameInfo = nullptr; // TODO: Delete graphics surfaces here - _surface1.free(); - _surface2.free(); + _surface4.free(); + _surfaceInterface.free(); + _surfaceGame.free(); if (isArchiveOpen("STARTUP.MIX")) closeArchive("STARTUP.MIX"); @@ -522,9 +522,9 @@ bool BladeRunnerEngine::loadSplash() { if (!img.open("SPLASH.IMG")) return false; - img.copyToSurface(&_surface1); + img.copyToSurface(&_surfaceGame); - _system->copyRectToScreen(_surface1.getPixels(), _surface1.pitch, 0, 0, _surface1.w, _surface1.h); + _system->copyRectToScreen(_surfaceGame.getPixels(), _surfaceGame.pitch, 0, 0, _surfaceGame.w, _surfaceGame.h); _system->updateScreen(); return true; @@ -598,13 +598,13 @@ void BladeRunnerEngine::gameTick() { _ambientSounds->tick(); bool backgroundChanged = false; - int frame = _scene->advanceFrame(_surface1); + int frame = _scene->advanceFrame(); if (frame >= 0) { _sceneScript->SceneFrameAdvanced(frame); backgroundChanged = true; } (void)backgroundChanged; - _surface2.copyFrom(_surface1); + _surfaceGame.copyRectToSurface(_surfaceInterface.getPixels(), _surfaceInterface.pitch, 0, 0, 640, 480); // TODO: remove zbuffer draw //_surface2.copyRectToSurface(_zbuffer->getData(), 1280, 0, 0, 640, 480); @@ -638,7 +638,7 @@ void BladeRunnerEngine::gameTick() { Common::Point p = _eventMan->getMousePos(); _mouse->tick(p.x, p.y); - _mouse->draw(_surface2, p.x, p.y); + _mouse->draw(_surfaceGame, p.x, p.y); // TODO: Process AUD // TODO: Footstep sound @@ -762,7 +762,7 @@ void BladeRunnerEngine::gameTick() { } #endif - _system->copyRectToScreen((const byte *)_surface2.getBasePtr(0, 0), _surface2.pitch, 0, 0, 640, 480); + _system->copyRectToScreen(_surfaceGame.getPixels(), _surfaceGame.pitch, 0, 0, 640, 480); _system->updateScreen(); _system->delayMillis(10); } diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h index 3b0359be2e..b2e3df08ea 100644 --- a/engines/bladerunner/bladerunner.h +++ b/engines/bladerunner/bladerunner.h @@ -125,8 +125,10 @@ public: int in_script_counter; - Graphics::Surface _surface1; - Graphics::Surface _surface2; + Graphics::Surface _surfaceGame; + Graphics::Surface _surfaceInterface; + Graphics::Surface _surface4; + ZBuffer *_zbuffer; Common::RandomSource _rnd; diff --git a/engines/bladerunner/item.cpp b/engines/bladerunner/item.cpp index 3ad2868c51..0b84aae30c 100644 --- a/engines/bladerunner/item.cpp +++ b/engines/bladerunner/item.cpp @@ -86,7 +86,7 @@ bool Item::tick(Common::Rect *screenRect, bool special) { Vector3 position(_position.x, -_position.z, _position.y); int animationId = _animationId + (special ? 1 : 0); - _vm->_sliceRenderer->drawInWorld(animationId, 0, position, M_PI - _angle, 1.0f, _vm->_surface2, _vm->_zbuffer->getData()); + _vm->_sliceRenderer->drawInWorld(animationId, 0, position, M_PI - _angle, 1.0f, _vm->_surfaceGame, _vm->_zbuffer->getData()); _vm->_sliceRenderer->getScreenRectangle(&_screenRectangle, animationId, 0, position, M_PI - _angle, 1.0f); if (!_screenRectangle.isEmpty()) { diff --git a/engines/bladerunner/item_pickup.cpp b/engines/bladerunner/item_pickup.cpp index 7549c8db01..b1f557d344 100644 --- a/engines/bladerunner/item_pickup.cpp +++ b/engines/bladerunner/item_pickup.cpp @@ -104,6 +104,6 @@ void ItemPickup::draw() { return; } - _vm->_sliceRenderer->drawOnScreen(_animationId, _animationFrame, _screenX, _screenY, _facing, _scale, _vm->_surface2, _vm->_zbuffer->getData()); + _vm->_sliceRenderer->drawOnScreen(_animationId, _animationFrame, _screenX, _screenY, _facing, _scale, _vm->_surfaceGame, _vm->_zbuffer->getData()); } } // End of namespace BladeRunner diff --git a/engines/bladerunner/outtake.cpp b/engines/bladerunner/outtake.cpp index b81b212f52..80e4d78a1a 100644 --- a/engines/bladerunner/outtake.cpp +++ b/engines/bladerunner/outtake.cpp @@ -43,7 +43,7 @@ void OuttakePlayer::play(const Common::String &name, bool noLocalization, int co else resName = name + "_E.VQA"; - VQAPlayer vqa_player(_vm); + VQAPlayer vqa_player(_vm, &_vm->_surfaceGame); vqa_player.open(resName); @@ -59,8 +59,7 @@ void OuttakePlayer::play(const Common::String &name, bool noLocalization, int co break; if (frame >= 0) { - const Graphics::Surface *surface = vqa_player.getSurface(); - _vm->_system->copyRectToScreen((const byte *)surface->getBasePtr(0, 0), surface->pitch, 0, 0, 640, 480); + _vm->_system->copyRectToScreen(_vm->_surfaceGame.getPixels(), _vm->_surfaceGame.pitch, 0, 0, 640, 480); _vm->_system->updateScreen(); } diff --git a/engines/bladerunner/scene.cpp b/engines/bladerunner/scene.cpp index be5be7cc67..4af2c15d08 100644 --- a/engines/bladerunner/scene.cpp +++ b/engines/bladerunner/scene.cpp @@ -75,7 +75,7 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) { if (_vqaPlayer != nullptr) delete _vqaPlayer; - _vqaPlayer = new VQAPlayer(_vm); + _vqaPlayer = new VQAPlayer(_vm, &_vm->_surfaceInterface); Common::String sceneName = _vm->_gameInfo->getSceneName(sceneId); if (!_vm->_sceneScript->Open(sceneName)) @@ -105,7 +105,7 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) { _defaultLoopSet = true; _specialLoopAtEnd = false; } - _vm->_scene->advanceFrame(_vm->_surface1); + _vm->_scene->advanceFrame(); _vm->_playerActor->setAtXYZ(_actorStartPosition, _actorStartFacing); _vm->_playerActor->setSetId(setId); @@ -168,10 +168,10 @@ bool Scene::close(bool isLoadingGame) { return result; } -int Scene::advanceFrame(Graphics::Surface &surface) { +int Scene::advanceFrame() { int frame = _vqaPlayer->update(); if (frame >= 0) { - surface.copyFrom(*_vqaPlayer->getSurface()); + _vm->_surfaceGame.copyRectToSurface(_vm->_surfaceInterface.getPixels(), _vm->_surfaceInterface.pitch, 0, 0, 640, 480); _vqaPlayer->updateZBuffer(_vm->_zbuffer); _vqaPlayer->updateView(_vm->_view); _vqaPlayer->updateLights(_vm->_lights); diff --git a/engines/bladerunner/scene.h b/engines/bladerunner/scene.h index 90cb936bf8..c90258ce53 100644 --- a/engines/bladerunner/scene.h +++ b/engines/bladerunner/scene.h @@ -89,7 +89,7 @@ public: bool open(int setId, int sceneId, bool isLoadingGame); bool close(bool isLoadingGame); - int advanceFrame(Graphics::Surface &surface); + int advanceFrame(); void setActorStart(Vector3 position, int facing); void loopSetDefault(int a); diff --git a/engines/bladerunner/vqa_decoder.cpp b/engines/bladerunner/vqa_decoder.cpp index 01ccfd5874..c43e4c3f9d 100644 --- a/engines/bladerunner/vqa_decoder.cpp +++ b/engines/bladerunner/vqa_decoder.cpp @@ -115,7 +115,9 @@ const char *strTag(uint32 tag) { return s; } -VQADecoder::VQADecoder() : _s(nullptr), +VQADecoder::VQADecoder(Graphics::Surface *surface) : + _s(nullptr), + _surface(surface), _frameInfo(nullptr), _videoTrack(nullptr), _audioTrack(nullptr), @@ -173,7 +175,7 @@ bool VQADecoder::loadStream(Common::SeekableReadStream *s) { } } while (chd.id != kFINF); - _videoTrack = new VQAVideoTrack(this); + _videoTrack = new VQAVideoTrack(this, _surface); _audioTrack = new VQAAudioTrack(this); #if 0 @@ -188,8 +190,8 @@ bool VQADecoder::loadStream(Common::SeekableReadStream *s) { return true; } -const Graphics::Surface *VQADecoder::decodeVideoFrame() { - return _videoTrack->decodeVideoFrame(); +void VQADecoder::decodeVideoFrame() { + _videoTrack->decodeVideoFrame(); } void VQADecoder::decodeZBuffer(ZBuffer *zbuffer) { @@ -533,10 +535,10 @@ bool VQADecoder::readMFCI(Common::SeekableReadStream *s, uint32 size) { return true; } -VQADecoder::VQAVideoTrack::VQAVideoTrack(VQADecoder *vqaDecoder) { +VQADecoder::VQAVideoTrack::VQAVideoTrack(VQADecoder *vqaDecoder, Graphics::Surface *surface) { VQADecoder::Header *header = &vqaDecoder->_header; - _surface = nullptr; + _surface = surface; _hasNewFrame = false; _numFrames = header->numFrames; @@ -565,9 +567,6 @@ VQADecoder::VQAVideoTrack::VQAVideoTrack(VQADecoder *vqaDecoder) { _zbufChunk = new uint8[roundup(_maxZBUFChunkSize)]; - _surface = new Graphics::Surface(); - _surface->create(_width, _height, createRGB555()); - _viewData = nullptr; _lightsData = nullptr; } @@ -578,10 +577,6 @@ VQADecoder::VQAVideoTrack::~VQAVideoTrack() { delete[] _zbufChunk; delete[] _vpointer; - if (_surface) - _surface->free(); - delete _surface; - if (_viewData) delete[] _viewData; if (_lightsData) @@ -596,10 +591,6 @@ uint16 VQADecoder::VQAVideoTrack::getHeight() const { return _height; } -Graphics::PixelFormat VQADecoder::VQAVideoTrack::getPixelFormat() const { - return _surface->format; -} - int VQADecoder::VQAVideoTrack::getCurFrame() const { return _curFrame; } @@ -612,13 +603,12 @@ Common::Rational VQADecoder::VQAVideoTrack::getFrameRate() const { return _frameRate; } -const Graphics::Surface *VQADecoder::VQAVideoTrack::decodeVideoFrame() { +void VQADecoder::VQAVideoTrack::decodeVideoFrame() { if (_hasNewFrame) { decodeFrame((uint16*)_surface->getPixels()); _curFrame++; _hasNewFrame = false; } - return _surface; } bool VQADecoder::VQAVideoTrack::readVQFL(Common::SeekableReadStream *s, uint32 size) { diff --git a/engines/bladerunner/vqa_decoder.h b/engines/bladerunner/vqa_decoder.h index a808543bec..d7086d1b9f 100644 --- a/engines/bladerunner/vqa_decoder.h +++ b/engines/bladerunner/vqa_decoder.h @@ -44,14 +44,14 @@ class ZBuffer; class VQADecoder { public: - VQADecoder(); + VQADecoder(Graphics::Surface *surface); ~VQADecoder(); bool loadStream(Common::SeekableReadStream *s); void readFrame(int frame, int skipFlags); - const Graphics::Surface *decodeVideoFrame(); + void decodeVideoFrame(); void decodeZBuffer(ZBuffer *zbuffer); Audio::SeekableAudioStream *decodeAudioFrame(); void decodeView(View *view); @@ -126,6 +126,7 @@ private: class VQAAudioTrack; Common::SeekableReadStream *_s; + Graphics::Surface *_surface; Header _header; LoopInfo _loopInfo; @@ -153,15 +154,14 @@ private: class VQAVideoTrack { public: - VQAVideoTrack(VQADecoder *vqaDecoder); + VQAVideoTrack(VQADecoder *vqaDecoder, Graphics::Surface *surface); ~VQAVideoTrack(); uint16 getWidth() const; uint16 getHeight() const; - Graphics::PixelFormat getPixelFormat() const; int getCurFrame() const; int getFrameCount() const; - const Graphics::Surface *decodeVideoFrame(); + void decodeVideoFrame(); void decodeZBuffer(ZBuffer *zbuffer); void decodeView(View *view); void decodeLights(Lights *lights); diff --git a/engines/bladerunner/vqa_player.cpp b/engines/bladerunner/vqa_player.cpp index 845e2ee1a7..129bb77b0e 100644 --- a/engines/bladerunner/vqa_player.cpp +++ b/engines/bladerunner/vqa_player.cpp @@ -99,7 +99,7 @@ int VQAPlayer::update() { _callbackLoopEnded(_callbackData, 0, _loop); } } - _surface = nullptr; + return -1; } @@ -114,7 +114,7 @@ int VQAPlayer::update() { if (now >= _frameNextTime) { int frame = _frameNext; _decoder.readFrame(_frameNext, 0x2); - _surface = _decoder.decodeVideoFrame(); + _decoder.decodeVideoFrame(); if (_hasAudio) { if (!_audioStarted) { @@ -142,14 +142,9 @@ int VQAPlayer::update() { return frame; } - _surface = nullptr; return -1; } -const Graphics::Surface *VQAPlayer::getSurface() const { - return _surface; -} - void VQAPlayer::updateZBuffer(ZBuffer *zbuffer) { _decoder.decodeZBuffer(zbuffer); } diff --git a/engines/bladerunner/vqa_player.h b/engines/bladerunner/vqa_player.h index 8c2653ec85..b60f648d4d 100644 --- a/engines/bladerunner/vqa_player.h +++ b/engines/bladerunner/vqa_player.h @@ -48,8 +48,8 @@ class ZBuffer; class VQAPlayer { BladeRunnerEngine *_vm; Common::SeekableReadStream *_s; - VQADecoder _decoder; const Graphics::Surface *_surface; + VQADecoder _decoder; const uint16 *_zBuffer; Audio::QueuingAudioStream *_audioStream; @@ -75,10 +75,11 @@ class VQAPlayer { public: - VQAPlayer(BladeRunnerEngine *vm) + VQAPlayer(BladeRunnerEngine *vm, Graphics::Surface *surface) : _vm(vm), _s(nullptr), - _surface(nullptr), + _surface(surface), + _decoder(surface), _zBuffer(nullptr), _audioStream(nullptr), _frameNext(-1), @@ -104,7 +105,6 @@ public: void close(); int update(); - const Graphics::Surface *getSurface() const; void updateZBuffer(ZBuffer *zbuffer); void updateView(View *view); void updateLights(Lights *lights); |