aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/bladerunner/actor.cpp28
-rw-r--r--engines/bladerunner/actor.h20
-rw-r--r--engines/bladerunner/actor_clues.cpp181
-rw-r--r--engines/bladerunner/actor_clues.h82
-rw-r--r--engines/bladerunner/actor_walk.cpp8
-rw-r--r--engines/bladerunner/actor_walk.h52
-rw-r--r--engines/bladerunner/audio_player.cpp2
-rw-r--r--engines/bladerunner/bladerunner.cpp16
-rw-r--r--engines/bladerunner/bladerunner.h8
-rw-r--r--engines/bladerunner/boundingbox.cpp19
-rw-r--r--engines/bladerunner/boundingbox.h4
-rw-r--r--engines/bladerunner/color.h37
-rw-r--r--engines/bladerunner/fog.cpp94
-rw-r--r--engines/bladerunner/fog.h104
-rw-r--r--engines/bladerunner/light.cpp84
-rw-r--r--engines/bladerunner/light.h104
-rw-r--r--engines/bladerunner/lights.cpp100
-rw-r--r--engines/bladerunner/lights.h64
-rw-r--r--engines/bladerunner/movement_track.cpp124
-rw-r--r--engines/bladerunner/movement_track.h70
-rw-r--r--engines/bladerunner/outtake.cpp2
-rw-r--r--engines/bladerunner/scene.cpp45
-rw-r--r--engines/bladerunner/scene.h5
-rw-r--r--engines/bladerunner/scene_objects.cpp188
-rw-r--r--engines/bladerunner/scene_objects.h96
-rw-r--r--engines/bladerunner/set.cpp24
-rw-r--r--engines/bladerunner/set.h24
-rw-r--r--engines/bladerunner/set_effects.cpp83
-rw-r--r--engines/bladerunner/set_effects.h62
-rw-r--r--engines/bladerunner/slice_renderer.cpp34
-rw-r--r--engines/bladerunner/slice_renderer.h18
-rw-r--r--engines/bladerunner/view.cpp5
-rw-r--r--engines/bladerunner/view.h7
-rw-r--r--engines/bladerunner/vqa_decoder.cpp26
-rw-r--r--engines/bladerunner/vqa_decoder.h8
-rw-r--r--engines/bladerunner/vqa_player.cpp4
-rw-r--r--engines/bladerunner/vqa_player.h10
37 files changed, 1780 insertions, 62 deletions
diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp
index f483263f76..af9cef7258 100644
--- a/engines/bladerunner/actor.cpp
+++ b/engines/bladerunner/actor.cpp
@@ -38,7 +38,7 @@ Actor::Actor(BladeRunnerEngine *vm, int actorId) {
_bbox = new BoundingBox();
- // TODO: Construct _clues ((actorId && actor != 99) ? 2 : 4)
+ _clues = new ActorClues(vm, ((actorId && actorId != 99) ? 2 : 4));
// TODO: Construct _movementTrack
@@ -69,6 +69,8 @@ void Actor::setup(int actorId) {
_isTargetable = false;
_isInvisible = false;
_isImmuneToObstacles = false;
+
+ _isRetired = false;
_width = 0;
_height = 0;
@@ -105,11 +107,35 @@ void Actor::setup(int actorId) {
void Actor::set_at_xyz(Vector3 pos, int facing) {
_position = pos;
_facing = facing;
+
+
+// this->x = x;
+// this->y = y;
+// this->z = z;
+// actor::set_angle(this, angle, addOrSet);
+// if (scene::get_sceneId(Scene) == this->sceneId)
+// this->walkboxId = set::findWalkbox(Scene->set, x, z);
+// else
+// this->walkboxId = -1;
+// actor::setBoundingBox(this, x, y, z, retired);
+// sceneObjects::removeScreneObject(SceneObjects, this->id);
+// scene = this->sceneId;
+// if (scene == scene::get_sceneId(Scene))
+// sceneObjects::addActor(
+// SceneObjects,
+// this->id,
+// this->boundingBox,
+// &this->screenRect,
+// 1,
+// a7,
+// this->targetable,
+// retired);
}
void Actor::draw() {
Vector3 draw_position(_position.x, -_position.z, _position.y + 2.0);
float draw_facing = _facing * M_PI / 512.0;
+ // just for viewing animations _facing = (_facing + 10) % 1024;
// float draw_scale = _scale;
// TODO: Handle SHORTY mode
diff --git a/engines/bladerunner/actor.h b/engines/bladerunner/actor.h
index b51bc3fefb..d621d5316a 100644
--- a/engines/bladerunner/actor.h
+++ b/engines/bladerunner/actor.h
@@ -26,6 +26,11 @@
#include "bladerunner/bladerunner.h"
#include "bladerunner/vector.h"
+#include "bladerunner/movement_track.h"
+#include "bladerunner/actor_clues.h"
+#include "bladerunner/actor_walk.h"
+
+#include "common/rect.h"
namespace BladeRunner {
@@ -37,7 +42,8 @@ class Actor {
private:
BoundingBox *_bbox;
- // MovementTrack *_movementTrack;
+ Common::Rect _screenRectangle;
+ MovementTrack *_movementTrack;
int _honesty;
int _intelligence;
@@ -49,7 +55,7 @@ private:
int _currentHP;
int _maxHP;
- // Clues _clues;
+ ActorClues* _clues;
int _id;
int _set;
@@ -62,6 +68,8 @@ private:
bool _isInvisible;
bool _isImmuneToObstacles;
+ bool _isRetired;
+
// Animation
int _width;
int _height;
@@ -71,7 +79,7 @@ private:
int _animationId;
int _animationFrame;
- // WalkInfo _walkInfo;
+ ActorWalk* _walkInfo;
int _timersRemain[7];
int _timersBegan[7];
@@ -87,6 +95,12 @@ public:
void set_at_xyz(Vector3 pos, int facing);
void draw();
+
+ int getSet() { return _set; }
+ BoundingBox* getBoundingBox() { return _bbox; }
+ Common::Rect* getScreenRectangle() { return &_screenRectangle; }
+ bool isRetired() { return _isRetired; }
+ bool isTargetable() { return _isTargetable; }
};
} // End of namespace BladeRunner
diff --git a/engines/bladerunner/actor_clues.cpp b/engines/bladerunner/actor_clues.cpp
new file mode 100644
index 0000000000..f99b6b1d61
--- /dev/null
+++ b/engines/bladerunner/actor_clues.cpp
@@ -0,0 +1,181 @@
+#include "bladerunner/actor_clues.h"
+
+namespace BladeRunner
+{
+
+ ActorClues::ActorClues(BladeRunnerEngine *vm, int cluesType)
+ {
+ _vm = vm;
+ _count = 0;
+ _maxCount = 0;
+ _clues = 0;
+ switch (cluesType)
+ {
+ case 4:
+ _maxCount = _vm->_gameInfo->getClueCount();
+ break;
+ case 3:
+ _maxCount = 100;
+ break;
+ case 2:
+ _maxCount = 50;
+ break;
+ case 1:
+ _maxCount = 25;
+ break;
+ case 0:
+ _maxCount = 0;
+ break;
+ default:
+ return;
+ }
+
+ if (_maxCount > 0)
+ _clues = new ActorClue[_maxCount];
+ else
+ _clues = NULL;
+
+ if (_clues)
+ removeAll();
+ else
+ _maxCount = NULL;
+ }
+
+ ActorClues::~ActorClues()
+ {
+ if (_clues)
+ delete[] _clues;
+
+ _maxCount = 0;
+ _count = 0;
+ }
+
+ void ActorClues::acquire(int clueId, char flag2, int fromActorId)
+ {
+ int clueIndex = findClueIndex(clueId);
+ _clues[clueIndex]._flags |= 0x01;
+ _clues[_count]._flags = _clues[_count]._flags & 0xFD | ((flag2 << 1) & 0x02);
+ _clues[clueIndex]._fromActorId = fromActorId;
+ }
+
+ void ActorClues::lose(int clueId)
+ {
+ int clueIndex = findClueIndex(clueId);
+ _clues[clueIndex]._flags = 0;
+ }
+
+ int ActorClues::isAcquired(int clueId)
+ {
+ int clueIndex = findClueIndex(clueId);
+ if (clueIndex == -1)
+ return 0;
+
+ return _clues[clueIndex]._flags & 0x01;
+ }
+
+ int ActorClues::getFromActorId(int clueId)
+ {
+ int clueIndex = findClueIndex(clueId);
+ if (clueIndex == -1)
+ return -1;
+
+ return _clues[clueIndex]._fromActorId;
+ }
+
+ int ActorClues::isFlag2(int clueId)
+ {
+ int clueIndex = findClueIndex(clueId);
+ if (clueIndex == -1)
+ return 0;
+
+ return (_clues[clueIndex]._flags & 0x02) >> 1;
+ }
+
+ int ActorClues::isFlag3(int clueId)
+ {
+ int clueIndex = findClueIndex(clueId);
+ if (clueIndex == -1)
+ return 0;
+
+ return (_clues[clueIndex]._flags & 0x04) >> 2;
+ }
+
+ int ActorClues::isFlag4(int clueId)
+ {
+ int clueIndex = findClueIndex(clueId);
+ if (clueIndex == -1)
+ return 0;
+
+ return (_clues[clueIndex]._flags & 0x08) >> 3;
+ }
+
+ int ActorClues::getField1(int clueId)
+ {
+ if (!_count)
+ return 0;
+
+ int clueIndex = findClueIndex(clueId);
+ if (clueIndex == -1)
+ return 0;
+
+ return _clues[clueIndex]._field1;
+ }
+
+ int ActorClues::getCount()
+ {
+ return _count;
+ }
+
+ void ActorClues::removeAll()
+ {
+ _count = 0;
+ for (int i = 0; i < _maxCount; ++i) {
+ remove(i);
+ }
+ }
+
+ int ActorClues::findClueIndex(int clueId)
+ {
+ for (int i = 0; i < _count; i++) {
+ if (clueId == _clues[i]._clueId) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ void ActorClues::add(int actorId, int clueId, int field1, char acquired, char flag2, int fromActorId)
+ {
+ _clues[_count]._clueId = clueId;
+ _clues[_count]._field1 = field1;
+
+ _clues[_count]._flags = 0;
+ _clues[_count]._flags = _clues[_count]._flags & 0xFE | (acquired & 0x01);
+ _clues[_count]._flags = _clues[_count]._flags & 0xFD | ((flag2 << 1) & 0x02);
+
+ _clues[_count]._fromActorId = fromActorId;
+ ++_count;
+ }
+
+ void ActorClues::remove(int index)
+ {
+ _clues[index]._clueId = -1;
+ _clues[index]._field1 = 0;
+ _clues[index]._flags = 0;
+ _clues[index]._fromActorId = -1;
+
+ _clues[index]._field3 = -1;
+ _clues[index]._field4 = 0;
+ _clues[index]._field5 = -1;
+ _clues[index]._field6 = 0;
+ _clues[index]._field7 = -1;
+ _clues[index]._field8 = 0;
+ }
+
+ int ActorClues::exists(int clueId)
+ {
+ return findClueIndex(clueId) != -1;
+ }
+
+
+} \ No newline at end of file
diff --git a/engines/bladerunner/actor_clues.h b/engines/bladerunner/actor_clues.h
new file mode 100644
index 0000000000..02d6bbb1ca
--- /dev/null
+++ b/engines/bladerunner/actor_clues.h
@@ -0,0 +1,82 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef BLADERUNNER_ACTOR_CLUES_H
+#define BLADERUNNER_ACTOR_CLUES_H
+
+#include "bladerunner/bladerunner.h"
+
+#include "bladerunner/gameinfo.h"
+
+namespace BladeRunner {
+
+ struct ActorClue
+ {
+ int _clueId;
+ int _field1;
+ int _fromActorId;
+ int _field3;
+ int _field4;
+ int _field5;
+ int _field6;
+ int _field7;
+ int _field8;
+ unsigned char _flags;
+ };
+
+ class ActorClues
+ {
+ BladeRunnerEngine *_vm;
+
+ private:
+ int _count;
+ int _maxCount;
+ ActorClue *_clues;
+
+ public:
+ ActorClues(BladeRunnerEngine *_vm, int cluesType);
+ ~ActorClues();
+
+ void acquire(int clueId, char flag2, int fromActorId);
+ void lose(int clueId);
+ int isAcquired(int clueId);
+ int getFromActorId(int clueId);
+ int isFlag2(int clueId);
+ int isFlag3(int clueId);
+ int isFlag4(int clueId);
+ int getField1(int clueId);
+
+ int getCount();
+
+ void removeAll();
+
+ //savegame
+ //loadgame
+ private:
+ int findClueIndex(int clueId);
+ void add(int actorId, int clueId, int field1, char acquired, char flag2, int fromActorId);
+ void remove(int clueIndex);
+ int exists(int clueId);
+ };
+}
+
+#endif
diff --git a/engines/bladerunner/actor_walk.cpp b/engines/bladerunner/actor_walk.cpp
new file mode 100644
index 0000000000..a4cfad7fde
--- /dev/null
+++ b/engines/bladerunner/actor_walk.cpp
@@ -0,0 +1,8 @@
+#include "bladerunner/actor_walk.h"
+
+namespace BladeRunner
+{
+
+
+
+} \ No newline at end of file
diff --git a/engines/bladerunner/actor_walk.h b/engines/bladerunner/actor_walk.h
new file mode 100644
index 0000000000..c44c15bbe4
--- /dev/null
+++ b/engines/bladerunner/actor_walk.h
@@ -0,0 +1,52 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef BLADERUNNER_ACTOR_WALK_H
+#define BLADERUNNER_ACTOR_WALK_H
+
+#include "bladerunner/vector.h"
+
+namespace BladeRunner
+{
+ struct ActorWalkEntry
+ {
+ int _actorId;
+ int _present;
+ };
+
+ class ActorWalk
+ {
+ int _walking;
+ int _running;
+ Vector3 _wanted;
+ Vector3 _unknown;
+ Vector3 _start;
+ Vector3 _end;
+ int facing;
+ ActorWalkEntry _actors[20];
+ int _actorsCount;
+ int _field15;
+ int _status;
+ };
+}
+
+#endif
diff --git a/engines/bladerunner/audio_player.cpp b/engines/bladerunner/audio_player.cpp
index ecfc95aaa7..b8df01cd85 100644
--- a/engines/bladerunner/audio_player.cpp
+++ b/engines/bladerunner/audio_player.cpp
@@ -165,7 +165,7 @@ void AudioPlayer::fadeAndStopTrack(Track *track, int time)
int AudioPlayer::playAud(const Common::String &name, int volume, int panFrom, int panTo, int priority, byte flags) {
/* Find first available track or, alternatively, the lowest priority playing track */
- int trackId;
+ int trackId = -1;
Track *track = NULL;
int lowestPriority = 100;
Track *lowestPriorityTrack = NULL;
diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index ca83ac9a19..22199e6fd7 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -35,6 +35,7 @@
#include "bladerunner/mouse.h"
#include "bladerunner/outtake.h"
#include "bladerunner/scene.h"
+#include "bladerunner/scene_objects.h"
#include "bladerunner/script/init.h"
#include "bladerunner/script/script.h"
#include "bladerunner/settings.h"
@@ -65,6 +66,7 @@ BladeRunnerEngine::BladeRunnerEngine(OSystem *syst)
_script = new Script(this);
_settings = new Settings(this);
+ _lights = new Lights(this);
}
BladeRunnerEngine::~BladeRunnerEngine() {
@@ -87,7 +89,7 @@ BladeRunnerEngine::~BladeRunnerEngine() {
// delete[] _zBuffer1;
// delete[] _zBuffer2;
-
+ delete _lights;
delete _settings;
delete _script;
}
@@ -162,9 +164,9 @@ bool BladeRunnerEngine::startup(bool hasSavegames) {
// TODO: Sine and cosine lookup tables for intervals of 1.0, 4.0, and 12.0
- // TODO: View
+ _view = new View(this);
- // TODO: Screen Index
+ _sceneObjects = new SceneObjects(this, _view);
_gameFlags = new GameFlags();
_gameFlags->setFlagCount(_gameInfo->getFlagCount());
@@ -401,9 +403,11 @@ void BladeRunnerEngine::shutdown() {
delete _gameFlags;
_gameFlags = 0;
- // TODO: Delete View
+ delete _view;
+ _view = 0;
- // TODO: Delete Screen Index
+ delete _sceneObjects;
+ _sceneObjects = 0;
// TODO: Delete sine and cosine lookup tables
@@ -517,7 +521,7 @@ void BladeRunnerEngine::gameTick() {
// TODO: Tick and draw all actors in current set (drawing works in Replicant)
// HACK to draw McCoy
- _sliceRenderer->setView(_scene->_view);
+ //_sliceRenderer->setView(&_scene->_view);
_playerActor->draw();
// TODO: Draw items (drawing works in Replicant)
diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h
index d0ded00b76..814041d0ed 100644
--- a/engines/bladerunner/bladerunner.h
+++ b/engines/bladerunner/bladerunner.h
@@ -46,12 +46,16 @@ class GameInfo;
class GameFlags;
class Mouse;
class Scene;
+class SceneObjects;
class Script;
class Settings;
class Shape;
class SliceAnimations;
class SliceRenderer;
class TextResource;
+class Lights;
+class View;
+
class BladeRunnerEngine : public Engine {
public:
@@ -67,13 +71,17 @@ public:
GameFlags *_gameFlags;
GameInfo *_gameInfo;
Mouse *_mouse;
+ View *_view;
Scene *_scene;
+ SceneObjects *_sceneObjects;
Script *_script;
Settings *_settings;
SliceAnimations *_sliceAnimations;
SliceRenderer *_sliceRenderer;
int *_gameVars;
+ Lights *_lights;
+
TextResource *_textActorNames;
TextResource *_textCrimes;
TextResource *_textCluetype;
diff --git a/engines/bladerunner/boundingbox.cpp b/engines/bladerunner/boundingbox.cpp
index 10e529b1e3..fb2ae94813 100644
--- a/engines/bladerunner/boundingbox.cpp
+++ b/engines/bladerunner/boundingbox.cpp
@@ -34,4 +34,23 @@ BoundingBox::BoundingBox(float x0, float y0, float z0, float x1, float y1, float
_vertices[1].z = z1;
}
+void BoundingBox::expand(float x0, float y0, float z0, float x1, float y1, float z1)
+{
+ _vertices[0].x += x0;
+ _vertices[0].y += y0;
+ _vertices[0].z += z0;
+
+ _vertices[1].x += x1;
+ _vertices[1].y += y1;
+ _vertices[1].z += z1;
+}
+
+
+bool BoundingBox::isXYZInside(float x, float y, float z)
+{
+ return
+ x >= _vertices[0].x && x <= _vertices[1].x
+ && y >= _vertices[0].y && y <= _vertices[1].y
+ && z >= _vertices[0].z && z <= _vertices[1].z;
+}
} // End of namespace BladeRunner
diff --git a/engines/bladerunner/boundingbox.h b/engines/bladerunner/boundingbox.h
index 5dda3f0e3f..1766973f26 100644
--- a/engines/bladerunner/boundingbox.h
+++ b/engines/bladerunner/boundingbox.h
@@ -28,11 +28,15 @@
namespace BladeRunner {
class BoundingBox {
+public:
Vector3 _vertices[2];
public:
BoundingBox() {}
BoundingBox(float x0, float y0, float z0, float x1, float y1, float z1);
+
+ void expand(float x0, float y0, float z0, float x1, float y1, float z1);
+ bool isXYZInside(float x, float y, float z);
};
} // End of namespace BladeRunner
diff --git a/engines/bladerunner/color.h b/engines/bladerunner/color.h
new file mode 100644
index 0000000000..54983b401b
--- /dev/null
+++ b/engines/bladerunner/color.h
@@ -0,0 +1,37 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef BLADERUNNER_COLOR_H
+#define BLADERUNNER_COLOR_H
+
+namespace BladeRunner {
+
+ struct Color
+ {
+ float r;
+ float g;
+ float b;
+ };
+}
+
+
+#endif
diff --git a/engines/bladerunner/fog.cpp b/engines/bladerunner/fog.cpp
new file mode 100644
index 0000000000..5951ba8d1c
--- /dev/null
+++ b/engines/bladerunner/fog.cpp
@@ -0,0 +1,94 @@
+#include "bladerunner/fog.h"
+
+namespace BladeRunner
+{
+ Fog::Fog()
+ {
+ }
+
+ Fog::~Fog()
+ {
+ }
+
+ int Fog::readCommon(Common::ReadStream* stream)
+ {
+ int offset = stream->readUint32LE();
+ stream->read(_name, 20);
+ _fogColor.r = stream->readFloatLE();
+ _fogColor.g = stream->readFloatLE();
+ _fogColor.b = stream->readFloatLE();
+ _fogDensity = stream->readFloatLE();
+ return offset;
+ }
+
+
+ void Fog::readAnimationData(Common::ReadStream* stream, int size)
+ {
+ _animatedParameters = stream->readUint32LE();
+ _animationData = new float[size / sizeof(float)];
+ stream->read(_animationData, size);
+
+ _m11ptr = _animationData;
+ _m12ptr = _m11ptr + (_animatedParameters & 0x1 ? _framesCount : 1);
+ _m13ptr = _m12ptr + (_animatedParameters & 0x2 ? _framesCount : 1);
+ _m14ptr = _m13ptr + (_animatedParameters & 0x4 ? _framesCount : 1);
+ _m21ptr = _m14ptr + (_animatedParameters & 0x08 ? _framesCount : 1);
+ _m22ptr = _m21ptr + (_animatedParameters & 0x10 ? _framesCount : 1);
+ _m23ptr = _m22ptr + (_animatedParameters & 0x20 ? _framesCount : 1);
+ _m24ptr = _m23ptr + (_animatedParameters & 0x40 ? _framesCount : 1);
+ _m31ptr = _m24ptr + (_animatedParameters & 0x80 ? _framesCount : 1);
+ _m32ptr = _m31ptr + (_animatedParameters & 0x100 ? _framesCount : 1);
+ _m33ptr = _m32ptr + (_animatedParameters & 0x200 ? _framesCount : 1);
+ _m34ptr = _m33ptr + (_animatedParameters & 0x400 ? _framesCount : 1);
+
+ setupFrame(0);
+ }
+
+ void Fog::reset()
+ {
+ }
+
+ void Fog::setupFrame(int frame)
+ {
+ int offset = frame % _framesCount;
+ _matrix._m[0][0] = (_animatedParameters & 0x1 ? _m11ptr[offset] : *_m11ptr);
+ _matrix._m[0][1] = (_animatedParameters & 0x2 ? _m12ptr[offset] : *_m12ptr);
+ _matrix._m[0][2] = (_animatedParameters & 0x4 ? _m13ptr[offset] : *_m13ptr);
+ _matrix._m[0][3] = (_animatedParameters & 0x8 ? _m14ptr[offset] : *_m14ptr);
+ _matrix._m[1][0] = (_animatedParameters & 0x10 ? _m21ptr[offset] : *_m21ptr);
+ _matrix._m[1][1] = (_animatedParameters & 0x20 ? _m22ptr[offset] : *_m22ptr);
+ _matrix._m[1][2] = (_animatedParameters & 0x40 ? _m23ptr[offset] : *_m23ptr);
+ _matrix._m[1][3] = (_animatedParameters & 0x80 ? _m24ptr[offset] : *_m24ptr);
+ _matrix._m[2][0] = (_animatedParameters & 0x100 ? _m31ptr[offset] : *_m31ptr);
+ _matrix._m[2][1] = (_animatedParameters & 0x200 ? _m32ptr[offset] : *_m32ptr);
+ _matrix._m[2][2] = (_animatedParameters & 0x400 ? _m33ptr[offset] : *_m33ptr);
+ _matrix._m[2][3] = (_animatedParameters & 0x800 ? _m34ptr[offset] : *_m34ptr);
+ _inverted = invertMatrix(_matrix);
+ }
+
+ void FogCone::read(Common::ReadStream* stream, int framesCount)
+ {
+ _framesCount = framesCount;
+ int size = readCommon(stream);
+ _parameter1 = stream->readFloatLE();
+ readAnimationData(stream, size - 52);
+ }
+
+ void FogSphere::read(Common::ReadStream* stream, int framesCount)
+ {
+ _framesCount = framesCount;
+ int size = readCommon(stream);
+ _parameter1 = stream->readFloatLE();
+ readAnimationData(stream, size - 52);
+ }
+
+ void FogBox::read(Common::ReadStream* stream, int framesCount)
+ {
+ _framesCount = framesCount;
+ int size = readCommon(stream);
+ _parameter1 = stream->readFloatLE();
+ _parameter2 = stream->readFloatLE();
+ _parameter3 = stream->readFloatLE();
+ readAnimationData(stream, size - 60);
+ }
+} \ No newline at end of file
diff --git a/engines/bladerunner/fog.h b/engines/bladerunner/fog.h
new file mode 100644
index 0000000000..627e8f15bd
--- /dev/null
+++ b/engines/bladerunner/fog.h
@@ -0,0 +1,104 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef BLADERUNNER_FOG_H
+#define BLADERUNNER_FOG_H
+
+#include "bladerunner/bladerunner.h"
+#include "bladerunner/color.h"
+#include "bladerunner/matrix.h"
+
+#include "common/stream.h"
+
+
+namespace BladeRunner {
+
+ class SetEffects;
+
+ class Fog
+ {
+ friend class SetEffects;
+
+ protected:
+ char _name[20];
+ int _framesCount;
+ int _animatedParameters;
+ Matrix4x3 _matrix;
+ Matrix4x3 _inverted;
+ Color _fogColor;
+ float _fogDensity;
+ float *_animationData;
+ float *_m11ptr;
+ float *_m12ptr;
+ float *_m13ptr;
+ float *_m14ptr;
+ float *_m21ptr;
+ float *_m22ptr;
+ float *_m23ptr;
+ float *_m24ptr;
+ float *_m31ptr;
+ float *_m32ptr;
+ float *_m33ptr;
+ float *_m34ptr;
+
+ float _parameter1;
+ float _parameter2;
+ float _parameter3;
+
+ Fog *_next;
+
+ public:
+ Fog();
+ ~Fog();
+
+ virtual void read(Common::ReadStream *stream, int framesCount) = 0;
+
+ void reset();
+
+ void setupFrame(int frame);
+
+ private:
+ protected:
+ int readCommon(Common::ReadStream *stream);
+ void readAnimationData(Common::ReadStream *stream, int count);
+
+ };
+
+ class FogCone : public Fog
+ {
+ void read(Common::ReadStream *stream, int framesCount);
+ };
+
+ class FogSphere : public Fog
+ {
+ void read(Common::ReadStream *stream, int framesCount);
+ };
+
+ class FogBox : public Fog
+ {
+ void read(Common::ReadStream *stream, int framesCount);
+ };
+
+
+
+}
+#endif
diff --git a/engines/bladerunner/light.cpp b/engines/bladerunner/light.cpp
new file mode 100644
index 0000000000..6bc97f8392
--- /dev/null
+++ b/engines/bladerunner/light.cpp
@@ -0,0 +1,84 @@
+#include "bladerunner/light.h"
+
+namespace BladeRunner
+{
+ Light::Light()
+ {
+ }
+
+ Light::~Light()
+ {
+ }
+
+ void Light::read(Common::ReadStream* stream, int framesCount, int frame, int animated)
+ {
+ _framesCount = framesCount;
+ _animated = animated;
+
+ int size = stream->readUint32LE();
+ size = size - 32;
+
+ stream->read(_name, 20);
+
+ _animatedParameters = stream->readUint32LE();
+
+ _animationData = new float[size / sizeof(float)];
+ stream->read(_animationData, size);
+
+ _m11ptr = _animationData;
+ _m12ptr = _m11ptr + (_animatedParameters & 0x1 ? framesCount : 1);
+ _m13ptr = _m12ptr + (_animatedParameters & 0x2 ? framesCount : 1);
+ _m14ptr = _m13ptr + (_animatedParameters & 0x4 ? framesCount : 1);
+ _m21ptr = _m14ptr + (_animatedParameters & 0x8 ? framesCount : 1);
+ _m22ptr = _m21ptr + (_animatedParameters & 0x10 ? framesCount : 1);
+ _m23ptr = _m22ptr + (_animatedParameters & 0x20 ? framesCount : 1);
+ _m24ptr = _m23ptr + (_animatedParameters & 0x40 ? framesCount : 1);
+ _m31ptr = _m24ptr + (_animatedParameters & 0x80 ? framesCount : 1);
+ _m32ptr = _m31ptr + (_animatedParameters & 0x100 ? framesCount : 1);
+ _m33ptr = _m32ptr + (_animatedParameters & 0x200 ? framesCount : 1);
+ _m34ptr = _m33ptr + (_animatedParameters & 0x400 ? framesCount : 1);
+ _colorRPtr = _m34ptr + (_animatedParameters & 0x800 ? framesCount : 1);
+ _colorGPtr = _colorRPtr + (_animatedParameters & 0x1000 ? framesCount : 1);
+ _colorBPtr = _colorGPtr + (_animatedParameters & 0x2000 ? framesCount : 1);
+ _field16ptr = _colorGPtr + (_animatedParameters & 0x4000 ? framesCount : 1);
+ _field17ptr = _field16ptr + (_animatedParameters & 0x8000 ? framesCount : 1);
+ _field18ptr = _field17ptr + (_animatedParameters & 0x10000 ? framesCount : 1);
+ _field19ptr = _field18ptr + (_animatedParameters & 0x20000 ? framesCount : 1);
+
+ setupFrame(frame);
+ }
+
+ void Light::readVqa(Common::ReadStream* stream)
+ {
+ }
+
+ void Light::setupFrame(int frame)
+ {
+ int offset = frame % _framesCount;
+ _matrix._m[0][0] = (_animatedParameters & 0x1 ? _m11ptr[offset] : *_m11ptr);
+ _matrix._m[0][1] = (_animatedParameters & 0x2 ? _m12ptr[offset] : *_m12ptr);
+ _matrix._m[0][2] = (_animatedParameters & 0x4 ? _m13ptr[offset] : *_m13ptr);
+ _matrix._m[0][3] = (_animatedParameters & 0x8 ? _m14ptr[offset] : *_m14ptr);
+ _matrix._m[1][0] = (_animatedParameters & 0x10 ? _m21ptr[offset] : *_m21ptr);
+ _matrix._m[1][1] = (_animatedParameters & 0x20 ? _m22ptr[offset] : *_m22ptr);
+ _matrix._m[1][2] = (_animatedParameters & 0x40 ? _m23ptr[offset] : *_m23ptr);
+ _matrix._m[1][3] = (_animatedParameters & 0x80 ? _m24ptr[offset] : *_m24ptr);
+ _matrix._m[2][0] = (_animatedParameters & 0x100 ? _m31ptr[offset] : *_m31ptr);
+ _matrix._m[2][1] = (_animatedParameters & 0x200 ? _m32ptr[offset] : *_m32ptr);
+ _matrix._m[2][2] = (_animatedParameters & 0x400 ? _m33ptr[offset] : *_m33ptr);
+ _matrix._m[2][3] = (_animatedParameters & 0x800 ? _m34ptr[offset] : *_m34ptr);
+ _color.r = (_animatedParameters & 0x1000 ? _colorRPtr[offset] : *_colorRPtr);
+ _color.g = (_animatedParameters & 0x2000 ? _colorGPtr[offset] : *_colorGPtr);
+ _color.b = (_animatedParameters & 0x4000 ? _colorBPtr[offset] : *_colorBPtr);
+ _field16 = (_animatedParameters & 0x8000 ? _field16ptr[offset] : *_field16ptr);
+ _field17 = (_animatedParameters & 0x10000 ? _field17ptr[offset] : *_field17ptr);
+ _field18 = (_animatedParameters & 0x20000 ? _field18ptr[offset] : *_field18ptr);
+ _field19 = (_animatedParameters & 0x40000 ? _field19ptr[offset] : *_field19ptr);
+
+ }
+
+ float Light::attenuation(float min, float max, float distance)
+ {
+ return 0.0;
+ }
+} \ No newline at end of file
diff --git a/engines/bladerunner/light.h b/engines/bladerunner/light.h
new file mode 100644
index 0000000000..f4c142e4ab
--- /dev/null
+++ b/engines/bladerunner/light.h
@@ -0,0 +1,104 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef BLADERUNNER_LIGHT_H
+#define BLADERUNNER_LIGHT_H
+
+#include "bladerunner/matrix.h"
+#include "bladerunner/color.h"
+
+#include "common/stream.h"
+
+namespace Common{
+ class ReadStream;
+}
+
+namespace BladeRunner {
+ class Lights;
+
+ class Light
+ {
+ friend class Lights;
+ private:
+ char _name[20];
+ int _framesCount;
+ int _animated;
+ int _animatedParameters;
+ Matrix4x3 _matrix;
+ Color _color;
+ float _field16;
+ float _field17;
+ float _field18;
+ float _field19;
+ float *_animationData;
+ float *_m11ptr;
+ float *_m12ptr;
+ float *_m13ptr;
+ float *_m14ptr;
+ float *_m21ptr;
+ float *_m22ptr;
+ float *_m23ptr;
+ float *_m24ptr;
+ float *_m31ptr;
+ float *_m32ptr;
+ float *_m33ptr;
+ float *_m34ptr;
+ float *_colorRPtr;
+ float *_colorGPtr;
+ float *_colorBPtr;
+ float *_field16ptr;
+ float *_field17ptr;
+ float *_field18ptr;
+ float *_field19ptr;
+ Light *_next;
+ public:
+ Light();
+ ~Light();
+ void read(Common::ReadStream *stream, int framesCount, int frame, int animated);
+ void readVqa(Common::ReadStream *stream);
+
+ void setupFrame(int frame);
+ private:
+ static float attenuation(float min, float max, float distance);
+ };
+
+ class Light1 : public Light {
+
+ };
+
+ class Light2 : public Light {
+
+ };
+
+ class Light3 : public Light {
+
+ };
+
+ class Light4 : public Light {
+
+ };
+
+ class Light5 : public Light {
+
+ };
+}
+#endif
diff --git a/engines/bladerunner/lights.cpp b/engines/bladerunner/lights.cpp
new file mode 100644
index 0000000000..33ee3d1181
--- /dev/null
+++ b/engines/bladerunner/lights.cpp
@@ -0,0 +1,100 @@
+#include "bladerunner/lights.h"
+
+namespace BladeRunner {
+ Lights::Lights(BladeRunnerEngine *vm)
+ {
+ _vm = vm;
+
+ _ambientLightColor.r = 1.0;
+ _ambientLightColor.g = 0.0;
+ _ambientLightColor.b = 0.0;
+
+ _lights = NULL;
+ _frame = 0;
+ }
+
+ Lights::~Lights()
+ {
+ reset();
+ }
+
+ void Lights::read(Common::ReadStream* stream, int framesCount)
+ {
+ _ambientLightColor.r = stream->readFloatLE();
+ _ambientLightColor.g = stream->readFloatLE();
+ _ambientLightColor.b = stream->readFloatLE();
+
+ _lightsCount = stream->readUint32LE();
+ int i;
+ for (i = 0; i < _lightsCount; i++)
+ {
+ Light *light;
+ int type = stream->readUint32LE();
+ switch (type)
+ {
+ case 1:
+ light = new Light1();
+ break;
+ case 2:
+ light = new Light2();
+ break;
+ case 3:
+ light = new Light3();
+ break;
+ case 4:
+ light = new Light4();
+ break;
+ case 5:
+ light = new Light5();
+ break;
+ default:
+ light = new Light();
+ }
+
+ light->read(stream, framesCount, _frame, 0);
+ light->_next = _lights;
+ _lights = light;
+ }
+ }
+
+ void Lights::readVqa(Common::ReadStream* stream)
+ {
+ reset();
+ //int framesCount = stream->readUint32LE();
+ //int count = stream->readUint32LE();
+
+ }
+
+ void Lights::setupFrame(int frame)
+ {
+ Light *light;
+
+ if (frame == _frame)
+ return;
+
+ if (!_lights)
+ return;
+
+ for (light = _lights; light; light = light->_next)
+ {
+ light->setupFrame(frame);
+ }
+ }
+
+ void Lights::reset()
+ {
+ Light *light;
+ Light *nextLight;
+
+ if (!_lights)
+ return;
+
+ do
+ {
+ light = _lights;
+ nextLight = light->_next;
+ delete light;
+ _lights = nextLight;
+ } while (nextLight);
+ }
+} \ No newline at end of file
diff --git a/engines/bladerunner/lights.h b/engines/bladerunner/lights.h
new file mode 100644
index 0000000000..d6ff7f5261
--- /dev/null
+++ b/engines/bladerunner/lights.h
@@ -0,0 +1,64 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef BLADERUNNER_LIGHTS_H
+#define BLADERUNNER_LIGHTS_H
+
+#include "bladerunner/bladerunner.h"
+#include "bladerunner/color.h"
+#include "bladerunner/light.h"
+
+#include "common/stream.h"
+
+
+namespace BladeRunner {
+
+ class Lights
+ {
+ BladeRunnerEngine *_vm;
+
+ private:
+ Color _ambientLightColor;
+
+ int _lightsCount;
+ Light *_lights;
+
+ int _frame;
+ //char gap[28];
+
+ public:
+ Lights(BladeRunnerEngine *vm);
+ ~Lights();
+
+ void read(Common::ReadStream *stream, int framesCount);
+ void readVqa(Common::ReadStream *stream);
+
+ void reset();
+
+ void setupFrame(int frame);
+
+ private:
+
+ };
+
+}
+#endif
diff --git a/engines/bladerunner/movement_track.cpp b/engines/bladerunner/movement_track.cpp
new file mode 100644
index 0000000000..fff4508dec
--- /dev/null
+++ b/engines/bladerunner/movement_track.cpp
@@ -0,0 +1,124 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "bladerunner/movement_track.h"
+
+namespace BladeRunner {
+ MovementTrack::MovementTrack()
+ {
+ reset();
+ }
+
+ MovementTrack::~MovementTrack()
+ {
+ reset();
+ }
+
+ void MovementTrack::reset()
+ {
+ _currentIndex = -1;
+ _lastIndex = -1;
+ _hasNext = 0;
+ _paused = 0;
+ for (int i = 0; i < sizeof(this->_entries); i++)
+ {
+ _entries[i].waypointId = -1;
+ _entries[i].delay = -1;
+ _entries[i].angle = -1;
+ _entries[i].running = 0;
+ }
+ }
+
+ int MovementTrack::append(int waypointId, int delay, int running)
+ {
+ return append(waypointId, delay, -1, running);
+ }
+
+ int MovementTrack::append(int waypointId, int delay, int angle, int running)
+ {
+ if (_lastIndex > sizeof(_entries))
+ return 0;
+ _entries[_lastIndex].waypointId = waypointId;
+ _entries[_lastIndex].delay = delay;
+ _entries[_lastIndex].angle = angle;
+ _entries[_lastIndex].running = running;
+
+ _lastIndex++;
+ _hasNext = 1;
+ _currentIndex = 0;
+ return 1;
+ }
+
+ void MovementTrack::flush()
+ {
+ reset();
+ }
+
+ void MovementTrack::repeat()
+ {
+ _currentIndex = 0;
+ _hasNext = 1;
+ }
+
+ int MovementTrack::pause()
+ {
+ _paused = 1;
+ return 1;
+ }
+
+ int MovementTrack::unpause()
+ {
+ _paused = 0;
+ return 1;
+ }
+
+ int MovementTrack::isPaused()
+ {
+ return _paused;
+ }
+
+ int MovementTrack::hasNext()
+ {
+ return _hasNext;
+ }
+
+ int MovementTrack::next(int *waypointId, int *delay, int *angle, int *running)
+ {
+ if (_currentIndex < _lastIndex && this->_hasNext)
+ {
+ *waypointId = _entries[_currentIndex].waypointId;
+ *delay = _entries[_currentIndex].delay;
+ *angle = _entries[_currentIndex].angle;
+ *running = _entries[_currentIndex++].running;
+ return 1;
+ }
+ else
+ {
+ *waypointId = -1;
+ *delay = -1;
+ *angle = -1;
+ *running = 0;
+ _hasNext = 0;
+ return 0;
+ }
+ }
+} \ No newline at end of file
diff --git a/engines/bladerunner/movement_track.h b/engines/bladerunner/movement_track.h
new file mode 100644
index 0000000000..491de8051a
--- /dev/null
+++ b/engines/bladerunner/movement_track.h
@@ -0,0 +1,70 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef BLADERUNNER_MOVEMENT_TRACK_H
+#define BLADERUNNER_MOVEMENT_TRACK_H
+
+#include "bladerunner/bladerunner.h"
+
+
+namespace BladeRunner {
+
+ class BladeRunnerEngine;
+ class BoundingBox;
+
+ struct MovementTrackEntry
+ {
+ int waypointId;
+ int delay;
+ int angle;
+ int running;
+ };
+
+ class MovementTrack {
+ BladeRunnerEngine *_vm;
+
+ private:
+ int _currentIndex;
+ int _lastIndex;
+ int _hasNext;
+ int _paused;
+ MovementTrackEntry _entries[100];
+ void reset();
+
+ public:
+ MovementTrack();
+ ~MovementTrack();
+ int append(int waypointId, int delay, int running);
+ int append(int waypointId, int delay, int angle, int running);
+ void flush();
+ void repeat();
+ int pause();
+ int unpause();
+ int isPaused();
+ int hasNext();
+ int next(int *waypointId, int *delay, int *angle, int *running);
+
+ //int saveGame();
+ };
+} // End of namespace BladeRunner
+
+#endif
diff --git a/engines/bladerunner/outtake.cpp b/engines/bladerunner/outtake.cpp
index b81b212f52..3ffc964d03 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->_view);
vqa_player.open(resName);
diff --git a/engines/bladerunner/scene.cpp b/engines/bladerunner/scene.cpp
index 925c86afba..fc0aa8c20d 100644
--- a/engines/bladerunner/scene.cpp
+++ b/engines/bladerunner/scene.cpp
@@ -28,6 +28,8 @@
#include "bladerunner/chapters.h"
#include "bladerunner/gameinfo.h"
#include "bladerunner/script/script.h"
+#include "bladerunner/slice_renderer.h"
+#include "bladerunner/scene_objects.h"
#include "common/str.h"
#include "common/stream.h"
@@ -38,7 +40,7 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) {
if (!isLoadingGame) {
// flush ADQ
}
-
+ // reset mouse button status
_setId = setId;
_sceneId = sceneId;
@@ -48,9 +50,11 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) {
// TODO: Set up overlays
} else {
// TODO: Clear regions
+ // reset aesc
// TODO: Destroy all overlays
_defaultLoop = 0;
_frame = -1;
+ //_loopStartSpecial = -1;
}
Common::String vqaName;
@@ -75,34 +79,50 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) {
if (!_set->open(setResourceName))
return false;
- // TODO: Set view
+ _vm->_sliceRenderer->setView(_vm->_view);
+
if (isLoadingGame) {
- if (sceneId >= 73 && sceneId <= 76)
- _vm->_script->InitializeScene();
- return true;
+ // resume()
+ if (sceneId >= 73 && sceneId <= 76) {
+ _vm->_script->SceneLoaded();
+ return true;
+ }
}
// TODO: set VQADecoder parameters
// TODO: Set actor position from scene info
+ //advance frame 0
_vm->_playerActor->set_at_xyz(_actorStartPosition, _actorStartFacing);
-
// TODO: Set actor set
-
_vm->_script->SceneLoaded();
-#if 0
+ _vm->_sceneObjects->reset();
+
// Init click map
int actorCount = _vm->_gameInfo->getActorCount();
for (int i = 0; i != actorCount; ++i) {
Actor *actor = _vm->_actors[i];
if (actor->getSet() == setId) {
-
+ _vm->_sceneObjects->addActor(
+ i,
+ actor->getBoundingBox(),
+ actor->getScreenRectangle(),
+ 1,
+ 0,
+ actor->isTargetable(),
+ actor->isRetired());
}
}
- // TODO: Update click map for set, items
-#endif
-
+
+ _set->addAllObjectsToScene(_vm->_sceneObjects);
+ //add all items to scene
+ //calculate walking obstacles??
+
+ if (_playerWalkedIn) {
+ //_vm->_script->PlayerWalkedIn();
+ }
+
return true;
}
@@ -111,7 +131,6 @@ int Scene::advanceFrame(Graphics::Surface &surface, uint16 *&zBuffer) {
if (frame >= 0) {
surface.copyFrom(*_vqaPlayer.getSurface());
memcpy(zBuffer, _vqaPlayer.getZBuffer(), 640*480*2);
- _view = _vqaPlayer.getView();
}
return frame;
}
diff --git a/engines/bladerunner/scene.h b/engines/bladerunner/scene.h
index f0721b39e3..ee286cabb4 100644
--- a/engines/bladerunner/scene.h
+++ b/engines/bladerunner/scene.h
@@ -26,7 +26,7 @@
#include "bladerunner/bladerunner.h"
#include "bladerunner/set.h"
-#include "bladerunner/view.h"
+//#include "bladerunner/view.h"
#include "bladerunner/vqa_player.h"
namespace BladeRunner {
@@ -48,7 +48,6 @@ public:
Vector3 _actorStartPosition;
int _actorStartFacing;
bool _playerWalkedIn;
- View _view;
public:
Scene(BladeRunnerEngine *vm)
@@ -56,7 +55,7 @@ public:
_set(new Set(vm)),
_setId(-1),
_sceneId(-1),
- _vqaPlayer(vm),
+ _vqaPlayer(vm, vm->_view),
_defaultLoop(0),
_nextSetId(-1),
_nextSceneId(-1),
diff --git a/engines/bladerunner/scene_objects.cpp b/engines/bladerunner/scene_objects.cpp
new file mode 100644
index 0000000000..f54a9b7120
--- /dev/null
+++ b/engines/bladerunner/scene_objects.cpp
@@ -0,0 +1,188 @@
+#include "bladerunner/scene_objects.h"
+
+namespace BladeRunner {
+
+ SceneObjects::SceneObjects(BladeRunnerEngine *vm, View *view) {
+ _vm = vm;
+ _view = view;
+
+ _count = 0;
+ _sceneObjects = new SceneObject[SCENE_OBJECTS_COUNT];
+ _sceneObjectsSortedByDistance = new int[SCENE_OBJECTS_COUNT];
+
+ int i;
+ for (i = 0; i < SCENE_OBJECTS_COUNT; i++) {
+ _sceneObjectsSortedByDistance[i] = -1;
+ }
+ }
+
+ SceneObjects::~SceneObjects() {
+ _vm = nullptr;
+ _view = nullptr;
+ _count = 0;
+
+ delete[] _sceneObjectsSortedByDistance;
+ delete[] _sceneObjects;
+ }
+
+
+ void SceneObjects::reset() {
+ int i;
+ for (i = 0; i < SCENE_OBJECTS_COUNT; i++) {
+ _sceneObjects[i]._present = 0;
+ }
+ }
+
+ bool SceneObjects::addActor(int sceneObjectId, BoundingBox* boundingBox, Common::Rect* screenRectangle, uint8 isClickable, uint8 unknown1, uint8 isCombatTarget, uint8 isRetired) {
+ return addSceneObject(sceneObjectId, SceneObjectTypeActor, boundingBox, screenRectangle, isClickable, 0, 0, isCombatTarget, unknown1, isRetired);
+ }
+
+ bool SceneObjects::addObject(int sceneObjectId, BoundingBox* boundingBox, uint8 isClickable, uint8 isObstacle, uint8 unknown1, uint8 isCombatTarget) {
+ Common::Rect rect(-1, -1, -1, -1);
+ return addSceneObject(sceneObjectId, SceneObjectTypeObject, boundingBox, &rect, isClickable, isObstacle, unknown1, isCombatTarget, 0, 0);
+ }
+
+ bool SceneObjects::addItem(int sceneObjectId, BoundingBox* boundingBox, Common::Rect* screenRectangle, uint8 isCombatTarget, uint8 isObstacle) {
+ return addSceneObject(sceneObjectId, SceneObjectTypeItem, boundingBox, screenRectangle, isObstacle, 0, 0, isCombatTarget, 0, 0);
+ }
+
+
+ bool SceneObjects::remove(int sceneObjectId)
+ {
+ int i = findById(sceneObjectId);
+ if (i == -1 || !_sceneObjects[i]._present) {
+ return false;
+ }
+ int j;
+ for (j = 0; j < _count; j++) {
+ if (_sceneObjectsSortedByDistance[j] == i) {
+ break;
+ }
+ }
+ int k;
+ for (k = j; k < _count - 1; k++) {
+ _sceneObjectsSortedByDistance[k] = _sceneObjectsSortedByDistance[k + 1];
+ }
+
+ --_count;
+ return true;
+ }
+
+ int SceneObjects::findByXYZ(int *isClickable, int *isObstacle, int *isCombatTarget, float x, float y, float z, int firstClickable, int firstObstacle, int firstCombatTarget) {
+ BoundingBox boundingBox;
+ *isClickable = 0;
+ *isObstacle = 0;
+ *isCombatTarget = 0;
+
+ if (!_count)
+ return -1;
+
+ int i;
+ for (i = 0; i < _count; i++) {
+ //assert(_sceneObjectsSortedByDistance[i] < _count);
+ SceneObject *sceneObject = &_sceneObjects[_sceneObjectsSortedByDistance[i]];
+ if ((firstClickable && sceneObject->_isClickable)
+ || (firstObstacle && sceneObject->_isObstacle)
+ || (firstCombatTarget && sceneObject->_isCombatTarget)) {
+ break;
+ }
+
+ boundingBox = sceneObject->_boundingBox;
+
+ if (sceneObject->_sceneObjectType == SceneObjectTypeObject || sceneObject->_sceneObjectType == SceneObjectTypeItem) {
+ boundingBox.expand(-4.0, 0.0, -4.0, 4.0, 0.0, 4.0);
+ }
+
+ if (boundingBox.isXYZInside(x, y, z)) {
+ *isClickable = sceneObject->_isClickable;
+ *isObstacle = sceneObject->_isObstacle;
+ *isCombatTarget = sceneObject->_isCombatTarget;
+ return sceneObject->_sceneObjectId;
+ }
+ }
+
+ return -1;
+ }
+
+ int SceneObjects::findById(int sceneObjectId)
+ {
+ int i;
+ for (i = 0; i < _count; i++) {
+ if (_sceneObjects[i]._present && _sceneObjects[i]._sceneObjectId == sceneObjectId) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ bool SceneObjects::addSceneObject(int sceneObjectId, SceneObjectType sceneObjectType, BoundingBox* boundingBox, Common::Rect* screenRectangle, uint8 isClickable, uint8 isObstacle, uint8 unknown1, uint8 isCombatTarget, uint unknown2, uint isRetired) {
+ int index = findEmpty();
+ if (_count >= SCENE_OBJECTS_COUNT || index == -1) {
+ return false;
+ }
+
+ _sceneObjects[index]._sceneObjectId = sceneObjectId;
+ _sceneObjects[index]._sceneObjectType = sceneObjectType;
+ _sceneObjects[index]._present = 1;
+ _sceneObjects[index]._boundingBox = *boundingBox;
+ _sceneObjects[index]._screenRectangle = *screenRectangle;
+ _sceneObjects[index]._isClickable = isClickable;
+ _sceneObjects[index]._isObstacle = isObstacle;
+ _sceneObjects[index]._unknown1 = unknown1;
+ _sceneObjects[index]._isCombatTarget = isCombatTarget;
+ _sceneObjects[index]._unknown2 = unknown2;
+ _sceneObjects[index]._isRetired = isRetired;
+
+ float centerZ = (_sceneObjects[index]._boundingBox._vertices[0].z + _sceneObjects[index]._boundingBox._vertices[1].z) / 2.0;
+
+ float distanceToCamera = fabs(_view->_cameraPosition.z - centerZ);
+ _sceneObjects[index]._distanceToCamera = distanceToCamera;
+
+ // insert according to distance from camera
+ int i, j;
+ for (i = 0; i < _count; i++) {
+ if (distanceToCamera < _sceneObjects[_sceneObjectsSortedByDistance[i]]._distanceToCamera) {
+ break;
+ }
+ }
+
+ for (j = _count - 1; j >= i; j--) {
+ _sceneObjectsSortedByDistance[j + 1] = _sceneObjectsSortedByDistance[j];
+ }
+
+ _sceneObjectsSortedByDistance[i] = index;
+ ++_count;
+ return true;
+ }
+
+ int SceneObjects::findEmpty()
+ {
+ int i;
+ for (i = 0; i < SCENE_OBJECTS_COUNT; i++)
+ {
+ if (!_sceneObjects[i]._present)
+ return i;
+ }
+ return -1;
+ }
+
+
+
+ SceneObject::SceneObject()
+ {
+ _sceneObjectId = -1;
+ _sceneObjectType = SceneObjectTypeUnknown;
+ _distanceToCamera = 0;
+ _present = 0;
+ _isClickable = 0;
+ _isObstacle = 0;
+ _unknown1 = 0;
+ _isCombatTarget = 0;
+ _unknown2 = 0;
+ _isRetired = 0;
+ }
+
+ SceneObject::~SceneObject()
+ {
+ }
+}
diff --git a/engines/bladerunner/scene_objects.h b/engines/bladerunner/scene_objects.h
new file mode 100644
index 0000000000..999d82179f
--- /dev/null
+++ b/engines/bladerunner/scene_objects.h
@@ -0,0 +1,96 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef BLADERUNNER_SCENE_OBJECTS_H
+#define BLADERUNNER_SCENE_OBJECTS_H
+
+#include "bladerunner/bladerunner.h"
+
+#include "bladerunner/boundingbox.h"
+#include "bladerunner/view.h"
+
+#include "common/rect.h"
+
+namespace BladeRunner {
+ class BladeRunnerEngine;
+ class SceneObject;
+
+ enum SceneObjectType
+ {
+ SceneObjectTypeUnknown = -1,
+ SceneObjectTypeActor = 0,
+ SceneObjectTypeObject = 1,
+ SceneObjectTypeItem = 2,
+ };
+
+#define SCENE_OBJECTS_COUNT 115
+#define SCENE_OBJECTS_ACTORS_OFFSET 0
+#define SCENE_OBJECTS_ITEMS_OFFSET 74
+#define SCENE_OBJECTS_OBJECTS_OFFSET 198
+
+
+
+ class SceneObjects {
+ BladeRunnerEngine *_vm;
+ private:
+ View *_view;
+ int _count;
+ SceneObject *_sceneObjects;
+ int *_sceneObjectsSortedByDistance;
+
+ public:
+ SceneObjects(BladeRunnerEngine *vm, View *view);
+ ~SceneObjects();
+ void reset();
+ bool addActor(int sceneObjectId, BoundingBox* boundingBox, Common::Rect* screenRectangle, uint8 isClickable, uint8 unknown1, uint8 isCombatTarget, uint8 isRetired);
+ bool addObject(int sceneObjectId, BoundingBox* boundingBox, uint8 isClickable, uint8 isObstacle, uint8 unknown1, uint8 isCombatTarget);
+ bool addItem(int sceneObjectId, BoundingBox* boundingBox, Common::Rect* screenRectangle, uint8 isCombatTarget, uint8 isObstacle);
+ bool remove(int sceneObjectId);
+ int findByXYZ(int* clickable, int* obstacle, int* targetable, float x, float y, float z, int firstClickable, int firstObstacle, int firstTargetable);
+ private:
+ int findById(int sceneObjectId);
+ bool addSceneObject(int sceneObjectId, SceneObjectType sceneObjectType, BoundingBox* boundingBox, Common::Rect* screenRectangle, uint8 isClickable, uint8 isObstacle, uint8 unknown1, uint8 isCombatTarget, uint unknown2, uint isRetired);
+ int findEmpty();
+ };
+
+ class SceneObject
+ {
+ friend class SceneObjects;
+ private:
+ int _sceneObjectId;
+ SceneObjectType _sceneObjectType;
+ BoundingBox _boundingBox;
+ Common::Rect _screenRectangle;
+ float _distanceToCamera;
+ int _present;
+ int _isClickable;
+ int _isObstacle;
+ int _unknown1;
+ int _isCombatTarget;
+ int _unknown2;
+ int _isRetired;
+ public:
+ SceneObject();
+ ~SceneObject();
+ };
+}
+#endif
diff --git a/engines/bladerunner/set.cpp b/engines/bladerunner/set.cpp
index c37b31a80e..a2e54107d2 100644
--- a/engines/bladerunner/set.cpp
+++ b/engines/bladerunner/set.cpp
@@ -23,12 +23,14 @@
#include "bladerunner/set.h"
#include "bladerunner/bladerunner.h"
+#include "bladerunner/slice_renderer.h"
#include "common/debug.h"
#include "common/ptr.h"
#include "common/str.h"
#include "common/stream.h"
+
namespace BladeRunner {
#define kSet0 0x53657430
@@ -38,9 +40,12 @@ Set::Set(BladeRunnerEngine *vm) : _vm(vm) {
_walkboxCount = 0;
_objects = new Object[85];
_walkboxes = new Walkbox[95];
+ _footstepSoundOverride = -1;
+ _effects = new SetEffects(vm);
}
Set::~Set() {
+ delete _effects;
delete[] _objects;
delete[] _walkboxes;
}
@@ -52,7 +57,7 @@ bool Set::open(const Common::String &name) {
if (sig != kSet0)
return false;
- s->skip(4); // TODO: LITE length
+ int framesCount = s->readUint32LE();
_objectCount = s->readUint32LE();
assert(_objectCount <= 85);
@@ -101,9 +106,24 @@ bool Set::open(const Common::String &name) {
// debug("WALKBOX: %s", _walkboxes[i]._name);
}
- // TODO: Read LITE
+ _vm->_lights->reset();
+ _vm->_lights->read(s.get(), framesCount);
+ _vm->_sliceRenderer->setLights(_vm->_lights);
+ _effects->reset();
+ _effects->read(s.get(), framesCount);
+ _vm->_sliceRenderer->setSetEffects(_effects);
return true;
}
+
+void Set::addAllObjectsToScene(SceneObjects* sceneObjects)
+{
+ uint32 i;
+ for (i = 0; i < _objectCount; i++)
+ {
+ sceneObjects->addObject(i + SCENE_OBJECTS_OBJECTS_OFFSET, &_objects[i]._bbox, _objects[i]._isClickable, _objects[i]._isObstacle, _objects[i]._unknown1, _objects[i]._isCombatTarget);
+ }
+}
+
} // End of namespace BladeRunner
diff --git a/engines/bladerunner/set.h b/engines/bladerunner/set.h
index e7358fdb2a..fba2d2a3ab 100644
--- a/engines/bladerunner/set.h
+++ b/engines/bladerunner/set.h
@@ -24,6 +24,10 @@
#define BLADERUNNER_SET_H
#include "bladerunner/boundingbox.h"
+#include "bladerunner/set_effects.h"
+#include "bladerunner/lights.h"
+#include "bladerunner/scene_objects.h"
+
#include "common/scummsys.h"
#include "common/str.h"
@@ -41,6 +45,7 @@ struct Object {
uint8 _isClickable;
uint8 _isHotMouse;
uint8 _isCombatTarget;
+ uint8 _unknown1;
};
struct Walkbox {
@@ -53,19 +58,24 @@ struct Walkbox {
class Set {
BladeRunnerEngine *_vm;
- uint32 _objectCount;
- uint32 _walkboxCount;
- Object *_objects;
- Walkbox *_walkboxes;
- int _walkboxStepSound[85];
- int _footstepSoundOverride;
- float _unknown[10];
+ uint32 _objectCount;
+ uint32 _walkboxCount;
+ Object *_objects;
+ Walkbox *_walkboxes;
+ int _walkboxStepSound[85];
+ int _footstepSoundOverride;
+ SetEffects *_effects;
+public:
+
public:
Set(BladeRunnerEngine *vm);
~Set();
bool open(const Common::String &name);
+ void addAllObjectsToScene(SceneObjects *sceneObjects);
+
+
};
} // End of namespace BladeRunner
diff --git a/engines/bladerunner/set_effects.cpp b/engines/bladerunner/set_effects.cpp
new file mode 100644
index 0000000000..f524820033
--- /dev/null
+++ b/engines/bladerunner/set_effects.cpp
@@ -0,0 +1,83 @@
+#include "bladerunner/set_effects.h"
+
+namespace BladeRunner
+{
+ SetEffects::SetEffects(BladeRunnerEngine* vm)
+ {
+ _vm = vm;
+
+ _distanceColor.r = 1.0f;
+ _distanceColor.g = 1.0f;
+ _distanceColor.b = 1.0f;
+ _distanceCoeficient = 0.1f;
+
+ _fadeColor.r = 0.0f;
+ _fadeColor.g = 0.0f;
+ _fadeColor.b = 0.0f;
+ _fadeDensity = 0.0f;
+
+ _fogsCount = 0;
+ _fogs = NULL;
+ }
+
+ SetEffects::~SetEffects()
+ {
+ reset();
+ }
+
+ void SetEffects::read(Common::ReadStream* stream, int framesCount)
+ {
+ _distanceCoeficient = stream->readFloatLE();
+ _distanceColor.r = stream->readFloatLE();
+ _distanceColor.g = stream->readFloatLE();
+ _distanceColor.b = stream->readFloatLE();
+
+ _fogsCount = stream->readUint32LE();
+ int i;
+ for (i = 0; i < _fogsCount; i++)
+ {
+ int type = stream->readUint32LE();
+ Fog* fog = NULL;
+ switch(type)
+ {
+ case 0:
+ fog = new FogCone();
+ break;
+ case 1:
+ fog = new FogSphere();
+ break;
+ case 2:
+ fog = new FogBox();
+ break;
+ }
+ if(!fog)
+ {
+ //TODO exception, unknown fog type
+ }
+ fog->read(stream, framesCount);
+ fog->_next = _fogs;
+ _fogs = fog;
+ }
+ }
+
+ void SetEffects::reset()
+ {
+ Fog* fog, *nextFog;
+
+ if (!_fogs)
+ return;
+
+ do
+ {
+ fog = _fogs;
+ nextFog = fog->_next;
+ delete fog;
+ fog = nextFog;
+ } while (nextFog);
+
+ }
+
+ void SetEffects::setupFrame(int frame)
+ {
+ }
+} \ No newline at end of file
diff --git a/engines/bladerunner/set_effects.h b/engines/bladerunner/set_effects.h
new file mode 100644
index 0000000000..5165cfba94
--- /dev/null
+++ b/engines/bladerunner/set_effects.h
@@ -0,0 +1,62 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef BLADERUNNER_SET_EFFECTS_H
+#define BLADERUNNER_SET_EFFECTS_H
+
+#include "bladerunner/bladerunner.h"
+#include "bladerunner/color.h"
+#include "bladerunner/fog.h"
+
+#include "common/stream.h"
+
+
+namespace BladeRunner {
+
+ class SetEffects
+ {
+ BladeRunnerEngine *_vm;
+
+ private:
+ Color _distanceColor;
+ float _distanceCoeficient;
+ Color _fadeColor;
+ float _fadeDensity;
+ int _fogsCount;
+ Fog *_fogs;
+
+ public:
+ SetEffects(BladeRunnerEngine *vm);
+ ~SetEffects();
+
+ void read(Common::ReadStream *stream, int framesCount);
+
+ void reset();
+
+ void setupFrame(int frame);
+
+ private:
+
+ };
+
+}
+#endif
diff --git a/engines/bladerunner/slice_renderer.cpp b/engines/bladerunner/slice_renderer.cpp
index 4e2300ec7f..a1e8497dc9 100644
--- a/engines/bladerunner/slice_renderer.cpp
+++ b/engines/bladerunner/slice_renderer.cpp
@@ -24,6 +24,9 @@
#include "bladerunner/bladerunner.h"
#include "bladerunner/slice_animations.h"
+#include "bladerunner/lights.h"
+#include "bladerunner/scene.h"
+#include "bladerunner/set.h"
#include "common/debug.h"
#include "common/memstream.h"
@@ -54,7 +57,7 @@ void dump(const char *str, Matrix4x3 m) {
SliceRenderer::~SliceRenderer() {
}
-void SliceRenderer::setView(const View &view) {
+void SliceRenderer::setView(View *view) {
_view = view;
}
@@ -84,7 +87,7 @@ void SliceRenderer::setupFrame(int animation, int frame, Vector3 position, float
Matrix3x2 SliceRenderer::calculateFacingRotationMatrix() {
assert(_sliceFramePtr);
- Matrix4x3 viewMatrix = _view._sliceViewMatrix;
+ Matrix4x3 viewMatrix = _view->_sliceViewMatrix;
Vector3 viewPos = viewMatrix * _position;
float dir = atan2f(viewPos.x, viewPos.z) + _facing;
float s = sinf(dir);
@@ -107,7 +110,7 @@ void SliceRenderer::calculateBoundingRect() {
_minY = 0.0f;
_maxY = 0.0f;
- Matrix4x3 viewMatrix = _view._sliceViewMatrix;
+ Matrix4x3 viewMatrix = _view->_sliceViewMatrix;
Vector3 frameBottom = Vector3(0.0f, 0.0f, _frameBottomZ);
Vector3 frameTop = Vector3(0.0f, 0.0f, _frameBottomZ + _frameSliceCount * _frameSliceHeight);
@@ -122,7 +125,7 @@ void SliceRenderer::calculateBoundingRect() {
Matrix3x2 facingRotation = calculateFacingRotationMatrix();
- Matrix3x2 m4(_view._viewportDistance / bottom.z, 0.0f, 0.0f,
+ Matrix3x2 m4(_view->_viewportDistance / bottom.z, 0.0f, 0.0f,
0.0f, 25.5f, 0.0f);
Matrix3x2 m2(_frameFront.x, 0.0f, _framePos.x,
@@ -130,13 +133,13 @@ void SliceRenderer::calculateBoundingRect() {
_field_109E = m4 * (facingRotation * m2);
- Vector4 B6(_view._viewportHalfWidth + top.x / top.z * _view._viewportDistance,
- _view._viewportHalfHeight + top.y / top.z * _view._viewportDistance,
+ Vector4 B6(_view->_viewportHalfWidth + top.x / top.z * _view->_viewportDistance,
+ _view->_viewportHalfHeight + top.y / top.z * _view->_viewportDistance,
1.0f / top.z,
_frameSliceCount * (1.0f / top.z));
- Vector4 C2(_view._viewportHalfWidth + bottom.x / bottom.z * _view._viewportDistance,
- _view._viewportHalfHeight + bottom.y / bottom.z * _view._viewportDistance,
+ Vector4 C2(_view->_viewportHalfWidth + bottom.x / bottom.z * _view->_viewportDistance,
+ _view->_viewportHalfHeight + bottom.y / bottom.z * _view->_viewportDistance,
1.0f / bottom.z,
0.0f);
@@ -324,6 +327,9 @@ void setupLookupTable(int t[256], int inc) {
void SliceRenderer::drawFrame(Graphics::Surface &surface, uint16 *zbuffer) {
assert(_sliceFramePtr);
+ assert(_lights);
+ assert(_setEffects);
+ assert(_view);
SliceLineIterator sliceLineIterator;
sliceLineIterator.setup(
@@ -333,6 +339,9 @@ void SliceRenderer::drawFrame(Graphics::Surface &surface, uint16 *zbuffer) {
_field_109E // 3x2 matrix
);
+ _lights->setupFrame(_view->_frame);
+ _setEffects->setupFrame(_view->_frame);
+
setupLookupTable(_t1, sliceLineIterator._field_00[0][0]);
setupLookupTable(_t2, sliceLineIterator._field_00[0][1]);
setupLookupTable(_t4, sliceLineIterator._field_00[1][0]);
@@ -407,4 +416,13 @@ void SliceRenderer::drawSlice(int slice, uint16 *frameLinePtr, uint16 *zbufLineP
}
}
+void SliceRenderer::setLights(Lights* lights)
+{
+ _lights = lights;
+}
+
+void SliceRenderer::setSetEffects(SetEffects* setEffects)
+{
+ _setEffects = setEffects;
+}
} // End of namespace BladeRunner
diff --git a/engines/bladerunner/slice_renderer.h b/engines/bladerunner/slice_renderer.h
index 79ebdd8951..c04560a35e 100644
--- a/engines/bladerunner/slice_renderer.h
+++ b/engines/bladerunner/slice_renderer.h
@@ -26,6 +26,8 @@
#include "bladerunner/vector.h"
#include "bladerunner/view.h"
#include "bladerunner/matrix.h"
+#include "bladerunner/lights.h"
+#include "bladerunner/set_effects.h"
#include "graphics/surface.h"
@@ -34,8 +36,9 @@ namespace Common {
}
namespace BladeRunner {
+ class SetEffects;
-class BladeRunnerEngine;
+ class BladeRunnerEngine;
class SliceRenderer {
BladeRunnerEngine *_vm;
@@ -46,7 +49,9 @@ class SliceRenderer {
float _facing;
float _scale;
- View _view;
+ View *_view;
+ Lights *_lights;
+ SetEffects *_setEffects;
void *_sliceFramePtr;
@@ -75,6 +80,8 @@ class SliceRenderer {
int _t5[256];
int _c6;
+
+
Matrix3x2 calculateFacingRotationMatrix();
void drawSlice(int slice, uint16 *frameLinePtr, uint16 *zbufLinePtr);
@@ -84,11 +91,16 @@ public:
{}
~SliceRenderer();
- void setView(const View &view);
+ void setView(View *view);
+ void setLights(Lights *lights);
+ void setSetEffects(SetEffects *setEffects);
+
void setupFrame(int animation, int frame, Vector3 position, float facing, float scale = 1.0f);
void calculateBoundingRect();
void drawFrame(Graphics::Surface &surface, uint16 *zbuffer);
+
+
};
} // End of namespace BladeRunner
diff --git a/engines/bladerunner/view.cpp b/engines/bladerunner/view.cpp
index b3b6ad8ad2..029f829c0d 100644
--- a/engines/bladerunner/view.cpp
+++ b/engines/bladerunner/view.cpp
@@ -27,6 +27,11 @@
namespace BladeRunner {
+View::View(BladeRunnerEngine* vm)
+{
+ _vm = vm;
+}
+
bool View::read(Common::ReadStream *stream) {
uint32 frame;
frame = stream->readUint32LE();
diff --git a/engines/bladerunner/view.h b/engines/bladerunner/view.h
index 511ea66d1b..3e3a0e86b1 100644
--- a/engines/bladerunner/view.h
+++ b/engines/bladerunner/view.h
@@ -23,6 +23,8 @@
#ifndef BLADERUNNER_VIEW_H
#define BLADERUNNER_VIEW_H
+#include "bladerunner/bladerunner.h"
+
#include "matrix.h"
namespace Common {
@@ -32,6 +34,7 @@ namespace Common {
namespace BladeRunner {
class View {
+ BladeRunnerEngine *_vm;
public:
float _fovX;
Matrix4x3 _frameViewMatrix;
@@ -44,8 +47,12 @@ public:
float _viewportHalfHeight;
float _viewportDistance;
+ View(BladeRunnerEngine *vm);
+
bool read(Common::ReadStream *stream);
+
+
private:
void setFovX(float fovX);
void calculateSliceViewMatrix();
diff --git a/engines/bladerunner/vqa_decoder.cpp b/engines/bladerunner/vqa_decoder.cpp
index d1e56a98d6..63378dc5e9 100644
--- a/engines/bladerunner/vqa_decoder.cpp
+++ b/engines/bladerunner/vqa_decoder.cpp
@@ -30,6 +30,7 @@
#include "common/array.h"
#include "common/util.h"
+#include "common/memstream.h"
namespace BladeRunner {
@@ -524,7 +525,12 @@ bool VQADecoder::readMFCI(Common::SeekableReadStream *s, uint32 size) {
return true;
}
-VQADecoder::VQAVideoTrack::VQAVideoTrack(VQADecoder *vqaDecoder) {
+void VQADecoder::decodeView(View* view)
+{
+ _videoTrack->decodeView(view);
+}
+
+ VQADecoder::VQAVideoTrack::VQAVideoTrack(VQADecoder *vqaDecoder) {
VQADecoder::Header *header = &vqaDecoder->_header;
_surface = nullptr;
@@ -560,6 +566,8 @@ VQADecoder::VQAVideoTrack::VQAVideoTrack(VQADecoder *vqaDecoder) {
_surface = new Graphics::Surface();
_surface->create(_width, _height, createRGB555());
+
+ _viewData = new uint8[56];
}
VQADecoder::VQAVideoTrack::~VQAVideoTrack() {
@@ -567,6 +575,7 @@ VQADecoder::VQAVideoTrack::~VQAVideoTrack() {
delete[] _cbfz;
delete[] _zbufChunk;
delete[] _vpointer;
+ delete[] _viewData;
if (_surface)
_surface->free();
@@ -743,18 +752,29 @@ const uint16 *VQADecoder::VQAVideoTrack::decodeZBuffer()
return _zbuffer;
}
-bool VQADecoder::VQAVideoTrack::readVIEW(Common::SeekableReadStream *s, uint32 size)
+
+void VQADecoder::VQAVideoTrack::decodeView(View* view)
+{
+ assert(_viewData);
+ assert(view);
+
+ Common::MemoryReadStream s(_viewData, 56);
+ view->read(&s);
+}
+
+ bool VQADecoder::VQAVideoTrack::readVIEW(Common::SeekableReadStream *s, uint32 size)
{
if (size != 56)
return false;
- _view.read(s);
+ s->read(_viewData, 56);
return true;
}
bool VQADecoder::VQAVideoTrack::readAESC(Common::SeekableReadStream *s, uint32 size)
{
+ // some screen (2d not 3d) effects for transparency
s->skip(roundup(size));
return true;
}
diff --git a/engines/bladerunner/vqa_decoder.h b/engines/bladerunner/vqa_decoder.h
index 3f8c968b9e..c57372081d 100644
--- a/engines/bladerunner/vqa_decoder.h
+++ b/engines/bladerunner/vqa_decoder.h
@@ -52,8 +52,8 @@ public:
const Graphics::Surface *decodeVideoFrame();
const uint16 *decodeZBuffer();
Audio::SeekableAudioStream *decodeAudioFrame();
-
- const View &getView() { return _videoTrack->getView(); }
+ void decodeView(View *view);
+ //const View &getView() { return _videoTrack->getView(); }
uint16 numFrames() const { return _header.numFrames; }
uint8 frameRate() const { return _header.frameRate; }
@@ -163,7 +163,7 @@ private:
int getFrameCount() const;
const Graphics::Surface *decodeVideoFrame();
const uint16 *decodeZBuffer();
- const View &getView() { return _view; }
+ void decodeView(View *view);
bool readVQFR(Common::SeekableReadStream *s, uint32 size);
bool readVPTR(Common::SeekableReadStream *s, uint32 size);
@@ -207,7 +207,7 @@ private:
int _curFrame;
- View _view;
+ uint8 *_viewData;
void VPTRWriteBlock(uint16 *frame, unsigned int dstBlock, unsigned int srcBlock, int count, bool alpha = false);
bool decodeFrame(uint16 *frame);
diff --git a/engines/bladerunner/vqa_player.cpp b/engines/bladerunner/vqa_player.cpp
index 8146c1abf9..0a04d1b786 100644
--- a/engines/bladerunner/vqa_player.cpp
+++ b/engines/bladerunner/vqa_player.cpp
@@ -65,7 +65,7 @@ int VQAPlayer::update() {
queueAudioFrame(_decoder.decodeAudioFrame());
_surface = _decoder.decodeVideoFrame();
_zBuffer = _decoder.decodeZBuffer();
- _view = _decoder.getView();
+ _decoder.decodeView(_view);
}
_decodedFrame = calcNextFrame(_curFrame);
@@ -89,7 +89,7 @@ int VQAPlayer::update() {
if (_curFrame >= 0) {
_surface = _decoder.decodeVideoFrame();
_zBuffer = _decoder.decodeZBuffer();
- _view = _decoder.getView();
+ _decoder.decodeView(_view);
}
_decodedFrame = calcNextFrame(_curFrame);
diff --git a/engines/bladerunner/vqa_player.h b/engines/bladerunner/vqa_player.h
index 80ebf19d2f..98f1fcf51b 100644
--- a/engines/bladerunner/vqa_player.h
+++ b/engines/bladerunner/vqa_player.h
@@ -42,14 +42,14 @@ class VQAPlayer {
const uint16 *_zBuffer;
Audio::QueuingAudioStream *_audioStream;
+ View *_view;
+
int _curFrame;
int _decodedFrame;
int _curLoop;
int _loopSpecial;
int _loopDefault;
- View _view;
-
uint32 _nextFrameTime;
bool _hasAudio;
bool _audioStarted;
@@ -57,7 +57,7 @@ class VQAPlayer {
public:
- VQAPlayer(BladeRunnerEngine *vm)
+ VQAPlayer(BladeRunnerEngine *vm, View *view)
: _vm(vm),
_s(nullptr),
_surface(nullptr),
@@ -69,7 +69,8 @@ public:
_loopDefault(-1),
_nextFrameTime(0),
_hasAudio(false),
- _audioStarted(false)
+ _audioStarted(false),
+ _view(view)
{}
~VQAPlayer() {
@@ -82,7 +83,6 @@ public:
int update();
const Graphics::Surface *getSurface() const;
const uint16 *getZBuffer() const;
- const View &getView() const { return _view; }
void setLoopSpecial(int loop, bool wait);
void setLoopDefault(int loop);