[Scummvm-git-logs] scummvm branch-2-7 -> bf2d332d52a37173f2dd9084288cb274ce93eab8

mgerhardy noreply at scummvm.org
Mon Jan 30 07:21:56 UTC 2023


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:
bf2d332d52 TWINE: unified holomap code and fixed weird rotations from one location to another


Commit: bf2d332d52a37173f2dd9084288cb274ce93eab8
    https://github.com/scummvm/scummvm/commit/bf2d332d52a37173f2dd9084288cb274ce93eab8
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2023-01-30T08:21:45+01:00

Commit Message:
TWINE: unified holomap code and fixed weird rotations from one location to another

Changed paths:
    engines/twine/holomap.cpp


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 2795dd2ddeb..11c5396ecf1 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -51,9 +51,8 @@ namespace TwinE {
 #define HOLOMAP_UNK4		(1 << 3)
 #define HOLOMAP_UNK5		(1 << 4)
 #define HOLOMAP_UNK6		(1 << 5)
-#define HOLOMAP_UNK7		(1 << 6)
+#define HOLOMAP_CUBE_DONE	(1 << 6)
 #define HOLOMAP_CAN_FOCUS	(1 << 7)
-#define HOLOMAP_RESET		(HOLOMAP_VISITED | HOLOMAP_UNK3 | HOLOMAP_UNK4 | HOLOMAP_UNK5 | HOLOMAP_UNK6 | HOLOMAP_UNK7)
 #define HOLOMAP_ACTIVE		(HOLOMAP_CAN_FOCUS | HOLOMAP_ARROW)
 
 static const float ZOOM_BIG_HOLO = 9500.0f;
@@ -93,10 +92,10 @@ bool Holomap::loadLocations() {
 
 	_engine->_text->initDial(TextBankId::Inventory_Intro_and_Holomap);
 	for (int32 i = 0; i < _numLocations; i++) {
-		_locations[i].angleX = (int16)ClampAngle(stream.readSint16LE());
-		_locations[i].angleY = (int16)ClampAngle(stream.readSint16LE());
+		_locations[i].angleX = stream.readSint16LE();
+		_locations[i].angleY = stream.readSint16LE();
 		_locations[i].size = stream.readSint16LE();
-		_locations[i].textIndex = (TextId)stream.readUint16LE();
+		_locations[i].textIndex = (TextId)stream.readSint16LE();
 
 		if (_engine->_text->getMenuText(_locations[i].textIndex, _locations[i].name, sizeof(_locations[i].name))) {
 			debug(2, "Scene %i: %s", i, _locations[i].name);
@@ -107,7 +106,7 @@ bool Holomap::loadLocations() {
 	return true;
 }
 
-void Holomap::setHolomapPosition(int32 locationIdx) {
+void Holomap::setHolomapPosition(int32 locationIdx) { // SetHoloPos
 	assert(locationIdx >= 0 && locationIdx <= ARRAYSIZE(_engine->_gameState->_holomapFlags));
 	_engine->_gameState->_holomapFlags[locationIdx] = HOLOMAP_ACTIVE;
 	if (_engine->_gameState->hasItem(InventoryItems::kiHolomap)) {
@@ -115,10 +114,10 @@ void Holomap::setHolomapPosition(int32 locationIdx) {
 	}
 }
 
-void Holomap::clearHolomapPosition(int32 locationIdx) {
+void Holomap::clearHolomapPosition(int32 locationIdx) { // ClrHoloPos
 	assert(locationIdx >= 0 && locationIdx <= ARRAYSIZE(_engine->_gameState->_holomapFlags));
-	_engine->_gameState->_holomapFlags[locationIdx] &= HOLOMAP_RESET;
-	_engine->_gameState->_holomapFlags[locationIdx] |= HOLOMAP_UNK7;
+	_engine->_gameState->_holomapFlags[locationIdx] &= ~HOLOMAP_ACTIVE;
+	_engine->_gameState->_holomapFlags[locationIdx] |= HOLOMAP_CUBE_DONE;
 }
 
 void Holomap::initHoloDatas() {
@@ -439,25 +438,26 @@ int32 Holomap::searchNextArrow(int32 currentLocation, int32 dir) const {
 		} else {
 			i %= NUM_LOCATIONS;
 		}
-		if (i == _engine->_scene->_currentSceneIdx || (_engine->_gameState->_holomapFlags[i] & HOLOMAP_ACTIVE) != 0u) {
+		if ((_engine->_gameState->_holomapFlags[i] & HOLOMAP_ACTIVE) != 0u) {
 			return i;
 		}
 	}
 	return -1;
 }
 
-void Holomap::drawListPos(int xRot, int yRot, int zRot, bool pos) {
-	int n = 0;
-	DrawListStruct drawListArray[NUM_LOCATIONS];
-	for (int locationIdx = 0; locationIdx < NUM_LOCATIONS; ++locationIdx) {
-		if (!(_engine->_gameState->_holomapFlags[locationIdx] & HOLOMAP_CAN_FOCUS) && locationIdx != _engine->_scene->_currentSceneIdx) {
+void Holomap::drawListPos(int calpha, int cbeta, int cgamma, bool pos) {
+	int nbobjets = 0;
+	DrawListStruct listTri[NUM_LOCATIONS];
+	const int numCube = _engine->_scene->_currentSceneIdx;
+	for (int n = 0; n < NUM_LOCATIONS; ++n) {
+		if (!(_engine->_gameState->_holomapFlags[n] & HOLOMAP_CAN_FOCUS) && n != numCube) {
 			continue;
 		}
-		const Location &loc = _locations[locationIdx];
+		const Location &loc = _locations[n];
 		_engine->_renderer->setAngleCamera(loc.angleX, loc.angleY, 0);
 		const IVec3 &m = _engine->_renderer->worldRotatePoint(IVec3(0, 0, 1000 + loc.size));
 		const IVec3 &m1 = _engine->_renderer->worldRotatePoint(IVec3(0, 0, 1500));
-		_engine->_renderer->setInverseAngleCamera(xRot, yRot, zRot);
+		_engine->_renderer->setInverseAngleCamera(calpha, cbeta, cgamma);
 		_engine->_renderer->setCameraRotation(0, 0, distance(ZOOM_BIG_HOLO));
 
 		const IVec3 &destPos3 = _engine->_renderer->worldRotatePoint(m);
@@ -472,29 +472,29 @@ void Holomap::drawListPos(int xRot, int yRot, int zRot, bool pos) {
 				continue;
 			}
 		}
-		uint8 flags = _engine->_gameState->_holomapFlags[locationIdx] & HOLOMAP_ARROW;
-		if (locationIdx == _engine->_scene->_currentSceneIdx) {
-			flags |= 2u; // model type
+		uint32 t = (uint32)_engine->_gameState->_holomapFlags[n] & HOLOMAP_ARROW;
+		if (n == numCube) {
+			t |= HOLOMAP_VISITED; // model type
 		}
-		DrawListStruct &drawList = drawListArray[n];
+		DrawListStruct &drawList = listTri[nbobjets];
 		drawList.posValue = destPos3.z;
-		drawList.actorIdx = locationIdx;
-		drawList.type = flags;
+		drawList.actorIdx = n;
+		drawList.type = t;
 		drawList.x = m.x;
 		drawList.y = m.y;
 		drawList.z = m.z;
-		++n;
+		++nbobjets;
 	}
-	_engine->_redraw->sortDrawingList(drawListArray, n);
-	for (int i = 0; i < n; ++i) {
-		const DrawListStruct &drawList = drawListArray[i];
-		const uint16 flags = drawList.type;
+	_engine->_redraw->sortDrawingList(listTri, nbobjets);
+	for (int i = 0; i < nbobjets; ++i) {
+		const DrawListStruct &drawList = listTri[i];
+		const uint32 flags = drawList.type;
 		const BodyData *bodyData = nullptr;
-		if (flags == 1u) {
+		if (flags == HOLOMAP_ARROW) {
 			bodyData = &_engine->_resources->_holomapArrowPtr;
-		} else if (flags == 2u) {
+		} else if (flags == HOLOMAP_VISITED) {
 			bodyData = &_engine->_resources->_holomapTwinsenModelPtr;
-		} else if (flags == 3u) {
+		} else if (flags == (HOLOMAP_ARROW | HOLOMAP_VISITED)) {
 			bodyData = &_engine->_resources->_holomapTwinsenArrowPtr;
 		}
 		if (bodyData != nullptr) {
@@ -540,13 +540,18 @@ void Holomap::holoMap() {
 	int32 currentLocation = _engine->_scene->_currentSceneIdx;
 	_engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
 
-	int32 time = _engine->_lbaTime;
-	int32 xRot = _locations[currentLocation].angleX;
-	int32 yRot = _locations[currentLocation].angleY;
+	int32 otimer = _engine->_lbaTime;
+	int32 dalpha = _locations[currentLocation].angleX;
+	int32 dbeta = _locations[currentLocation].angleY;
+	int32 calpha = dalpha;
+	int32 cbeta = dbeta;
+	int32 cgamma = 0;
+	int32 oalpha = dalpha;
+	int32 obeta = dbeta;
 	bool automove = false;
 	bool redraw = true;
 	int waterPaletteChangeTimer = 0;
-	bool fadeInPalette = true;
+	bool flagpal = true;
 	_engine->_input->enableKeyMap(holomapKeyMapId);
 	for (;;) {
 		FrameMarker frame(_engine);
@@ -556,51 +561,66 @@ void Holomap::holoMap() {
 		}
 
 		if (_engine->_input->toggleActionIfActive(TwinEActionType::HolomapPrev)) {
-			const int32 nextLocation = searchNextArrow(currentLocation, -1);
-			if (nextLocation != -1 && currentLocation != nextLocation) {
-				currentLocation = nextLocation;
-				_engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
-				time = _engine->_lbaTime;
-				automove = true;
+			currentLocation = searchNextArrow(currentLocation, -1);
+			if (currentLocation == -1) {
+				currentLocation = _engine->_scene->_currentSceneIdx;
 			}
+			_engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
+			oalpha = calpha;
+			obeta = cbeta;
+			otimer = _engine->_lbaTime;
+			dalpha = _locations[currentLocation].angleX;
+			dbeta = _locations[currentLocation].angleY;
+			automove = true;
+			redraw = true;
 		} else if (_engine->_input->toggleActionIfActive(TwinEActionType::HolomapNext)) {
-			const int32 nextLocation = searchNextArrow(currentLocation, 1);
-			if (nextLocation != -1 && currentLocation != nextLocation) {
-				currentLocation = nextLocation;
-				_engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
-				time = _engine->_lbaTime;
-				automove = true;
+			currentLocation = searchNextArrow(currentLocation, 1);
+			if (currentLocation == -1) {
+				currentLocation = _engine->_scene->_currentSceneIdx;
 			}
-		}
-
-		if (_engine->_input->isActionActive(TwinEActionType::HolomapDown)) {
-			xRot += LBAAngles::ANGLE_2;
-			automove = true;
-			time = _engine->_lbaTime;
-		} else if (_engine->_input->isActionActive(TwinEActionType::HolomapUp)) {
-			xRot -= LBAAngles::ANGLE_2;
+			_engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
+			oalpha = calpha;
+			obeta = cbeta;
+			otimer = _engine->_lbaTime;
+			dalpha = _locations[currentLocation].angleX;
+			dbeta = _locations[currentLocation].angleY;
 			automove = true;
-			time = _engine->_lbaTime;
+			redraw = true;
 		}
 
-		if (_engine->_input->isActionActive(TwinEActionType::HolomapRight)) {
-			yRot += LBAAngles::ANGLE_2;
-			automove = true;
-			time = _engine->_lbaTime;
-		} else if (_engine->_input->isActionActive(TwinEActionType::HolomapLeft)) {
-			yRot -= LBAAngles::ANGLE_2;
-			automove = true;
-			time = _engine->_lbaTime;
+		if (!automove) {
+			if (_engine->_input->isActionActive(TwinEActionType::HolomapDown)) {
+				calpha += LBAAngles::ANGLE_2;
+				calpha = ClampAngle(calpha);
+				cbeta = ClampAngle(cbeta);
+				redraw = true;
+			} else if (_engine->_input->isActionActive(TwinEActionType::HolomapUp)) {
+				calpha -= LBAAngles::ANGLE_2;
+				calpha = ClampAngle(calpha);
+				cbeta = ClampAngle(cbeta);
+				redraw = true;
+			}
+			if (_engine->_input->isActionActive(TwinEActionType::HolomapRight)) {
+				cbeta += LBAAngles::ANGLE_2;
+				calpha = ClampAngle(calpha);
+				cbeta = ClampAngle(cbeta);
+				redraw = true;
+			} else if (_engine->_input->isActionActive(TwinEActionType::HolomapLeft)) {
+				cbeta -= LBAAngles::ANGLE_2;
+				calpha = ClampAngle(calpha);
+				cbeta = ClampAngle(cbeta);
+				redraw = true;
+			}
 		}
 
 		if (automove) {
-			const int32 dt = _engine->_lbaTime - time;
-			xRot = _engine->_collision->clampedLerp(ClampAngle(xRot), _locations[currentLocation].angleX, 75, dt);
-			yRot = _engine->_collision->clampedLerp(ClampAngle(yRot), _locations[currentLocation].angleY, 75, dt);
+			const int32 dt = _engine->_lbaTime - otimer;
+			calpha = _engine->_collision->clampedLerp(oalpha, dalpha, 75, dt);
+			cbeta = _engine->_collision->clampedLerp(obeta, dbeta, 75, dt);
 			redraw = true;
 		}
 
-		if (!fadeInPalette && waterPaletteChangeTimer < _engine->_lbaTime) {
+		if (!flagpal && waterPaletteChangeTimer < _engine->_lbaTime) {
 			// animate the water surface
 			_engine->setPalette(HOLOMAP_PALETTE_INDEX, NUM_HOLOMAPCOLORS, &_paletteHolomap[3 * _holomapPaletteIndex++]);
 			if (_holomapPaletteIndex == NUM_HOLOMAPCOLORS) {
@@ -618,13 +638,13 @@ void Holomap::holoMap() {
 			_engine->_interface->memoClip();
 			_engine->_interface->setClip(rect);
 			_engine->_interface->drawFilledRect(rect, COLOR_BLACK);
-			_engine->_renderer->setInverseAngleCamera(xRot, yRot, 0);
-			_engine->_renderer->setLightVector(xRot, yRot, 0);
-			drawListPos(xRot, yRot, 0, false);
-			_engine->_renderer->setInverseAngleCamera(xRot, yRot, 0);
+			_engine->_renderer->setInverseAngleCamera(calpha, cbeta, cgamma);
+			_engine->_renderer->setLightVector(calpha, cbeta, 0);
+			drawListPos(calpha, cbeta, cgamma, false);
+			_engine->_renderer->setInverseAngleCamera(calpha, cbeta, cgamma);
 			_engine->_renderer->setCameraRotation(0, 0, distance(ZOOM_BIG_HOLO));
 			drawHoloMap(holomapImagePtr, holomapImageSize);
-			drawListPos(xRot, yRot, 0, true);
+			drawListPos(calpha, cbeta, cgamma, true);
 			_engine->_interface->restoreClip();
 			drawHolomapText(_engine->width() / 2, 25, "HoloMap");
 			if (automove) {
@@ -634,14 +654,14 @@ void Holomap::holoMap() {
 			}
 		}
 
-		if (automove && xRot == _locations[currentLocation].angleX && yRot == _locations[currentLocation].angleY) {
+		if (automove && dalpha == calpha && dbeta == cbeta) {
 			automove = false;
 		}
 
 		++_engine->_lbaTime;
 
-		if (fadeInPalette) {
-			fadeInPalette = false;
+		if (flagpal) {
+			flagpal = false;
 			_engine->_screens->fadeToPal(_engine->_screens->_paletteRGBACustom);
 		}
 	}




More information about the Scummvm-git-logs mailing list