aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/bladerunner.cpp
diff options
context:
space:
mode:
authorPeter Kohaut2017-04-02 18:17:43 +0200
committerPeter Kohaut2017-04-02 18:19:26 +0200
commit027dc4c38c033dcae3dd0ed485b56f587ee05b44 (patch)
tree286f20a767d4ea56c1e6d22c46b93e15cff330a3 /engines/bladerunner/bladerunner.cpp
parent06be112b22531f2658dbec0362beb66c32c0db9c (diff)
downloadscummvm-rg350-027dc4c38c033dcae3dd0ed485b56f587ee05b44.tar.gz
scummvm-rg350-027dc4c38c033dcae3dd0ed485b56f587ee05b44.tar.bz2
scummvm-rg350-027dc4c38c033dcae3dd0ed485b56f587ee05b44.zip
BLADERUNNER: fixed lighting cache
actors can be now partially illuminated (per slice), it iss visible in scene rc02 in the right part of the room
Diffstat (limited to 'engines/bladerunner/bladerunner.cpp')
-rw-r--r--engines/bladerunner/bladerunner.cpp82
1 files changed, 48 insertions, 34 deletions
diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index e11cc0b53f..17e117baaf 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -659,37 +659,33 @@ void BladeRunnerEngine::gameTick() {
BoundingBox *bbox = &sceneObject->_boundingBox;
Vector3 a, b;
bbox->getXYZ(&a.x, &a.y, &a.z, &b.x, &b.y, &b.z);
-
- int color = 0b111111111111111;
- if (sceneObject->_sceneObjectType == SceneObjectTypeActor) {
- color = 0b111110000000000;
- }
- if (sceneObject->_sceneObjectType == SceneObjectTypeObject) {
- color = 0b011110111101111;
- //if (sceneObject->_isObstacle)
- // color += 0b100000000000000;
- if (sceneObject->_isClickable)
- color = 0b000001111100000;
- //if (sceneObject->_isTarget)
- // color += 0b000000000010000;
- }
-
- drawBBox(a, b, _view, &_surface2, color);
-
- //_surface2.frameRect(sceneObject->_screenRectangle, color);
-
Vector3 pos = _view->calculateScreenPosition(0.5 * (a + b));
+ int color;
+
switch (sceneObject->_sceneObjectType) {
case SceneObjectTypeActor:
+ color = 0b111110000000000;
+ drawBBox(a, b, _view, &_surface2, color);
_mainFont->drawColor(_textActorNames->getText(sceneObject->_sceneObjectId - SCENE_OBJECTS_ACTORS_OFFSET), _surface2, pos.x, pos.y, color);
break;
case SceneObjectTypeItem:
- _mainFont->drawColor("item", _surface2, pos.x, pos.y, color);
+ char itemText[40];
+ drawBBox(a, b, _view, &_surface2, color);
+ sprintf(itemText, "item %i", sceneObject->_sceneObjectId - SCENE_OBJECTS_ITEMS_OFFSET);
+ _mainFont->drawColor(itemText, _surface2, pos.x, pos.y, color);
break;
case SceneObjectTypeObject:
+ color = 0b011110111101111;
+ //if (sceneObject->_isObstacle)
+ // color += 0b100000000000000;
+ if (sceneObject->_isClickable) {
+ color = 0b000001111100000;
+ }
+ drawBBox(a, b, _view, &_surface2, color);
_mainFont->drawColor(_scene->objectGetName(sceneObject->_sceneObjectId - SCENE_OBJECTS_OBJECTS_OFFSET), _surface2, pos.x, pos.y, color);
break;
}
+ _surface2.frameRect(sceneObject->_screenRectangle, color);
}
}
@@ -706,32 +702,51 @@ void BladeRunnerEngine::gameTick() {
_surface2.frameRect(region->_rectangle, 0b111111111111111);
}
+
+ //draw walkboxes
for (int i = 0; i < _scene->_set->_walkboxCount; i++) {
Walkbox *walkbox = &_scene->_set->_walkboxes[i];
for (int j = 0; j < walkbox->_vertexCount; j++) {
Vector3 start = _view->calculateScreenPosition(walkbox->_vertices[j]);
Vector3 end = _view->calculateScreenPosition(walkbox->_vertices[(j + 1) % walkbox->_vertexCount]);
- //debug("walkbox[%i][%i] = x=%f y=%f x=%f y=%f", i, j, start.x, start.y, end.x, end.y);
_surface2.drawLine(start.x, start.y, end.x, end.y, 0b111111111100000);
Vector3 pos = _view->calculateScreenPosition(0.5 * (start + end));
_mainFont->drawColor(walkbox->_name, _surface2, pos.x, pos.y, 0b111111111100000);
}
-
}
-// for (int i = 0; i < (int)_lights->_lights.size(); i++) {
-// Light *light = _lights->_lights[i];
-// Matrix4x3 m = light->_matrix;
-// Vector3 pos = Vector3(m(0, 3), m(1, 3), m(2, 3));
-// Vector3 size = Vector3(5.0f, 5.0f, 5.0f);
-// int colorR = (light->_color.r * 31.0f);
-// int colorG = (light->_color.g * 31.0f);
-// int colorB = (light->_color.b * 31.0f);
-// int color = (colorR << 10) + (colorG << 5) + colorB;
-// drawBBox(pos - size, pos + size, _view, &_surface2, color);
-// }
+ // draw lights
+ for (int i = 0; i < (int)_lights->_lights.size(); i++) {
+ Light *light = _lights->_lights[i];
+ Matrix4x3 m = light->_matrix;
+ m = invertMatrix(m);
+ //todo do this properly
+ Vector3 posOrigin = m * Vector3(0.0f, 0.0f, 0.0f);
+ float t = posOrigin.y;
+ posOrigin.y = posOrigin.z;
+ posOrigin.z = -t;
+
+ Vector3 posTarget = m * Vector3(0.0f, 0.0f, -100.0f);
+ t = posTarget.y;
+ posTarget.y = posTarget.z;
+ posTarget.z = -t;
+ Vector3 size = Vector3(5.0f, 5.0f, 5.0f);
+ int colorR = (light->_color.r * 31.0f);
+ int colorG = (light->_color.g * 31.0f);
+ int colorB = (light->_color.b * 31.0f);
+ int color = (colorR << 10) + (colorG << 5) + colorB;
+
+ drawBBox(posOrigin - size, posOrigin + size, _view, &_surface2, color);
+
+ Vector3 posOriginT = _view->calculateScreenPosition(posOrigin);
+ Vector3 posTargetT = _view->calculateScreenPosition(posTarget);
+ _surface2.drawLine(posOriginT.x, posOriginT.y, posTargetT.x, posTargetT.y, color);
+ _mainFont->drawColor(light->_name, _surface2, posOriginT.x, posOriginT.y, color);
+ }
+
+ //draw waypoints
for(int i = 0; i < _waypoints->_count; i++) {
Waypoint *waypoint = &_waypoints->_waypoints[i];
if(waypoint->_setId != _scene->getSetId())
@@ -744,7 +759,6 @@ void BladeRunnerEngine::gameTick() {
char waypointText[40];
sprintf(waypointText, "waypoint %i", i);
_mainFont->drawColor(waypointText, _surface2, spos.x, spos.y, color);
-
}
#endif