[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