aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/bladerunner/actor.cpp2
-rw-r--r--engines/bladerunner/bladerunner.cpp24
-rw-r--r--engines/bladerunner/bladerunner.h6
-rw-r--r--engines/bladerunner/item.cpp2
-rw-r--r--engines/bladerunner/item_pickup.cpp2
-rw-r--r--engines/bladerunner/outtake.cpp5
-rw-r--r--engines/bladerunner/scene.cpp8
-rw-r--r--engines/bladerunner/scene.h2
-rw-r--r--engines/bladerunner/vqa_decoder.cpp28
-rw-r--r--engines/bladerunner/vqa_decoder.h10
-rw-r--r--engines/bladerunner/vqa_player.cpp9
-rw-r--r--engines/bladerunner/vqa_player.h8
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);