[Scummvm-git-logs] scummvm master -> 705016c62734b533982c7319f6db26995305eb9f

mgerhardy martin.gerhardy at gmail.com
Tue Feb 9 20:40:59 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:
585fe8745e TWINE: progress on holomap code
3d92c0f9c1 TWINE: fixed hero pos for lba2 scene parsing
004e4ee16f TWINE: camera angle is needed for holomap rendering already
6ff21ff321 TWINE: holomap progress
8ce16227e8 TWINE: really skip voice playback if playVox is false
705016c627 TWINE: input tweaks, recenter and holomap should be toggle actions


Commit: 585fe8745ece0e8977e4867025eda698afe02bc3
    https://github.com/scummvm/scummvm/commit/585fe8745ece0e8977e4867025eda698afe02bc3
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-09T21:40:33+01:00

Commit Message:
TWINE: progress on holomap code

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


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 5fc1753ad2..d2051b9248 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -101,6 +101,9 @@ void Holomap::loadHolomapGFX() {
 	}
 
 	holomapPaletteIndex = 0;
+
+	prepareHolomapProjectedPositions();
+	prepareHolomapSurface();
 }
 
 static int sortHolomapSurfaceCoordsByDepth(const void *a1, const void *a2) {
@@ -110,22 +113,39 @@ static int sortHolomapSurfaceCoordsByDepth(const void *a1, const void *a2) {
 void Holomap::prepareHolomapSurface() {
 	Common::MemoryReadStream stream(_engine->_resources->holomapSurfacePtr, _engine->_resources->holomapSurfaceSize);
 	int holomapSurfaceArrayIdx = 0;
+	_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) {
+			const int32 rotX = stream.readByte();
+			_engine->_movements->rotateActor(rotX * 2 + 1000, 0, angle);
+			const int32 tmpDestY = _engine->_renderer->destZ;
+			_engine->_movements->rotateActor(_engine->_renderer->destX, 0, rotation);
+			_engine->_renderer->getBaseRotationPosition(_engine->_renderer->destX, tmpDestY, _engine->_renderer->destZ);
+			_holomapSurface[holomapSurfaceArrayIdx].x = _engine->_renderer->destX;
+			_holomapSurface[holomapSurfaceArrayIdx].y = _engine->_renderer->destY;
+			_holomapSurface[holomapSurfaceArrayIdx].z = _engine->_renderer->destZ;
+			++holomapSurfaceArrayIdx;
+			rotation += ANGLE_11_25;
+		}
+		const int32 rotX = stream.readByte();
+		_engine->_movements->rotateActor(rotX * 2 + 1000, 0, angle);
+		const int32 tmpDestY = _engine->_renderer->destZ;
+		_engine->_movements->rotateActor(_engine->_renderer->destX, 0, ANGLE_0);
+		_engine->_renderer->getBaseRotationPosition(_engine->_renderer->destX, tmpDestY, _engine->_renderer->destZ);
+		_holomapSurface[holomapSurfaceArrayIdx].x = _engine->_renderer->destX;
+		_holomapSurface[holomapSurfaceArrayIdx].y = _engine->_renderer->destY;
+		_holomapSurface[holomapSurfaceArrayIdx].z = _engine->_renderer->destZ;
+		++holomapSurfaceArrayIdx;
+	}
+}
+
+void Holomap::prepareHolomapProjectedPositions() {
+	Common::MemoryReadStream stream(_engine->_resources->holomapSurfacePtr, _engine->_resources->holomapSurfaceSize);
 	int projectedIndex = 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) {
-			const int32 destX = stream.readSint16LE();
-			const int32 destY = stream.readSint16LE();
-			const int32 destZ = stream.readSint16LE();
-			_engine->_renderer->getBaseRotationPosition(destX, destY, destZ);
-			if (angle != ANGLE_90) {
-				_holomapSurface[holomapSurfaceArrayIdx].z = destZ;
-				_holomapSurface[holomapSurfaceArrayIdx].projectedPosIdx = projectedIndex;
-				++holomapSurfaceArrayIdx;
-			}
-			_engine->_renderer->projectPositionOnScreen(destX, destY, destZ);
-			_projectedSurfacePositions[projectedIndex].x = _engine->_renderer->projPosX;
-			_projectedSurfacePositions[projectedIndex].y = _engine->_renderer->projPosY;
 			_projectedSurfacePositions[projectedIndex].unk1 = _engine->_screens->crossDot(0, 0xffff, ANGLE_360 - 1, rotation);
 			if (angle == ANGLE_90) {
 				_projectedSurfacePositions[projectedIndex].unk2 = 0xffff;
@@ -135,13 +155,6 @@ void Holomap::prepareHolomapSurface() {
 			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);
-		_projectedSurfacePositions[projectedIndex].x = _engine->_renderer->projPosX;
-		_projectedSurfacePositions[projectedIndex].y = _engine->_renderer->projPosY;
 		_projectedSurfacePositions[projectedIndex].unk1 = 0xffff;
 		if (angle == ANGLE_90) {
 			_projectedSurfacePositions[projectedIndex].unk2 = 0xffff;
@@ -150,16 +163,49 @@ void Holomap::prepareHolomapSurface() {
 		}
 		++projectedIndex;
 	}
+}
+
+void Holomap::prepareHolomapPolygons() {
+	Common::MemoryReadStream stream(_engine->_resources->holomapSurfacePtr, _engine->_resources->holomapSurfaceSize);
+	int holomapSortArrayIdx = 0;
+	int projectedIndex = 0;
+	_engine->_renderer->setBaseRotation(0, 0, 0);
+	for (int32 angle = -ANGLE_90; angle <= ANGLE_90; angle += ANGLE_11_25) {
+		int rotation = 0;
+		HolomapSurface* vec;
+		for (int32 stepWidth = ANGLE_11_25; stepWidth != 0; --stepWidth) {
+			vec = &_holomapSurface[holomapSortArrayIdx];
+			_engine->_renderer->getBaseRotationPosition(vec->x, vec->y, vec->z);
+			if (angle != ANGLE_90) {
+				_holomapSort[holomapSortArrayIdx].z = _engine->_renderer->destZ;
+				_holomapSort[holomapSortArrayIdx].projectedPosIdx = projectedIndex;
+				++holomapSortArrayIdx;
+			}
+			_engine->_renderer->projectPositionOnScreen(_engine->_renderer->destX, _engine->_renderer->destY, _engine->_renderer->destZ);
+			_projectedSurfacePositions[projectedIndex].x = _engine->_renderer->projPosX;
+			_projectedSurfacePositions[projectedIndex].y = _engine->_renderer->projPosY;
+			rotation += ANGLE_11_25;
+			++projectedIndex;
+			++holomapSortArrayIdx;
+		}
+		_engine->_renderer->getBaseRotationPosition(vec->x, vec->y, vec->z);
+		_engine->_renderer->projectPositionOnScreen(_engine->_renderer->destX, _engine->_renderer->destY, _engine->_renderer->destZ);
+		_projectedSurfacePositions[projectedIndex].x = _engine->_renderer->projPosX;
+		_projectedSurfacePositions[projectedIndex].y = _engine->_renderer->projPosY;
+		rotation += ANGLE_11_25;
+		++projectedIndex;
+		++holomapSortArrayIdx;
+	}
 	qsort(_holomapSurface, ARRAYSIZE(_holomapSurface), sizeof(HolomapSurface), sortHolomapSurfaceCoordsByDepth);
 }
 
 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];
+	prepareHolomapPolygons();
+	for (int32 i = 0; i < ARRAYSIZE(_holomapSort); ++i) {
+		// const HolomapProjectedPos &pos1 = _projectedSurfacePositions[_holomapSort[i].projectedPosIdx + 0];
+		// const HolomapProjectedPos &pos2 = _projectedSurfacePositions[_holomapSort[i].projectedPosIdx + 1];
+		// const HolomapProjectedPos &pos3 = _projectedSurfacePositions[_holomapSort[i].projectedPosIdx + 2];
+		// const HolomapProjectedPos &pos4 = _projectedSurfacePositions[_holomapSort[i].projectedPosIdx + 3];
 		// TODO: build triangles from projected pos with texcoords from holomapimg
 # if 0
 		v2 = _projectedSurfacePositions + 2 * *(_WORD *)(i + _holomapSurface + 2);
@@ -451,9 +497,6 @@ void Holomap::processHolomap() {
 	_engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
 	_engine->flip();
 
-	// TODO: load RESSHQR_HOLOSURFACE and project the texture to the surface
-	//_engine->_screens->loadImage(RESSHQR_HOLOIMG, RESSHQR_HOLOPAL);
-
 	int32 time = _engine->lbaTime;
 	int32 xRot = 0;
 	int32 yRot = 0;
diff --git a/engines/twine/holomap.h b/engines/twine/holomap.h
index 8f6ec81469..208b3e4a9b 100644
--- a/engines/twine/holomap.h
+++ b/engines/twine/holomap.h
@@ -59,17 +59,24 @@ private:
 		ArmyBoat = 45,
 		HamalayiTransporter = 47
 	};
-
 	struct HolomapSurface {
-		int16 z;
-		uint16 projectedPosIdx;
+		int16 x = 0;
+		int16 y = 0;
+		int16 z = 0;
 	};
 	HolomapSurface _holomapSurface[512];
+
+	struct HolomapSort {
+		int16 z = 0;
+		uint16 projectedPosIdx = 0;
+	};
+	HolomapSort _holomapSort[512];
+
 	struct HolomapProjectedPos {
-		int16 x;
-		int16 y;
-		uint16 unk1;
-		uint16 unk2;
+		int16 x = 0;
+		int16 y = 0;
+		uint16 unk1 = 0;
+		uint16 unk2 = 0;
 	};
 	HolomapProjectedPos _projectedSurfacePositions[2048];
 
@@ -115,6 +122,8 @@ private:
 	void renderHolomapModel(const uint8 *bodyPtr, int32 x, int32 y, int32 zPos);
 
 	void prepareHolomapSurface();
+	void prepareHolomapProjectedPositions();
+	void prepareHolomapPolygons();
 	void renderHolomapSurfacePolygons();
 
 public:


Commit: 3d92c0f9c184d05ec0a09a3d3bdf4cabfa9c3873
    https://github.com/scummvm/scummvm/commit/3d92c0f9c184d05ec0a09a3d3bdf4cabfa9c3873
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-09T21:40:33+01:00

Commit Message:
TWINE: fixed hero pos for lba2 scene parsing

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


diff --git a/engines/twine/scene/scene.cpp b/engines/twine/scene/scene.cpp
index 8ce4f75d59..2179e73a7a 100644
--- a/engines/twine/scene/scene.cpp
+++ b/engines/twine/scene/scene.cpp
@@ -173,9 +173,9 @@ bool Scene::loadSceneLBA2() {
 	_sceneMusic = stream.readByte();
 
 	// load hero properties
-	_sceneHeroX = stream.readUint16LE();
-	_sceneHeroY = stream.readUint16LE();
-	_sceneHeroZ = stream.readUint16LE();
+	_sceneHeroX = stream.readSint16LE();
+	_sceneHeroY = stream.readSint16LE();
+	_sceneHeroZ = stream.readSint16LE();
 
 	sceneHero->moveScriptSize = stream.readUint16LE();
 	sceneHero->moveScript = currentScene + stream.pos();


Commit: 004e4ee16f1c01555d60f3551fc6ce659c67a547
    https://github.com/scummvm/scummvm/commit/004e4ee16f1c01555d60f3551fc6ce659c67a547
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-09T21:40:33+01:00

Commit Message:
TWINE: camera angle is needed for holomap rendering already

Changed paths:
    engines/twine/holomap.cpp


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index d2051b9248..97931f2ce2 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -297,11 +297,11 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 	const Holomap::TrajectoryData &data = loadTrajectoryData(trajectoryIndex);
 	ScopedEngineFreeze timeFreeze(_engine);
 	_engine->_renderer->setCameraPosition(400, 240, 128, 1024, 1024);
+	_engine->_renderer->setCameraAngle(0, 0, 0, data.x, data.y, data.z, 5300);
 
 	renderHolomapSurfacePolygons();
 
 	const Location &loc = _locations[data.locationIdx];
-	_engine->_renderer->setCameraAngle(0, 0, 0, data.x, data.y, data.z, 5300);
 	renderHolomapModel(_engine->_resources->holomapPointModelPtr, loc.x, loc.y, 0);
 
 	_engine->flip();


Commit: 6ff21ff3218c5acc8bf02c9c838c8c05fede082e
    https://github.com/scummvm/scummvm/commit/6ff21ff3218c5acc8bf02c9c838c8c05fede082e
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-09T21:40:33+01:00

Commit Message:
TWINE: holomap progress

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


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 97931f2ce2..e9f3307b21 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -300,6 +300,7 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 	_engine->_renderer->setCameraAngle(0, 0, 0, data.x, data.y, data.z, 5300);
 
 	renderHolomapSurfacePolygons();
+	_engine->flip();
 
 	const Location &loc = _locations[data.locationIdx];
 	renderHolomapModel(_engine->_resources->holomapPointModelPtr, loc.x, loc.y, 0);
@@ -346,7 +347,7 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 		}
 		_engine->_renderer->setCameraPosition(100, 400, 128, 900, 900);
 		_engine->_renderer->setCameraAngle(0, 0, 0, 60, 128, 0, 30000);
-		_engine->_renderer->setLightVector(0xffffffc4, 128, 0);
+		_engine->_renderer->setLightVector(-60, 128, 0);
 		const Common::Rect rect(0, 200, 199, 479);
 		_engine->_interface->drawFilledRect(rect, COLOR_BLACK);
 		_engine->_renderer->renderIsoModel(0, 0, 0, 0, newAngle, 0, modelPtr);
@@ -487,19 +488,18 @@ 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);
 	_engine->_text->setFontCrossColor(COLOR_9);
+	_engine->_renderer->setCameraPosition(_engine->width() / 2, 190, 128, 1024, 1024);
 
 	int currentLocation = _engine->_scene->currentSceneIdx;
 	_engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
 	_engine->flip();
 
 	int32 time = _engine->lbaTime;
-	int32 xRot = 0;
-	int32 yRot = 0;
+	int32 xRot = ClampAngle(_locations[currentLocation].x);
+	int32 yRot = ClampAngle(_locations[currentLocation].y);
 	bool rotate = false;
 	bool redraw = true;
 	_engine->_input->enableKeyMap(holomapKeyMapId);
@@ -573,8 +573,7 @@ void Holomap::processHolomap() {
 			if (rotate) {
 				_engine->_menu->drawBox(300, 170, 340, 210);
 			}
-			//_engine->copyBlockPhys(rect);
-			_engine->flip();
+			_engine->copyBlockPhys(rect);
 		}
 
 		if (rotate && xRot == _locations[currentLocation].x && yRot == _locations[currentLocation].y) {
diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index ba34c2ed86..e301029402 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -786,7 +786,10 @@ void Text::drawHolomapLocation(int32 index) {
 	textClipSmall();
 	setFontCrossColor(COLOR_WHITE);
 	_engine->_interface->drawFilledRect(_dialTextBox, COLOR_BLACK);
+	const bool displayText = _engine->cfgfile.FlagDisplayText;
+	_engine->cfgfile.FlagDisplayText = true;
 	drawTextProgressive(index, false, false);
+	_engine->cfgfile.FlagDisplayText = displayText;
 }
 
 } // namespace TwinE


Commit: 8ce16227e8b578c77e6eb0a2b95cfaca8437e451
    https://github.com/scummvm/scummvm/commit/8ce16227e8b578c77e6eb0a2b95cfaca8437e451
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-09T21:40:33+01:00

Commit Message:
TWINE: really skip voice playback if playVox is false

Changed paths:
    engines/twine/text.cpp


diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index e301029402..2544273afa 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -637,10 +637,12 @@ bool Text::displayText(int32 index, bool showText, bool playVox, bool loop) {
 				break;
 			}
 
-			playVoxSimple(currDialTextEntry);
+			if (playVox) {
+				playVoxSimple(currDialTextEntry);
+			}
 		}
 	}
-	while (playVoxSimple(currDialTextEntry)) {
+	while (playVox && playVoxSimple(currDialTextEntry)) {
 		FrameMarker frame;
 		ScopedFPS scopedFps;
 		_engine->readKeys();


Commit: 705016c62734b533982c7319f6db26995305eb9f
    https://github.com/scummvm/scummvm/commit/705016c62734b533982c7319f6db26995305eb9f
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-09T21:40:33+01:00

Commit Message:
TWINE: input tweaks, recenter and holomap should be toggle actions

Changed paths:
    engines/twine/twine.cpp


diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index a9c210d5ce..482611f0b3 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -810,7 +810,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
 		}
 
 		// Recenter Screen
-		if (_input->isActionActive(TwinEActionType::RecenterScreenOnTwinsen) && !disableScreenRecenter) {
+		if (_input->toggleActionIfActive(TwinEActionType::RecenterScreenOnTwinsen) && !disableScreenRecenter) {
 			const ActorStruct *currentlyFollowedActor = _scene->getActor(_scene->currentlyFollowedActor);
 			_grid->newCameraX = currentlyFollowedActor->x / BRICK_SIZE;
 			_grid->newCameraY = currentlyFollowedActor->y / BRICK_HEIGHT;
@@ -819,7 +819,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
 		}
 
 		// Draw holomap
-		if (_input->isActionActive(TwinEActionType::OpenHolomap) && _gameState->hasItem(InventoryItems::kiHolomap) && !_gameState->inventoryDisabled()) {
+		if (_input->toggleActionIfActive(TwinEActionType::OpenHolomap) && _gameState->hasItem(InventoryItems::kiHolomap) && !_gameState->inventoryDisabled()) {
 			freezeTime();
 			//TestRestoreModeSVGA(1);
 			_holomap->processHolomap();




More information about the Scummvm-git-logs mailing list