[Scummvm-git-logs] scummvm master -> 9a4adf76a4269142678cf87dbf6fdb8664b89d83

mgerhardy martin.gerhardy at gmail.com
Sun Jan 24 14:28:09 UTC 2021


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

Summary:
9a4adf76a4 TWINE: progress on holomap surface


Commit: 9a4adf76a4269142678cf87dbf6fdb8664b89d83
    https://github.com/scummvm/scummvm/commit/9a4adf76a4269142678cf87dbf6fdb8664b89d83
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-01-24T15:27:03+01:00

Commit Message:
TWINE: progress on holomap surface

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


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index f752847e67..1ed9bf1558 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -103,42 +103,101 @@ void Holomap::loadHolomapGFX() {
 	needToLoadHolomapGFX = 0;
 }
 
+static int sortHolomapSurfaceCoordsByDepth(const void *a1, const void *a2) {
+	return *(const int16 *)a1 - *(const int16 *)a2;
+}
+
 void Holomap::prepareHolomapSurface() {
-	//int16 *puVar1 = _DAT_0043f7ec;
 	Common::MemoryReadStream stream(_engine->_resources->holomapSurfacePtr, _engine->_resources->holomapSurfaceSize);
-	//Vec3 buffer[10000];
-	//int16 *puVar3 = _DAT_0043f7f0;
+	int holomapSurfaceArrayIdx = 0;
+	int projectedIndex = 0;
 	for (int32 angle = -ANGLE_90; angle <= ANGLE_90; angle += ANGLE_11_25) {
-		//int16 *puVar4;
-		for (int stepWidth = ANGLE_11_25; stepWidth != 0; --stepWidth) {
-			//puVar4 = puVar3;
+		int rotation = 0;
+		for (int32 stepWidth = ANGLE_11_25; stepWidth != 0; --stepWidth) {
 			const int32 destX = stream.readSint16LE();
 			const int32 destY = stream.readSint16LE();
 			const int32 destZ = stream.readSint16LE();
 			_engine->_renderer->getBaseRotationPosition(destX, destY, destZ);
-			if (angle != 0x100) {
-				//	puVar1[0] = destZ;
-				//	puVar1[1] = (short)((int)((int)puVar4 - (int)_DAT_0043f7f0) >> 1);
-				//	++puVar1;
+			if (angle != ANGLE_90) {
+				_holomapSurface[holomapSurfaceArrayIdx].z = destZ;
+				_holomapSurface[holomapSurfaceArrayIdx].projectedPosIdx = projectedIndex;
+				++holomapSurfaceArrayIdx;
 			}
 			_engine->_renderer->projectPositionOnScreen(destX, destY, destZ);
-			//puVar4[0] = projPosX;
-			//puVar4[1] = projPosY;
-			//puVar3 = puVar4 + 4;
+			_projectedSurfacePositions[projectedIndex].x = _engine->_renderer->projPosX;
+			_projectedSurfacePositions[projectedIndex].y = _engine->_renderer->projPosY;
+			_projectedSurfacePositions[projectedIndex].unk1 = _engine->_screens->crossDot(0, 0xffff, 0x3ff, rotation);
+			if (angle == ANGLE_90) {
+				_projectedSurfacePositions[projectedIndex].unk2 = 0xffff;
+			} else {
+				_projectedSurfacePositions[projectedIndex].unk2 = (short)(((angle + ANGLE_90) * ANGLE_90) / 2);
+			}
+			rotation = rotation + ANGLE_11_25;
+			++projectedIndex;
 		}
 		const int32 destX = stream.readSint16LE();
 		const int32 destY = stream.readSint16LE();
 		const int32 destZ = stream.readSint16LE();
 		_engine->_renderer->getBaseRotationPosition(destX, destY, destZ);
 		_engine->_renderer->projectPositionOnScreen(destX, destY, destZ);
-		//puVar4[4] = projPosX;
-		//puVar4[5] = projPosY;
-		//puVar3 = puVar4 + 8;
+		_projectedSurfacePositions[projectedIndex].x = _engine->_renderer->projPosX;
+		_projectedSurfacePositions[projectedIndex].y = _engine->_renderer->projPosY;
+		_projectedSurfacePositions[projectedIndex].unk1 = 0xffff;
+		if (angle == ANGLE_90) {
+			_projectedSurfacePositions[projectedIndex].unk2 = 0xffff;
+		} else {
+			_projectedSurfacePositions[projectedIndex].unk2 = (short)(((angle + ANGLE_90) * ANGLE_90) / 2);
+		}
+		++projectedIndex;
 	}
-	//FUN_004253e8(_DAT_0043f7ec,(undefined4 *)0x200,4,&LAB_00413d20);
+	qsort(_holomapSurface, ARRAYSIZE(_holomapSurface), sizeof(HolomapSurface), sortHolomapSurfaceCoordsByDepth);
 }
 
-void Holomap::prepareHolomapPolygons() {
+void Holomap::renderHolomapSurfacePolygons() {
+	prepareHolomapSurface();
+	for (int32 i = 0; i < ARRAYSIZE(_holomapSurface); ++i) {
+		// const HolomapProjectedPos &pos1 = _projectedSurfacePositions[_holomapSurface[i].projectedPosIdx + 0];
+		// const HolomapProjectedPos &pos2 = _projectedSurfacePositions[_holomapSurface[i].projectedPosIdx + 1];
+		// const HolomapProjectedPos &pos3 = _projectedSurfacePositions[_holomapSurface[i].projectedPosIdx + 2];
+		// const HolomapProjectedPos &pos4 = _projectedSurfacePositions[_holomapSurface[i].projectedPosIdx + 3];
+		// TODO: build triangles from projected pos with texcoords from holomapimg
+# if 0
+		v2 = _projectedSurfacePositions + 2 * *(_WORD *)(i + _holomapSurface + 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?
+		}
+#endif
+	}
 }
 
 void Holomap::drawHolomapText(int32 centerx, int32 top, const char *title) {
@@ -161,47 +220,57 @@ void Holomap::renderHolomapModel(byte *mdl_1, int32 x_2, int32 y_3, int32 zPos)
 	int32 trajRotPosY = 0; // TODO DAT_0043f710 5th short value of the trajectory data TrajectoryData::y
 	int32 trajRotPosZ = 0; // TODO _DAT_0043f7f8 6th short value of the trajectory data TrajectoryData::z
 	_engine->_renderer->setCameraAngle(0, 0, 0, trajRotPosX, trajRotPosY, trajRotPosZ, 5300);
-	_engine->_renderer->getBaseRotationPosition(x_1, y_2, (short)iVar1);
+	_engine->_renderer->getBaseRotationPosition(x_1, y_2, iVar1);
 	_engine->_interface->resetClip();
-	_engine->_renderer->renderIsoModel(x_1, y_2, iVar1, (int)x_2, (int)y_3, 0, mdl_1);
+	_engine->_renderer->renderIsoModel(x_1, y_2, iVar1, x_2, y_3, 0, mdl_1);
 }
 
 Holomap::TrajectoryData Holomap::loadTrajectoryData(int32 trajectoryIdx) {
 	TrajectoryData data;
-	const uint8 *ptr = _engine->_resources->holomapPointAnimPtr;
-	//Common::MemoryReadStream stream(_engine->_resources->holomapPointAnimPtr, _engine->_resources->holomapPointAnimSize);
+	Common::MemoryReadStream stream(_engine->_resources->holomapPointAnimPtr, _engine->_resources->holomapPointAnimSize);
 	for (int32 trajIdx = 0; trajIdx < trajectoryIdx; ++trajIdx) {
-		const int16 animVal = *(const int16 *)(ptr + 12);
-		ptr += 4 * animVal + 14;
+		stream.skip(12);
+		const int16 animVal = stream.readSint16LE();
+		stream.skip(4 * animVal);
+	}
+	data.locationIdx = stream.readSint16LE();
+	data.trajLocationIdx = stream.readSint16LE();
+	data.vehicleIdx = stream.readSint16LE();
+	data.x = stream.readSint16LE();
+	data.y = stream.readSint16LE();
+	data.z = stream.readSint16LE();
+	data.numAnimFrames = stream.readSint16LE();
+	assert(data.numAnimFrames < ARRAYSIZE(data.positions));
+	for (int32 i = 0; i < data.numAnimFrames; ++i) {
+		data.positions[i].x = stream.readSint16LE();
+		data.positions[i].y = stream.readSint16LE();
 	}
-	data.unk1 = *(const int16 *)(ptr + 0);
-	data.unk2 = *(const int16 *)(ptr + 2);
-	data.vehicleIdx = *(const int16 *)(ptr + 4);
-	data.x = *(const int16 *)(ptr + 6);
-	data.y = *(const int16 *)(ptr + 8);
-	data.z = *(const int16 *)(ptr + 10);
-	data.unk4 = *(const int16 *)(ptr + 12); // amount of something of size 4
 	return data;
 }
 
 void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 	debug("Draw trajectory index %i", trajectoryIndex);
-#if 0
 	const Holomap::TrajectoryData &data = loadTrajectoryData(trajectoryIndex);
 	ScopedEngineFreeze timeFreeze(_engine);
 	ScopedKeyMap holomapKeymap(_engine, holomapKeyMapId);
 	_engine->_renderer->setCameraPosition(400, 240, 128, 1024, 1024);
-	prepareHolomapSurface();
-	prepareHolomapPolygons();
+	loadHolomapGFX();
+
+	renderHolomapSurfacePolygons();
 
-	const Location &loc = _locations[_engine->_scene->currentSceneIdx]; // TODO: id is most likely wrong
+	const Location &loc = _locations[data.locationIdx];
 	renderHolomapModel(_engine->_resources->holomapPointModelPtr, loc.x, loc.y, 0);
 
 	_engine->flip();
 	ActorMoveStruct move;
-	const uint8 *animPtr = nullptr;
+	AnimTimerDataStruct animData;
+	uint8 *animPtr = nullptr;
+	HQR::getAllocEntry(&animPtr, Resources::HQR_RESS_FILE, data.getAnimation());
+	uint8 *modelPtr = nullptr;
+	HQR::getAllocEntry(&modelPtr, Resources::HQR_RESS_FILE, data.getModel());
 	int frameNumber = 0;
 	int frameTime = _engine->lbaTime;
+	int trajAnimFrameIdx = 0;
 	for (;;) {
 		ScopedFPS scopedFps;
 		_engine->readKeys();
@@ -209,20 +278,22 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 			break;
 		}
 
+#if 0
 		// TODO
 		if (!v28) {
-			setPalette2(192, 32, (int)&palette2[3 * needToLoadHolomapGFX++]);
-			if (needToLoadHolomapGFX == 32) {
+			setPalette2(576 / 3, 96 / 3, (int)&paletteHolomap[3 * needToLoadHolomapGFX++]);
+			if (needToLoadHolomapGFX == 96 / 3) {
 				needToLoadHolomapGFX = 0;
 			}
 		}
+#endif
 		const int16 newAngle = move.getRealAngle(_engine->lbaTime);
 		if (move.numOfStep == 0) {
 			const int startAngle = ANGLE_0;
 			_engine->_movements->setActorAngleSafe(startAngle, startAngle - ANGLE_90, 500, &move);
 		}
 
-		if (_engine->_animations->setModelAnimation(frameNumber, animPtr, modelPtr, &move)) {
+		if (_engine->_animations->setModelAnimation(frameNumber, animPtr, modelPtr, &animData)) {
 			frameNumber++;
 			if (frameNumber >= _engine->_animations->getNumKeyframes(animPtr)) {
 				frameNumber = _engine->_animations->getStartKeyframe(animPtr);
@@ -231,8 +302,8 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 		_engine->_renderer->setCameraPosition(100, 400, 128, 900, 900);
 		_engine->_renderer->setCameraAngle(0, 0, 0, 0x3c, 0x80, 0, 30000);
 		_engine->_renderer->setLightVector(0xffffffc4, 0x80, 0);
-		_engine->_interface->drawSplittedBox(0, 200, 199, 0x1df, 0);
-		_engine->_renderer->renderIsoModel(0, 0, 0, 0, uVar8, 0);
+		_engine->_interface->drawSplittedBox(Common::Rect(0, 200, 199, 0x1df), 0);
+		_engine->_renderer->renderIsoModel(0, 0, 0, 0, newAngle, 0, modelPtr);
 		_engine->copyBlockPhys(0, 200, 199, 0x1df);
 		_engine->_renderer->setCameraPosition(400, 240, 128, 1024, 1024);
 		const int32 trajRotPosX = data.x; // DAT_0043f706
@@ -242,27 +313,32 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 		_engine->_renderer->setLightVector(trajRotPosX, trajRotPosY, 0);
 		if (frameTime + 40 <= _engine->lbaTime) {
 			frameTime = _engine->lbaTime;
-			if (locationIdx < sVar3) {
-				model_x = psVar9[locationIdx * 2 + 7];
-				model_y = psVar9[locationIdx * 2 + 8];
+			int model_x;
+			int model_y;
+			if (trajAnimFrameIdx < data.numAnimFrames) {
+				model_x = data.positions[trajAnimFrameIdx].x;
+				model_y = data.positions[trajAnimFrameIdx].y;
 			} else {
-				if (sVar3 < locationIdx) {
+				if (data.numAnimFrames < trajAnimFrameIdx) {
 					break;
 				}
-				model_x = *(short *)(sVar2 * 8 + holomapLocationInfo._0_4_);
-				model_y = *(short *)(sVar2 * 8 + 2 + holomapLocationInfo._0_4_);
+				model_x = _locations[data.trajLocationIdx].x;
+				model_y = _locations[data.trajLocationIdx].y;
 			}
-			renderHolomapModel(_holomappointmdl, model_x, model_y, 0);
-			locationIdx = locationIdx + 1;
+			renderHolomapModel(_engine->_resources->holomapPointModelPtr, model_x, model_y, 0);
+			trajAnimFrameIdx = trajAnimFrameIdx + 1;
 		}
+#if 0
 		if (v28) {
 			v28 = 0;
 			_engine->_screens->fadeToPal((int)palette);
 		}
+#endif
 	}
 	_engine->_screens->fadeToBlack(_engine->_screens->paletteRGBA);
 	// TODO: flip()?
-#endif
+	free(animPtr);
+	free(modelPtr);
 }
 
 void Holomap::drawHolomapLocation(int32 location) {
@@ -295,24 +371,6 @@ 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::renderLocations(int xRot, int yRot, int zRot, bool lower) {
 	int n = 0;
 	for (int locationIdx = 0; locationIdx < NUM_LOCATIONS; ++locationIdx) {
@@ -367,11 +425,11 @@ void Holomap::renderLocations(int xRot, int yRot, int zRot, bool lower) {
 		const DrawListStruct &drawList = _engine->_redraw->drawList[v13];
 		const uint16 flags = drawList.field_C;
 		const uint8 *bodyPtr = nullptr;
-		if (flags == 1) {
+		if (flags == 1u) {
 			bodyPtr = _engine->_resources->holomapArrowPtr;
 		} else if (flags == 2u) {
 			bodyPtr = _engine->_resources->holomapTwinsenModelPtr;
-		} else if (flags == 3) {
+		} else if (flags == 3u) {
 			bodyPtr = _engine->_resources->holomapTwinsenArrowPtr;
 		}
 		if (bodyPtr != nullptr) {
@@ -380,97 +438,6 @@ void Holomap::renderLocations(int xRot, int yRot, int zRot, bool lower) {
 			_engine->_renderer->renderIsoModel(drawList.x, drawList.y, drawList.z, angleX, angleY, 0, bodyPtr);
 		}
 	}
-
-#if 0
-	_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);
-#endif
 }
 
 void Holomap::processHolomap() {
@@ -487,6 +454,7 @@ void Holomap::processHolomap() {
 	_engine->setPalette(_engine->_screens->paletteRGBA);
 
 	loadHolomapGFX();
+	renderHolomapSurfacePolygons();
 	_engine->_renderer->setCameraPosition(_engine->width() / 2, 190, 128, 1024, 1024);
 
 	_engine->_text->initTextBank(TextBankId::Inventory_Intro_and_Holomap);
@@ -565,11 +533,10 @@ void Holomap::processHolomap() {
 			_engine->_interface->drawSplittedBox(rect, 0);
 			_engine->_renderer->setBaseRotation(xRot, yRot, 0);
 			_engine->_renderer->setLightVector(xRot, yRot, 0);
-			//renderLocations(xRot, yRot, 0, false); // TODO: activate me
+			// renderLocations(xRot, yRot, 0, false); // TODO: activate me
 			_engine->_renderer->setBaseRotation(xRot, yRot, 0);
-			prepareHolomapSurface();
-			prepareHolomapPolygons();
-			//renderLocations(xRot, yRot, 0, true); // TODO: activate me
+			renderHolomapSurfacePolygons();
+			// renderLocations(xRot, yRot, 0, true); // TODO: activate me
 			if (rotate) {
 				_engine->_menu->drawBox(300, 170, 340, 210);
 			}
diff --git a/engines/twine/holomap.h b/engines/twine/holomap.h
index 6be9cb7cf7..830b9bef84 100644
--- a/engines/twine/holomap.h
+++ b/engines/twine/holomap.h
@@ -60,14 +60,32 @@ private:
 		HamalayiTransporter = 47
 	};
 
+	struct HolomapSurface {
+		int16 z;
+		uint16 projectedPosIdx;
+	};
+	HolomapSurface _holomapSurface[512];
+	struct HolomapProjectedPos {
+		int16 x;
+		int16 y;
+		uint16 unk1;
+		uint16 unk2;
+	};
+	HolomapProjectedPos _projectedSurfacePositions[2048];
+
 	struct TrajectoryData {
-		int16 unk1;
-		int16 unk2;
+		int16 locationIdx;
+		int16 trajLocationIdx;
 		int16 vehicleIdx;
 		int16 x;
 		int16 y;
 		int16 z;
-		int16 unk4;
+		int16 numAnimFrames;
+		struct TrajectoryPos {
+			int16 x;
+			int16 y;
+		};
+		TrajectoryPos positions[512];
 
 		/**
 		 * The HQR index of the vehicle model for the holomap
@@ -76,6 +94,10 @@ private:
 		int32 getModel() const {
 			return 2 * vehicleIdx + HolomapVehicle::FerryBoat;
 		}
+
+		int32 getAnimation() const {
+			return getModel() + 1;
+		}
 	};
 
 	int32 _numLocations = 0;
@@ -94,7 +116,7 @@ private:
 	void renderHolomapModel(byte *mdl_1, int32 x_2, int32 y_3, int32 zPos);
 
 	void prepareHolomapSurface();
-	void prepareHolomapPolygons();
+	void renderHolomapSurfacePolygons();
 
 public:
 	Holomap(TwinEEngine *engine);
diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index e18dc955c6..9abd1faae2 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -975,7 +975,7 @@ void Renderer::renderPolygons(const CmdRenderPolygon &polygon, Vertex *vertices)
 		renderPolygonsMarble(out, vtop, vsize, polygon.colorIndex);
 		break;
 	default:
-		warning("RENDER WARNING: Unsuported render type %d", polygon.renderType);
+		warning("RENDER WARNING: Unsupported render type %d", polygon.renderType);
 		break;
 	}
 }




More information about the Scummvm-git-logs mailing list