[Scummvm-git-logs] scummvm master -> 0bf715e42d3f9cd7650196bc832b6ed1272c2f5c

mgerhardy martin.gerhardy at gmail.com
Sun Jan 24 08:55:57 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:
fe5a8994be TWINE: load holomap pointer model
0bf715e42d TWINE: more holomap code


Commit: fe5a8994be77d56a8697ac088be97c61eab82025
    https://github.com/scummvm/scummvm/commit/fe5a8994be77d56a8697ac088be97c61eab82025
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-01-24T09:54:19+01:00

Commit Message:
TWINE: load holomap pointer model

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


diff --git a/engines/twine/resources/resources.cpp b/engines/twine/resources/resources.cpp
index a0baab9306..9870996fe7 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -162,6 +162,12 @@ void Resources::initResources() {
 	}
 	Renderer::prepareIsoModel(holomapTwinsenModelPtr);
 
+	holomapPointModelSize = HQR::getAllocEntry(&holomapPointModelPtr, Resources::HQR_RESS_FILE, RESSHQR_HOLOPOINTMDL);
+	if (holomapPointModelSize == 0) {
+		error("Failed to load holomap point model");
+	}
+	Renderer::prepareIsoModel(holomapPointModelPtr);
+
 	holomapArrowSize = HQR::getAllocEntry(&holomapArrowPtr, Resources::HQR_RESS_FILE, RESSHQR_HOLOARROWMDL);
 	if (holomapArrowSize == 0) {
 		error("Failed to load holomap arrow model");
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index b0b1ca175a..369e877b88 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -187,6 +187,8 @@ public:
 	uint8 *holomapSurfacePtr = nullptr;
 	uint32 holomapImageSize = 0;
 	uint8 *holomapImagePtr = nullptr;
+	uint32 holomapPointModelSize = 0;
+	uint8 *holomapPointModelPtr = nullptr;
 	uint32 holomapTwinsenModelSize = 0;
 	uint8 *holomapTwinsenModelPtr = nullptr;
 	uint32 holomapTwinsenArrowSize = 0;


Commit: 0bf715e42d3f9cd7650196bc832b6ed1272c2f5c
    https://github.com/scummvm/scummvm/commit/0bf715e42d3f9cd7650196bc832b6ed1272c2f5c
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-01-24T09:55:38+01:00

Commit Message:
TWINE: more holomap code

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


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index aef6a85c42..f752847e67 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -83,39 +83,7 @@ void Holomap::clearHolomapPosition(int32 locationIdx) {
 	_engine->_gameState->holomapFlags[locationIdx] |= 0x40;
 }
 
-void Holomap::loadGfxSub1() {
-	// TODO
-}
-
-void Holomap::loadGfxSub2() {
-	// TODO
-}
-
 void Holomap::loadHolomapGFX() {
-	uint8 *videoPtr3 = (uint8 *)_engine->workVideoBuffer.getBasePtr(174, 12);
-	uint8 *videoPtr4 = (uint8 *)_engine->workVideoBuffer.getBasePtr(78, 13);
-	uint8 *videoPtr5 = (uint8 *)_engine->workVideoBuffer.getBasePtr(334, 115);
-
-	HQR::getEntry(videoPtr3, Resources::HQR_RESS_FILE, RESSHQR_HOLOSURFACE);
-	HQR::getEntry(videoPtr4, Resources::HQR_RESS_FILE, RESSHQR_HOLOIMG);
-
-	uint8 *videoPtr6 = videoPtr5 + HQR::getEntry(videoPtr5, Resources::HQR_RESS_FILE, RESSHQR_HOLOTWINMDL);
-	uint8 *videoPtr7 = videoPtr6 + HQR::getEntry(videoPtr6, Resources::HQR_RESS_FILE, RESSHQR_HOLOARROWMDL);
-	uint8 *videoPtr8 = videoPtr7 + HQR::getEntry(videoPtr7, Resources::HQR_RESS_FILE, RESSHQR_HOLOTWINARROWMDL);
-
-	Renderer::prepareIsoModel(videoPtr5);
-	Renderer::prepareIsoModel(videoPtr6);
-	Renderer::prepareIsoModel(videoPtr7);
-	Renderer::prepareIsoModel(videoPtr8);
-
-	// TODO:
-	// uint8 *videoPtr1 = (uint8 *)_engine->workVideoBuffer.getPixels();
-	// uint8 *videoPtr2 = videoPtr1 + 4488;
-	// uint8 *videoPtr11 = videoPtr8 + HQR::getEntry(videoPtr8, Resources::HQR_RESS_FILE, RESSHQR_HOLOPOINTMDL);
-	// uint8 *videoPtr10 = videoPtr11 + 4488;
-	// uint8 *videoPtr12 = videoPtr10 + HQR::getEntry(videoPtr10, Resources::HQR_RESS_FILE, RESSHQR_HOLOARROWINFO);
-	// uint8 *videoPtr13 = videoPtr12 + HQR::getEntry(videoPtr12, Resources::HQR_RESS_FILE, RESSHQR_HOLOPOINTANIM);
-
 	_engine->_screens->loadCustomPalette(RESSHQR_HOLOPAL);
 
 	int32 j = 576;
@@ -132,9 +100,6 @@ void Holomap::loadHolomapGFX() {
 		paletteHolomap[i + 2] = _engine->_screens->palette[j + 2];
 	}
 
-	loadGfxSub1();
-	loadGfxSub2();
-
 	needToLoadHolomapGFX = 0;
 }
 
@@ -173,6 +138,9 @@ void Holomap::prepareHolomapSurface() {
 	//FUN_004253e8(_DAT_0043f7ec,(undefined4 *)0x200,4,&LAB_00413d20);
 }
 
+void Holomap::prepareHolomapPolygons() {
+}
+
 void Holomap::drawHolomapText(int32 centerx, int32 top, const char *title) {
 	const int32 size = _engine->_text->getTextSize(title);
 	const int32 x = centerx - size / 2;
@@ -183,13 +151,53 @@ void Holomap::drawHolomapText(int32 centerx, int32 top, const char *title) {
 	_engine->_text->drawText(x, y, title);
 }
 
+void Holomap::renderHolomapModel(byte *mdl_1, int32 x_2, int32 y_3, int32 zPos) {
+	_engine->_renderer->setBaseRotation(x_2, y_3, 0);
+	_engine->_renderer->getBaseRotationPosition(0, 0, zPos + 1000);
+	const int32 iVar1 = _engine->_renderer->destZ;
+	const int32 y_2 = _engine->_renderer->destY;
+	const int32 x_1 = _engine->_renderer->destX;
+	int32 trajRotPosX = 0; // TODO DAT_0043f706 4th short value of the trajectory data TrajectoryData::x
+	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->_interface->resetClip();
+	_engine->_renderer->renderIsoModel(x_1, y_2, iVar1, (int)x_2, (int)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);
+	for (int32 trajIdx = 0; trajIdx < trajectoryIdx; ++trajIdx) {
+		const int16 animVal = *(const int16 *)(ptr + 12);
+		ptr += 4 * animVal + 14;
+	}
+	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);
-	_engine->_renderer->setCameraAngle(0, 0, 0, (int)(short)DAT_0043f706, (int)(short)DAT_0043f710, (int)DAT_0043f7f8, 0x14b4);
+	prepareHolomapSurface();
+	prepareHolomapPolygons();
+
+	const Location &loc = _locations[_engine->_scene->currentSceneIdx]; // TODO: id is most likely wrong
+	renderHolomapModel(_engine->_resources->holomapPointModelPtr, loc.x, loc.y, 0);
+
+	_engine->flip();
 	ActorMoveStruct move;
 	const uint8 *animPtr = nullptr;
 	int frameNumber = 0;
@@ -221,27 +229,31 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 			}
 		}
 		_engine->_renderer->setCameraPosition(100, 400, 128, 900, 900);
-		_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->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->copyBlockPhys(0, 200, 199, 0x1df);
 		_engine->_renderer->setCameraPosition(400, 240, 128, 1024, 1024);
-		_engine->_renderer->setCameraAngle(v5);
-		_engine->_renderer->setLightVector(v5);
+		const int32 trajRotPosX = data.x; // DAT_0043f706
+		const int32 trajRotPosY = data.y; // DAT_0043f710
+		const int32 trajRotPosZ = data.z; // _DAT_0043f7f8
+		_engine->_renderer->setCameraAngle(0, 0, 0, trajRotPosX, trajRotPosY, trajRotPosZ, 0x14b4);
+		_engine->_renderer->setLightVector(trajRotPosX, trajRotPosY, 0);
 		if (frameTime + 40 <= _engine->lbaTime) {
 			frameTime = _engine->lbaTime;
-			if (v17 >= v29 && v17 > v29) {
-				break;
+			if (locationIdx < sVar3) {
+				model_x = psVar9[locationIdx * 2 + 7];
+				model_y = psVar9[locationIdx * 2 + 8];
+			} else {
+				if (sVar3 < locationIdx) {
+					break;
+				}
+				model_x = *(short *)(sVar2 * 8 + holomapLocationInfo._0_4_);
+				model_y = *(short *)(sVar2 * 8 + 2 + holomapLocationInfo._0_4_);
 			}
-			++v17;
-			_engine->_renderer->setBaseRotation(v0);
-			_engine->_renderer->getBaseRotationPosition(v1, v0);
-			_engine->_renderer->setCameraAngle(v0);
-			_engine->_renderer->getBaseRotationPosition(v2, v0);
-			_engine->_interface->resetClip();
-			_engine->_renderer->renderIsoModel(v3, v0);
-			_engine->copyBlockPhys(v0);
+			renderHolomapModel(_holomappointmdl, model_x, model_y, 0);
+			locationIdx = locationIdx + 1;
 		}
 		if (v28) {
 			v28 = 0;
@@ -553,9 +565,11 @@ 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);
+			//renderLocations(xRot, yRot, 0, false); // TODO: activate me
 			_engine->_renderer->setBaseRotation(xRot, yRot, 0);
-			renderLocations(xRot, yRot, 0, true);
+			prepareHolomapSurface();
+			prepareHolomapPolygons();
+			//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 3ab77933f4..552b285d19 100644
--- a/engines/twine/holomap.h
+++ b/engines/twine/holomap.h
@@ -48,6 +48,36 @@ private:
 		uint16 textIndex = 0;
 	};
 
+	enum HolomapVehicle {
+		FerryBoat = 31,
+		Motorbike = 33,
+		Car = 35,
+		FishingBoat = 37,
+		Catamaran = 39,
+		Hovercraft = 41,
+		Dino = 43,
+		ArmyBoat = 45,
+		HamalayiTransporter = 47
+	};
+
+	struct TrajectoryData {
+		int16_t unk1;
+		int16_t unk2;
+		int16_t vehicleIdx;
+		int16_t x;
+		int16_t y;
+		int16_t z;
+		int16_t unk4;
+
+		/**
+		 * The HQR index of the vehicle model for the holomap
+		 * @note Multiplied by 2 because the model index is always followed by the corresponding animation index for that model
+		 */
+		int32 getModel() const {
+			return 2 * vehicleIdx + HolomapVehicle::FerryBoat;
+		}
+	};
+
 	int32 _numLocations = 0;
 	Location _locations[NUM_LOCATIONS];
 
@@ -59,6 +89,12 @@ private:
 	int32 getNextHolomapLocation(int32 currentLocation, int32 dir) const;
 
 	void renderLocations(int xRot, int yRot, int zRot, bool lower);
+	TrajectoryData loadTrajectoryData(int32 trajectoryIdx);
+
+	void renderHolomapModel(byte *mdl_1, int32 x_2, int32 y_3, int32 zPos);
+
+	void prepareHolomapSurface();
+	void prepareHolomapPolygons();
 
 public:
 	Holomap(TwinEEngine *engine);
@@ -79,14 +115,9 @@ public:
 
 	void drawHolomapTrajectory(int32 trajectoryIndex);
 
-	void loadGfxSub1();
-	void loadGfxSub2();
-
 	/** Load Holomap content */
 	void loadHolomapGFX();
 
-	void prepareHolomapSurface();
-
 	/** Main holomap process loop */
 	void processHolomap();
 };
diff --git a/engines/twine/resources/resources.cpp b/engines/twine/resources/resources.cpp
index 9870996fe7..b461fa90be 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -180,6 +180,11 @@ void Resources::initResources() {
 	}
 	Renderer::prepareIsoModel(holomapTwinsenArrowPtr);
 
+	holomapPointAnimSize = HQR::getAllocEntry(&holomapPointAnimPtr, Resources::HQR_RESS_FILE, RESSHQR_HOLOPOINTANIM);
+	if (holomapPointAnimSize == 0) {
+		error("Failed to load holomap point anim data");
+	}
+
 	preloadSprites();
 	preloadAnimations();
 	preloadSamples();
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index 369e877b88..673bedd63f 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -195,6 +195,8 @@ public:
 	uint8 *holomapTwinsenArrowPtr = nullptr;
 	uint32 holomapArrowSize = 0;
 	uint8 *holomapArrowPtr = nullptr;
+	uint32 holomapPointAnimSize = 0;
+	uint8 *holomapPointAnimPtr = nullptr;
 
 	/** Initialize resource pointers */
 	void initResources();




More information about the Scummvm-git-logs mailing list