aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Fach-Pedersen2017-07-30 22:34:21 +0200
committerThomas Fach-Pedersen2017-07-31 00:15:33 +0200
commitd3e64544b3065273aa72f2066edf74bc6f71e86a (patch)
treeeaee770e25197a468b1a569bf36de8b6d42ecc1e
parent9c6dd7113f406478a7deb1e674080a2d2f4f7b6b (diff)
downloadscummvm-rg350-d3e64544b3065273aa72f2066edf74bc6f71e86a.tar.gz
scummvm-rg350-d3e64544b3065273aa72f2066edf74bc6f71e86a.tar.bz2
scummvm-rg350-d3e64544b3065273aa72f2066edf74bc6f71e86a.zip
BLADERUNNER: Move surfaces out of VQA player
Rename the surfaces to more meaningful names and move ownership out of the VQA classes. This means that the VQA classes no longer create their own internal surfaces but instead draw on externally provided surfaces.
-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);