[Scummvm-git-logs] scummvm master -> 49cfb436e8a4af96bf65ee5f17b91dbdab8d4143

mgerhardy martin.gerhardy at gmail.com
Sun Mar 7 13:04:51 UTC 2021


This automated email contains information about 6 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
c6b6495173 TWINE: use Vec3 variant of projectPositionOnScreen
a1e76d8ef1 TWINE: fixed TwinEEngine::unlockAchievement
7a298a408b TWINE: holomap only needs x and y projected to the screen
bafabc493e TWINE: comments
a43c19ca72 TWINE: converted HolomapProjectedPos unk1 and unk2 to signed short
49cfb436e8 TWINE: holomap surface pos rotation reversed


Commit: c6b6495173e02991c4547e96249c7e09b4469087
    https://github.com/scummvm/scummvm/commit/c6b6495173e02991c4547e96249c7e09b4469087
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-03-07T14:03:59+01:00

Commit Message:
TWINE: use Vec3 variant of projectPositionOnScreen

Changed paths:
    engines/twine/holomap.cpp
    engines/twine/scene/grid.h


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 01a9a5b901..b42a408279 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -177,7 +177,7 @@ void Holomap::prepareHolomapPolygons() {
 				_holomapSort[holomapSortArrayIdx].projectedPosIdx = _projectedSurfaceIndex;
 				++holomapSortArrayIdx;
 			}
-			_engine->_renderer->projectPositionOnScreen(_engine->_renderer->destPos.x, _engine->_renderer->destPos.y, _engine->_renderer->destPos.z);
+			_engine->_renderer->projectPositionOnScreen(_engine->_renderer->destPos);
 			_projectedSurfacePositions[_projectedSurfaceIndex].x = _engine->_renderer->projPos.x;
 			_projectedSurfacePositions[_projectedSurfaceIndex].y = _engine->_renderer->projPos.y;
 			rotation += ANGLE_11_25;
@@ -185,7 +185,7 @@ void Holomap::prepareHolomapPolygons() {
 		}
 		HolomapSurface* vec = &_holomapSurface[holomapSurfaceArrayIdx++];
 		_engine->_renderer->getBaseRotationPosition(vec->x, vec->y, vec->z);
-		_engine->_renderer->projectPositionOnScreen(_engine->_renderer->destPos.x, _engine->_renderer->destPos.y, _engine->_renderer->destPos.z);
+		_engine->_renderer->projectPositionOnScreen(_engine->_renderer->destPos);
 		_projectedSurfacePositions[_projectedSurfaceIndex].x = _engine->_renderer->projPos.x;
 		_projectedSurfacePositions[_projectedSurfaceIndex].y = _engine->_renderer->projPos.y;
 		rotation += ANGLE_11_25;
diff --git a/engines/twine/scene/grid.h b/engines/twine/scene/grid.h
index 3f5625021a..30c3342fa8 100644
--- a/engines/twine/scene/grid.h
+++ b/engines/twine/scene/grid.h
@@ -74,6 +74,9 @@ struct BrickEntry {
 /** Grip Z size */
 #define GRID_SIZE_Z GRID_SIZE_X
 
+#define BRICK_SIZE 512
+#define BRICK_HEIGHT 256
+
 // short max
 #define SCENE_SIZE_MAX (BRICK_SIZE * GRID_SIZE_X - 1)
 // short min
@@ -81,9 +84,6 @@ struct BrickEntry {
 #define SCENE_SIZE_HALF (BRICK_SIZE * GRID_SIZE_X / 2)
 #define SCENE_SIZE_HALFF (BRICK_SIZE * GRID_SIZE_X / 2.0f)
 
-#define BRICK_SIZE 512
-#define BRICK_HEIGHT 256
-
 #define MAXBRICKS 150
 
 class TwinEEngine;


Commit: a1e76d8ef16b8a79d8e9d75892e5bc2aca61f4c8
    https://github.com/scummvm/scummvm/commit/a1e76d8ef16b8a79d8e9d75892e5bc2aca61f4c8
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-03-07T14:03:59+01:00

Commit Message:
TWINE: fixed TwinEEngine::unlockAchievement

Changed paths:
    engines/twine/holomap.cpp
    engines/twine/twine.cpp


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index b42a408279..4973754e55 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -169,7 +169,7 @@ void Holomap::prepareHolomapPolygons() {
 	_engine->_renderer->setBaseRotation(0, 0, 0);
 	for (int32 angle = -ANGLE_90; angle <= ANGLE_90; angle += ANGLE_11_25) {
 		int rotation = 0;
-		for (int32 stepWidth = ANGLE_11_25; stepWidth != 0; --stepWidth) {
+		for (int32 stepWidth = 0; stepWidth < ANGLE_11_25; ++stepWidth) {
 			HolomapSurface* vec = &_holomapSurface[holomapSurfaceArrayIdx++];
 			_engine->_renderer->getBaseRotationPosition(vec->x, vec->y, vec->z);
 			if (angle != ANGLE_90) {
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 42b823aa12..eb7321fd11 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -1151,7 +1151,7 @@ const char *TwinEEngine::getGameId() const {
 
 bool TwinEEngine::unlockAchievement(const Common::String &id) {
 	const MetaEngine &meta = getMetaEngine();
-	const Common::AchievementsInfo &achievementsInfo = meta.getAchievementsInfo(getGameId());
+	const Common::AchievementsInfo &achievementsInfo = meta.getAchievementsInfo(ConfMan.getActiveDomainName());
 
 	Common::String msg = id;
 	for (uint32 i = 0; i < achievementsInfo.descriptions.size(); i++) {


Commit: 7a298a408b585b403ecdbbcbf4aacb6abc1a0bf6
    https://github.com/scummvm/scummvm/commit/7a298a408b585b403ecdbbcbf4aacb6abc1a0bf6
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-03-07T14:03:59+01:00

Commit Message:
TWINE: holomap only needs x and y projected to the screen

Changed paths:
    engines/twine/holomap.cpp
    engines/twine/renderer/renderer.cpp
    engines/twine/renderer/renderer.h


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 4973754e55..e9186adf9e 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -177,7 +177,7 @@ void Holomap::prepareHolomapPolygons() {
 				_holomapSort[holomapSortArrayIdx].projectedPosIdx = _projectedSurfaceIndex;
 				++holomapSortArrayIdx;
 			}
-			_engine->_renderer->projectPositionOnScreen(_engine->_renderer->destPos);
+			_engine->_renderer->projectXYPositionOnScreen(_engine->_renderer->destPos);
 			_projectedSurfacePositions[_projectedSurfaceIndex].x = _engine->_renderer->projPos.x;
 			_projectedSurfacePositions[_projectedSurfaceIndex].y = _engine->_renderer->projPos.y;
 			rotation += ANGLE_11_25;
@@ -185,7 +185,7 @@ void Holomap::prepareHolomapPolygons() {
 		}
 		HolomapSurface* vec = &_holomapSurface[holomapSurfaceArrayIdx++];
 		_engine->_renderer->getBaseRotationPosition(vec->x, vec->y, vec->z);
-		_engine->_renderer->projectPositionOnScreen(_engine->_renderer->destPos);
+		_engine->_renderer->projectXYPositionOnScreen(_engine->_renderer->destPos);
 		_projectedSurfacePositions[_projectedSurfaceIndex].x = _engine->_renderer->projPos.x;
 		_projectedSurfacePositions[_projectedSurfaceIndex].y = _engine->_renderer->projPos.y;
 		rotation += ANGLE_11_25;
diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 4c06336d60..c8dc593385 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -64,6 +64,27 @@ void Renderer::init(int32 w, int32 h) {
 	_holomap_polytab_1_3_ptr = _holomap_polytab_1_3;
 }
 
+void Renderer::projectXYPositionOnScreen(int32 x, int32 y, int32 z) {
+	if (isUsingOrthoProjection == 1) {
+		projPos.x = ((x - z) * 24) / BRICK_SIZE + orthoProjPos.x;
+		projPos.y = y;
+		return;
+	}
+	int32 cz = baseRotPos.z - z;
+	if (-1 < cz) {
+		int32 posZ = cz + cameraDepthOffset;
+		if (posZ < 0) {
+			posZ = 0x7FFF;
+		}
+		projPos.x = (cz * cameraScaleY) / posZ + orthoProjPos.x;
+		projPos.y = y - baseRotPos.y;
+		return;
+	}
+	projPos.x = 0;
+	projPos.y = 0;
+	return;
+}
+
 int32 Renderer::projectPositionOnScreen(int32 cX, int32 cY, int32 cZ) {
 	if (isUsingOrthoProjection) {
 		projPos.x = ((cX - cZ) * 24) / BRICK_SIZE + orthoProjPos.x;
diff --git a/engines/twine/renderer/renderer.h b/engines/twine/renderer/renderer.h
index 4cbccea70e..8870c61c68 100644
--- a/engines/twine/renderer/renderer.h
+++ b/engines/twine/renderer/renderer.h
@@ -417,6 +417,11 @@ public:
 	}
 
 	int32 projectPositionOnScreen(int32 cX, int32 cY, int32 cZ);
+
+	inline void projectXYPositionOnScreen(const Vec3& pos) {
+		projectXYPositionOnScreen(pos.x, pos.y, pos.z);
+	}
+	void projectXYPositionOnScreen(int32 x,int32 y,int32 z);
 	void setCameraPosition(int32 x, int32 y, int32 depthOffset, int32 scaleY, int32 scaleZ);
 	void setCameraAngle(int32 transPosX, int32 transPosY, int32 transPosZ, int32 rotPosX, int32 rotPosY, int32 rotPosZ, int32 param6);
 	void setBaseTranslation(int32 x, int32 y, int32 z);


Commit: bafabc493e90d7efc01b22844044fd93ae37b4a1
    https://github.com/scummvm/scummvm/commit/bafabc493e90d7efc01b22844044fd93ae37b4a1
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-03-07T14:03:59+01:00

Commit Message:
TWINE: comments

Changed paths:
    engines/twine/holomap.cpp
    engines/twine/holomap.h


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index e9186adf9e..0aa9dae5ff 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -162,6 +162,7 @@ void Holomap::prepareHolomapProjectedPositions() {
 	}
 }
 
+// verified with disassembly
 void Holomap::prepareHolomapPolygons() {
 	int holomapSortArrayIdx = 0;
 	int holomapSurfaceArrayIdx = 0;
diff --git a/engines/twine/holomap.h b/engines/twine/holomap.h
index 8e28f07bc3..b7e5f7ac45 100644
--- a/engines/twine/holomap.h
+++ b/engines/twine/holomap.h
@@ -71,6 +71,7 @@ private:
 	};
 	HolomapSurface _holomapSurface[561];
 
+	// original game size: 2244 (lba1)
 	struct HolomapSort {
 		int16 z = 0;
 		uint16 projectedPosIdx = 0;


Commit: a43c19ca7207472e829e1113a37b7aacc1d75219
    https://github.com/scummvm/scummvm/commit/a43c19ca7207472e829e1113a37b7aacc1d75219
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-03-07T14:03:59+01:00

Commit Message:
TWINE: converted HolomapProjectedPos unk1 and unk2 to signed short

Changed paths:
    engines/twine/holomap.cpp
    engines/twine/holomap.h


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 0aa9dae5ff..09c1ba3cd1 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -138,6 +138,7 @@ void Holomap::prepareHolomapSurface() {
 	assert(stream.eos());
 }
 
+// verified with disassembly
 void Holomap::prepareHolomapProjectedPositions() {
 	int projectedIndex = 0;
 	for (int32 angle = -ANGLE_90; angle <= ANGLE_90; angle += ANGLE_11_25) {
@@ -145,18 +146,18 @@ void Holomap::prepareHolomapProjectedPositions() {
 		for (int32 i = 0; i < ANGLE_11_25; ++i) {
 			_projectedSurfacePositions[projectedIndex].unk1 = _engine->_screens->crossDot(0, 0xffff, ANGLE_360 - 1, rotation);
 			if (angle == ANGLE_90) {
-				_projectedSurfacePositions[projectedIndex].unk2 = 0xffff;
+				_projectedSurfacePositions[projectedIndex].unk2 = -1;
 			} else {
-				_projectedSurfacePositions[projectedIndex].unk2 = (int16)(((angle + ANGLE_90) * ANGLE_90) / 2);
+				_projectedSurfacePositions[projectedIndex].unk2 = ((angle + ANGLE_90) * ANGLE_90) / 2;
 			}
 			rotation += ANGLE_11_25;
 			++projectedIndex;
 		}
-		_projectedSurfacePositions[projectedIndex].unk1 = 0xffff;
+		_projectedSurfacePositions[projectedIndex].unk1 = -1;
 		if (angle == ANGLE_90) {
-			_projectedSurfacePositions[projectedIndex].unk2 = 0xffff;
+			_projectedSurfacePositions[projectedIndex].unk2 = -1;
 		} else {
-			_projectedSurfacePositions[projectedIndex].unk2 = (int16)(((angle + ANGLE_90) * ANGLE_90) / 2);
+			_projectedSurfacePositions[projectedIndex].unk2 = ((angle + ANGLE_90) * ANGLE_90) / 2;
 		}
 		++projectedIndex;
 	}
diff --git a/engines/twine/holomap.h b/engines/twine/holomap.h
index b7e5f7ac45..0c4765b4f8 100644
--- a/engines/twine/holomap.h
+++ b/engines/twine/holomap.h
@@ -81,8 +81,8 @@ private:
 	struct HolomapProjectedPos {
 		int16 x = 0;
 		int16 y = 0;
-		uint16 unk1 = 0;
-		uint16 unk2 = 0;
+		int16 unk1 = 0;
+		int16 unk2 = 0;
 	};
 	HolomapProjectedPos _projectedSurfacePositions[2048];
 	int _projectedSurfaceIndex = 0;


Commit: 49cfb436e8a4af96bf65ee5f17b91dbdab8d4143
    https://github.com/scummvm/scummvm/commit/49cfb436e8a4af96bf65ee5f17b91dbdab8d4143
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-03-07T14:03:59+01:00

Commit Message:
TWINE: holomap surface pos rotation reversed

Changed paths:
    engines/twine/holomap.cpp
    engines/twine/renderer/renderer.cpp
    engines/twine/renderer/renderer.h


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 09c1ba3cd1..368901f3a2 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -117,6 +117,7 @@ static int sortHolomapSurfaceCoordsByDepth(const void *a1, const void *a2) {
 	return *(const int16 *)a1 - *(const int16 *)a2;
 }
 
+// verified with disassembly
 void Holomap::prepareHolomapSurface() {
 	Common::MemoryReadStream stream(_engine->_resources->holomapSurfacePtr, _engine->_resources->holomapSurfaceSize);
 	int holomapSurfaceArrayIdx = 0;
@@ -125,13 +126,10 @@ void Holomap::prepareHolomapSurface() {
 		int rotation = 0;
 		for (int i = 0; i <= ANGLE_11_25; ++i, rotation += ANGLE_11_25) {
 			const int32 rotX = stream.readByte();
-			_engine->_movements->rotateActor(rotX * 2 + 1000, 0, angle);
-			const int32 tmpDestY = _engine->_renderer->destPos.z;
-			_engine->_movements->rotateActor(_engine->_renderer->destPos.x, 0, rotation);
-			_engine->_renderer->getBaseRotationPosition(_engine->_renderer->destPos.x, tmpDestY, _engine->_renderer->destPos.z);
-			_holomapSurface[holomapSurfaceArrayIdx].x = _engine->_renderer->destPos.x;
-			_holomapSurface[holomapSurfaceArrayIdx].y = _engine->_renderer->destPos.y;
-			_holomapSurface[holomapSurfaceArrayIdx].z = _engine->_renderer->destPos.z;
+			const Vec3& rotVec = _engine->_renderer->getHolomapRotation(rotX, angle, rotation);
+			_holomapSurface[holomapSurfaceArrayIdx].x = rotVec.x;
+			_holomapSurface[holomapSurfaceArrayIdx].y = rotVec.y;
+			_holomapSurface[holomapSurfaceArrayIdx].z = rotVec.z;
 			++holomapSurfaceArrayIdx;
 		}
 	}
diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index c8dc593385..8af65e04a7 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -218,6 +218,40 @@ void Renderer::setCameraAngle(int32 transPosX, int32 transPosY, int32 transPosZ,
 	baseTransPos = destPos;
 }
 
+Vec3 Renderer::getHolomapRotation(const int32 angleX, const int32 angleY, const int32 angleZ) const {
+	int32 rotX;
+	int32 rotY;
+	int32 rotZ;
+
+	rotX = angleX * 2 + 1000;
+	if (angleY == ANGLE_0) {
+		rotY = ANGLE_0;
+	} else {
+		rotY = -shadeAngleTable[ClampAngle(angleY)] * rotX / SCENE_SIZE_HALF;
+		rotX = shadeAngleTable[ClampAngle(angleY + ANGLE_90)] * rotX / SCENE_SIZE_HALF;
+	}
+	if (angleZ == ANGLE_0) {
+		rotZ = ANGLE_0;
+	} else {
+		rotZ = -shadeAngleTable[ClampAngle(angleZ)] * rotX / SCENE_SIZE_HALF;
+		rotX = shadeAngleTable[ClampAngle(angleZ + ANGLE_90)] * rotX / SCENE_SIZE_HALF;
+	}
+	const int32 row1X = baseMatrix.row1[0] * rotX;
+	const int32 row1Y = baseMatrix.row1[1] * rotY;
+	const int32 row1Z = baseMatrix.row1[2] * rotZ;
+	const int32 row2X = baseMatrix.row2[0] * rotX;
+	const int32 row2Y = baseMatrix.row2[1] * rotY;
+	const int32 row2Z = baseMatrix.row2[2] * rotZ;
+	const int32 row3X = baseMatrix.row3[0] * rotX;
+	const int32 row3Y = baseMatrix.row3[1] * rotY;
+	const int32 row3Z = baseMatrix.row3[2] * rotZ;
+	Vec3 vec;
+	vec.x = (row1X + row1Y + row1Z) / SCENE_SIZE_HALF;
+	vec.y = (row2X + row2Y + row2Z) / SCENE_SIZE_HALF;
+	vec.z = (row3X + row3Y + row3Z) / SCENE_SIZE_HALF;
+	return vec;
+}
+
 void Renderer::applyRotation(Matrix *targetMatrix, const Matrix *currentMatrix) {
 	Matrix matrix1;
 	Matrix matrix2;
diff --git a/engines/twine/renderer/renderer.h b/engines/twine/renderer/renderer.h
index 8870c61c68..8525b07dac 100644
--- a/engines/twine/renderer/renderer.h
+++ b/engines/twine/renderer/renderer.h
@@ -403,6 +403,7 @@ public:
 	Vec3 baseRotPos;
 	Vec3 orthoProjPos;
 	Vec3 destPos;
+	Vec3 getHolomapRotation(const int32 angleX, const int32 angleY, const int32 angleZ) const;
 
 	const int16 *const shadeAngleTab3;
 




More information about the Scummvm-git-logs mailing list