[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