[Scummvm-git-logs] scummvm master -> 249e795a5d958d9ae55575c32ed26ee343356d42
mgerhardy
martin.gerhardy at gmail.com
Tue Jan 12 22:01:46 UTC 2021
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
dfd2612589 TWINE: little progress in holomap reversing
249e795a5d TWINE: more progress on holomap reversing - but disabled
Commit: dfd26125891c3a1d364b3bc3766d6292189dfd26
https://github.com/scummvm/scummvm/commit/dfd26125891c3a1d364b3bc3766d6292189dfd26
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-01-12T22:44:58+01:00
Commit Message:
TWINE: little progress in holomap reversing
Changed paths:
engines/twine/holomap.cpp
engines/twine/renderer/renderer.h
diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index a83b43633f..6c56e65028 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -29,6 +29,8 @@
#include "twine/renderer/redraw.h"
#include "twine/renderer/renderer.h"
#include "twine/renderer/screens.h"
+#include "twine/scene/animations.h"
+#include "twine/scene/movements.h"
#include "twine/resources/hqr.h"
#include "twine/resources/resources.h"
#include "twine/scene/collision.h"
@@ -149,7 +151,11 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
#if 0
ScopedEngineFreeze timeFreeze(_engine);
_engine->_renderer->setCameraPosition(400, 240, 128, 1024, 1024);
+ _engine->_renderer->setCameraAngle(0, 0, 0, (int)(short)DAT_0043f706, (int)(short)DAT_0043f710, (int)DAT_0043f7f8, 0x14b4);
ActorMoveStruct move;
+ const uint8 *animPtr = nullptr;
+ int frameNumber = 0;
+ int frameTime = _engine->lbaTime;
for (;;) {
ScopedFPS scopedFps;
_engine->readKeys();
@@ -166,25 +172,27 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
}
const int16 newAngle = move.getRealAngle(_engine->lbaTime);
if (move.numOfStep == 0) {
- _engine->_movements->setActorAngleSafe(v18, v18 - ANGLE_90, 500, &move);
+ const int startAngle = ANGLE_0;
+ _engine->_movements->setActorAngleSafe(startAngle, startAngle - ANGLE_90, 500, &move);
}
- if (SetInterAnimObjet(v5)) {
- ++v27;
- if (v27 == _engine->_animations->getNumKeyframes(v14)) {
- v27 = _engine->_animations->getStartKeyframe(v14);
+
+ if (_engine->_animations->setModelAnimation(frameNumber, animPtr, modelPtr, &move)) {
+ frameNumber++;
+ if (frameNumber >= _engine->_animations->getNumKeyframes(animPtr)) {
+ frameNumber = _engine->_animations->getStartKeyframe(animPtr);
}
}
_engine->_renderer->setCameraPosition(100, 400, 128, 900, 900);
- _engine->_renderer->setCameraAngle(v5);
- _engine->_renderer->setLightVector(v5);
+ _engine->_renderer->setCameraAngle(0, 0, 0, angle1, angle2, angle3, 5300);
+ _engine->_renderer->setLightVector(angle1, angle2, 0);
_engine->_interface->blitBox(v5);
_engine->_renderer->renderIsoModel(v19, v5);
_engine->copyBlockPhys(v5);
_engine->_renderer->setCameraPosition(400, 240, 128, 1024, 1024);
_engine->_renderer->setCameraAngle(v5);
_engine->_renderer->setLightVector(v5);
- if (v24 + 40 <= _engine->lbaTime) {
- v24 = _engine->lbaTime;
+ if (frameTime + 40 <= _engine->lbaTime) {
+ frameTime = _engine->lbaTime;
if (v17 >= v29 && v17 > v29) {
break;
}
@@ -193,7 +201,7 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
_engine->_renderer->getBaseRotationPosition(v1, v0);
_engine->_renderer->setCameraAngle(v0);
_engine->_renderer->getBaseRotationPosition(v2, v0);
- _engine->_renderer->resetClip();
+ _engine->_interface->resetClip();
_engine->_renderer->renderIsoModel(v3, v0);
_engine->copyBlockPhys(v0);
}
@@ -237,6 +245,24 @@ int32 Holomap::getNextHolomapLocation(int32 currentLocation, int32 dir) const {
return -1;
}
+#if 0
+static int sortHolomapSurfaceCoordsByX(int a1, int a2) {
+ return *(_WORD *)a1 - *(_WORD *)a2;
+}
+
+int fullRedrawS2S1S3(int a1, int a2)
+{
+ int result = 24 * (a1 - a2) >> 9;
+ return orthoProjX + result;
+}
+
+int sub_2654F(int a1, int a2)
+{
+ return getBaseRotationPosition(*(_DWORD *)(a2 + 8), a1, *(_DWORD *)(a2 + 12), *(_DWORD *)(a2 + 16));
+}
+
+#endif
+
void Holomap::processHolomap() {
ScopedEngineFreeze freeze(_engine);
@@ -319,6 +345,17 @@ void Holomap::processHolomap() {
if (redraw) {
redraw = false;
+ int n = 0;
+ for (int locationIdx = 0; locationIdx < NUM_LOCATIONS; ++locationIdx) {
+ if (_engine->_gameState->holomapFlags[locationIdx] & 0x80 || locationIdx == _engine->_scene->currentSceneIdx) {
+ uint8 flags = _engine->_gameState->holomapFlags[locationIdx] & 1;
+ if (locationIdx == _engine->_scene->currentSceneIdx) {
+ flags |= 2u; // model type
+ }
+ ++n;
+ }
+ }
+ // TODO: sort drawlist (for what? y?)
// TODO
}
diff --git a/engines/twine/renderer/renderer.h b/engines/twine/renderer/renderer.h
index 18c4994702..7b8fb69e88 100644
--- a/engines/twine/renderer/renderer.h
+++ b/engines/twine/renderer/renderer.h
@@ -320,7 +320,6 @@ private:
bool renderAnimatedModel(ModelData *modelData, const uint8 *bodyPtr, RenderCommand *renderCmds);
void circleFill(int32 x, int32 y, int32 radius, uint8 color);
bool renderModelElements(int32 numOfPrimitives, const uint8 *polygonPtr, RenderCommand **renderCmds, ModelData *modelData);
- void getBaseRotationPosition(int32 x, int32 y, int32 z);
void getCameraAnglePositions(int32 x, int32 y, int32 z);
void applyRotation(Matrix *targetMatrix, const Matrix *currentMatrix);
void applyPointsRotation(const pointTab *pointsPtr, int32 numPoints, pointTab *destPoints, const Matrix *rotationMatrix);
@@ -411,6 +410,7 @@ public:
const int16 *const shadeAngleTab3;
void setLightVector(int32 angleX, int32 angleY, int32 angleZ);
+ void getBaseRotationPosition(int32 x, int32 y, int32 z);
static void prepareIsoModel(uint8 *bodyPtr);
void renderPolygons(const CmdRenderPolygon &polygon, Vertex *vertices);
Commit: 249e795a5d958d9ae55575c32ed26ee343356d42
https://github.com/scummvm/scummvm/commit/249e795a5d958d9ae55575c32ed26ee343356d42
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-01-12T23:01:01+01:00
Commit Message:
TWINE: more progress on holomap reversing - but disabled
Changed paths:
engines/twine/holomap.cpp
diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 6c56e65028..c2eb570724 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -345,17 +345,172 @@ void Holomap::processHolomap() {
if (redraw) {
redraw = false;
+#if 0
+ _engine->_interface->blitBox(rect, _engine->workVideoBuffer, _engine->frontVideoBuffer);
+ _engine->_renderer->setCameraAngle();
+ _engine->_renderer->setLightVector(v0);
+#endif
int n = 0;
for (int locationIdx = 0; locationIdx < NUM_LOCATIONS; ++locationIdx) {
- if (_engine->_gameState->holomapFlags[locationIdx] & 0x80 || locationIdx == _engine->_scene->currentSceneIdx) {
+ if ((_engine->_gameState->holomapFlags[locationIdx] & 0x80) || locationIdx == _engine->_scene->currentSceneIdx) {
uint8 flags = _engine->_gameState->holomapFlags[locationIdx] & 1;
if (locationIdx == _engine->_scene->currentSceneIdx) {
flags |= 2u; // model type
}
+#if 0
+ const Location &loc = _locations[locationIdx];
+ _engine->_renderer->setBaseRotation(angles);
+ _engine->_renderer->getBaseRotationPosition(loc.x, loc.y, loc.z);
+ int32 v20 = _engine->_renderer->destX;
+ int32 v19 = _engine->_renderer->destZ;
+ int32 v18 = _engine->_renderer->destY;
+ _engine->_renderer->getBaseRotationPosition(v9, v4);
+ _engine->_renderer->setBaseRotation(v4);
+ _engine->_renderer->baseRotPosX = 0;
+ _engine->_renderer->baseRotPosY = 0;
+ _engine->_renderer->baseRotPosZ = 9500;
+ _engine->_renderer->getBaseRotationPosition(v10, v4);
+ int32 v21 = _engine->_renderer->destY;
+ _engine->_renderer->getBaseRotationPosition(v11, v4);
+ if (a4) {
+ if (v21 > _engine->_renderer->destY) {
+ continue;
+ }
+ } else {
+ if (v21 < _engine->_renderer->destY) {
+ continue;
+ }
+ }
+
+ DrawListStruct &drawList = _engine->_redraw->drawList[n];
+ drawList.posValue = locationIdx;
+ drawList.y = v18; // ? TODO
+ drawList.z = v19;
+ drawList.x = v20;
+ drawList.y = v21;
+ drawList.field_A = flags;
+#endif
++n;
}
}
// TODO: sort drawlist (for what? y?)
+#if 0
+ for (int v13 = 0; v13 < n; ++v13) {
+ const DrawListStruct &drawList = _engine->_redraw->drawList[n];
+ const uint8 flags = drawList.field_A;
+ const uint8* bodyPtr = nullptr;
+ if (flags < 2u) {
+ if (flags == 1) {
+ bodyPtr = _engine->_resources->holomapArrowPtr;
+ }
+ } else {
+ if (flags <= 2u) {
+ bodyPtr = _engine->_resources->holomapTwinsenModelPtr;
+ } else {
+ if (flags == 3) {
+ bodyPtr = _engine->_resources->holomapTwinsenArrowPtr;
+ }
+ }
+ }
+ if (bodyPtr != nullptr) {
+ _engine->_renderer->renderIsoModel(x, y, z, angleX, angleY, angleZ, bodyPtr);
+ }
+ }
+
+ _engine->_renderer->setCameraAngle();
+
+ _engine->_renderer->baseRotPosX = 0;
+ _engine->_renderer->baseRotPosY = 0;
+ _engine->_renderer->baseRotPosZ = 9500;
+ v12 = -256;
+ v1 = videoPtr1;
+ v2 = videoPtr2; // holomap surface - 748 * 4 == 4488 (size of that buffer)
+ v3 = videoPtr11; // rotated x and y positions sorted
+ do {
+ v13 = 0;
+ while (1) {
+ v7 = v2 + 2; // rot y
+ v8 = v2 + 4; // rot z
+ if (v13 >= 1024) {// 1024 == 360 degree
+ break;
+ }
+ destZ = *(_WORD *)v7;
+ v4 = *(_WORD *)v8;
+ destX = *(_WORD *)v2;
+ destY = v4;
+ v2 += 6; // advance to next entry in holomap surface surface coordinates
+ sub_2654F(v8, v0);
+ if (v12 != 256) {
+ *(_WORD *)v3 = destY;
+ v5 = v3 + 2;
+ *(_WORD *)v5 = (v1 - videoPtr1) >> 1;
+ v3 = v5 + 2;
+ }
+ _engine->_renderer->projectPositionOnScreen(v0);
+ *(_WORD *)v1 = _engine->_renderer->projPosX;
+ v6 = v1 + 2;
+ v13 += 32;
+ *(_WORD *)v6 = _engine->_renderer->projPosY;
+ v1 = v6 + 6;
+ }
+ destZ = *(_WORD *)v7;
+ destY = *(_WORD *)v8;
+ destX = *(_WORD *)v2;
+ v2 += 6;
+ sub_2654F(v8, v0);
+ _engine->_renderer->projectPositionOnScreen(v0);
+ *(_WORD *)v1 = _engine->_renderer->projPosX;
+ v10 = v1 + 2;
+ v12 += 32;
+ *(_WORD *)v10 = _engine->_renderer->projPosY;
+ v1 = v10 + 6;
+ } while (v12 <= 256);
+ qsort(videoPtr11, 512, 4, sortHolomapSurfaceCoordsByX);
+
+ v1 = 0;
+ do { // y
+ v2 = videoPtr1 + 2 * *(_WORD *)(v1 + videoPtr11 + 2);
+ backDialogueBoxRight = *(_WORD *)v2;
+ backDialogueBoxBottom = *(_WORD *)(v2 + 2);
+ back2DialogueBoxRight = *(_WORD *)(v2 + 264);
+ back2DialogueBoxBottom = *(_WORD *)(v2 + 266);
+ back3DialogueBoxRight = *(_WORD *)(v2 + 8);
+ back3DialogueBoxBottom = *(_WORD *)(v2 + 10);
+ if (sub_26DAB(v0)) {
+ word_4B776 = *(_WORD *)(v2 + 4);
+ word_4B778 = *(_WORD *)(v2 + 6);
+ word_4B77C = *(_WORD *)(v2 + 268);
+ word_4B77E = *(_WORD *)(v2 + 270);
+ word_4B782 = *(_WORD *)(v2 + 12);
+ word_4B784 = *(_WORD *)(v2 + 14);
+ sub_2E894(); // handles polyTab, polyTab2, circleBuffer, maybe model rendering?
+ sub_2F1D1(v0); // some kind of blitting?
+ }
+ backDialogueBoxRight = *(_WORD *)(v2 + 264);
+ backDialogueBoxBottom = *(_WORD *)(v2 + 266);
+ back2DialogueBoxRight = *(_WORD *)(v2 + 272);
+ back2DialogueBoxBottom = *(_WORD *)(v2 + 274);
+ back3DialogueBoxRight = *(_WORD *)(v2 + 8);
+ back3DialogueBoxBottom = *(_WORD *)(v2 + 10);
+ v3 = sub_26DAB(v0);
+ if (v3) {
+ word_4B776 = *(_WORD *)(v2 + 268);
+ word_4B778 = *(_WORD *)(v2 + 270);
+ word_4B77C = *(_WORD *)(v2 + 276);
+ word_4B77E = *(_WORD *)(v2 + 278);
+ word_4B782 = *(_WORD *)(v2 + 12);
+ word_4B784 = *(_WORD *)(v2 + 14);
+ sub_2E894();
+ LOBYTE(v3) = sub_2F1D1(v0); // some kind of blitting?
+ }
+ v1 += 4;
+ } while (v1 != 4 * 512);
+
+ if (v10) {
+ blitRect();
+ }
+ _engine->_renderer->copyBlockPhys(v0);
+#endif
// TODO
}
More information about the Scummvm-git-logs
mailing list