[Scummvm-git-logs] scummvm master -> 847689b5f7b90a54b1d5a776c6723066c2d256b3

mgerhardy martin.gerhardy at gmail.com
Wed Sep 15 16:03:15 UTC 2021


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

Summary:
fa259c8d76 TWINE: fixed movie info loading for lba2
cde4a27d6a TWINE: support TwineResource in Parser class
1587e87617 TWINE: prepare holomap code to work with other surfaces and images
7ec971a42f TWINE: removed outdated comments
e38cc4dc24 TWINE: pass-by-ref (TwineResource)
ce23193986 TWINE: use Common::sort and remove the dirty cast
ac3c3e565e TWINE: use angle constant
06011741f5 TWINE: added constants for holomap colors
847689b5f7 TWINE: improved error checks for palette loading


Commit: fa259c8d76ae590b7f76facc59d56f4309776e0c
    https://github.com/scummvm/scummvm/commit/fa259c8d76ae590b7f76facc59d56f4309776e0c
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-15T17:34:50+02:00

Commit Message:
TWINE: fixed movie info loading for lba2

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 326393ab7d..0e2e32aab9 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -204,7 +204,7 @@ void Resources::initResources() {
 		}
 	}
 
-	loadFlaInfo();
+	loadMovieInfo();
 
 	const int32 textEntryCount = _engine->isLBA1() ? 28 : 30;
 	for (int32 i = 0; i < textEntryCount / 2; ++i) {
@@ -223,35 +223,46 @@ const Trajectory *Resources::getTrajectory(int index) const {
 	return _trajectories.getTrajectory(index);
 }
 
-void Resources::loadFlaInfo() {
+void Resources::loadMovieInfo() {
 	uint8 *content = nullptr;
-	const int32 size = HQR::getAllocEntry(&content, Resources::HQR_RESS_FILE, RESSHQR_FLAINFO);
+	int32 size;
+	if (_engine->isLBA1()) {
+		size = HQR::getAllocEntry(&content, Resources::HQR_RESS_FILE, RESSHQR_FLAINFO);
+	} else {
+		size = HQR::getAllocEntry(&content, Resources::HQR_RESS_FILE, 48);
+	}
 	if (size == 0) {
 		return;
 	}
 	const Common::String str((const char *)content, size);
 	free(content);
-
+	debug(3, "movie info:\n%s", str.c_str());
 	Common::StringTokenizer tok(str, "\r\n");
+	int videoIndex = 0;
 	while (!tok.empty()) {
 		const Common::String &line = tok.nextToken();
-		Common::StringTokenizer lineTok(line);
-		if (lineTok.empty()) {
-			continue;
-		}
-		const Common::String &name = lineTok.nextToken();
-		Common::Array<int32> frames;
-		while (!lineTok.empty()) {
-			const Common::String &frame = lineTok.nextToken();
-			const int32 frameIdx = atoi(frame.c_str());
-			frames.push_back(frameIdx);
+		if (_engine->isLBA1()) {
+			Common::StringTokenizer lineTok(line);
+			if (lineTok.empty()) {
+				continue;
+			}
+			const Common::String &name = lineTok.nextToken();
+			Common::Array<int32> frames;
+			while (!lineTok.empty()) {
+				const Common::String &frame = lineTok.nextToken();
+				const int32 frameIdx = atoi(frame.c_str());
+				frames.push_back(frameIdx);
+			}
+			_movieInfo.setVal(name, frames);
+		} else {
+			Common::Array<int32> info(videoIndex);
+			_movieInfo.setVal(line, info);
 		}
-		_flaMovieFrames.setVal(name, frames);
 	}
 }
 
-const Common::Array<int32> &Resources::getFlaMovieInfo(const Common::String &name) const {
-	return _flaMovieFrames.getVal(name);
+const Common::Array<int32> &Resources::getMovieInfo(const Common::String &name) const {
+	return _movieInfo.getVal(name);
 }
 
 } // namespace TwinE
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index abd55337b5..8e7b8fff4e 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -132,10 +132,10 @@ private:
 	/** Preload all animations */
 	void preloadAnimations();
 	void preloadSamples();
-	void loadFlaInfo();
+	void loadMovieInfo();
 
 	using MovieInfoMap = Common::HashMap<Common::String, Common::Array<int32> >;
-	MovieInfoMap _flaMovieFrames;
+	MovieInfoMap _movieInfo;
 
 	TrajectoryData _trajectories;
 
@@ -145,7 +145,11 @@ public:
 	Resources(TwinEEngine *engine) : _engine(engine) {}
 	~Resources();
 
-	const Common::Array<int32> &getFlaMovieInfo(const Common::String &name) const;
+	/**
+	 * For lba1 this is returning the gif images that are used as a placeholder for the fla movies
+	 * For lba2 this is the list of videos that are mapped by their entry index
+	 */
+	const Common::Array<int32> &getMovieInfo(const Common::String &name) const;
 
 	/** Table with all loaded samples */
 	BodyData _inventoryTable[NUM_INVENTORY_ITEMS];


Commit: cde4a27d6a0e5a30b07755a2c97e3151a4d57c05
    https://github.com/scummvm/scummvm/commit/cde4a27d6a0e5a30b07755a2c97e3151a4d57c05
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-15T17:34:50+02:00

Commit Message:
TWINE: support TwineResource in Parser class

Changed paths:
    engines/twine/parser/parser.h


diff --git a/engines/twine/parser/parser.h b/engines/twine/parser/parser.h
index ae4ca3c759..521cb97e94 100644
--- a/engines/twine/parser/parser.h
+++ b/engines/twine/parser/parser.h
@@ -41,6 +41,10 @@ public:
 
 	bool loadFromBuffer(const uint8 *buf, uint32 size, bool lba1);
 	bool loadFromHQR(const char *name, int index, bool lba1);
+
+	inline bool loadFromHQR(const TwineResource &resource, bool lba1) {
+		return loadFromHQR(resource.hqr, resource.index, lba1);
+	}
 };
 
 } // End of namespace TwinE


Commit: 1587e876170febfc21bcac467b95f0803802e33f
    https://github.com/scummvm/scummvm/commit/1587e876170febfc21bcac467b95f0803802e33f
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-15T17:34:50+02:00

Commit Message:
TWINE: prepare holomap code to work with other surfaces and images

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


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index ce65a52c77..acdd80cf77 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -139,7 +139,13 @@ void Holomap::loadHolomapGFX() {
 	}
 
 	prepareHolomapProjectedPositions();
-	prepareHolomapSurface();
+
+	Common::SeekableReadStream *surfaceStream = HQR::makeReadStream(TwineResource(Resources::HQR_RESS_FILE, RESSHQR_HOLOSURFACE));
+	if (surfaceStream == nullptr) {
+		error("Failed to load holomap surface");
+	}
+	prepareHolomapSurface(surfaceStream);
+	delete surfaceStream;
 	_holomapPaletteIndex = 0;
 }
 
@@ -147,15 +153,13 @@ static int sortHolomapSurfaceCoordsByDepth(const void *a1, const void *a2) {
 	return (int)*(const int16 *)a1 - (int)*(const int16 *)a2;
 }
 
-// verified with disassembly
-void Holomap::prepareHolomapSurface() {
-	Common::MemoryReadStream stream(_engine->_resources->_holomapSurfacePtr, _engine->_resources->_holomapSurfaceSize);
+void Holomap::prepareHolomapSurface(Common::SeekableReadStream *holomapSurfaceStream) {
 	int holomapSurfaceArrayIdx = 0;
 	_engine->_renderer->setBaseRotation(0, 0, 0);
 	for (int angle = -ANGLE_90; angle <= ANGLE_90; angle += ANGLE_11_25) {
 		int rotation = 0;
 		for (int i = 0; i <= ANGLE_11_25; ++i, rotation += ANGLE_11_25) {
-			const int32 rotX = stream.readByte();
+			const int32 rotX = holomapSurfaceStream->readByte();
 			const IVec3& rotVec = _engine->_renderer->getHolomapRotation(rotX, angle, rotation);
 			_holomapSurface[holomapSurfaceArrayIdx].x = rotVec.x;
 			_holomapSurface[holomapSurfaceArrayIdx].y = rotVec.y;
@@ -163,10 +167,9 @@ void Holomap::prepareHolomapSurface() {
 			++holomapSurfaceArrayIdx;
 		}
 	}
-	assert(stream.eos());
+	assert(holomapSurfaceStream->eos());
 }
 
-// verified with disassembly
 void Holomap::prepareHolomapProjectedPositions() {
 	int projectedIndex = 0;
 	for (int32 angle = -ANGLE_90; angle <= ANGLE_90; angle += ANGLE_11_25) {
@@ -191,7 +194,6 @@ void Holomap::prepareHolomapProjectedPositions() {
 	}
 }
 
-// verified with disassembly
 void Holomap::prepareHolomapPolygons() {
 	int holomapSortArrayIdx = 0;
 	int holomapSurfaceArrayIdx = 0;
@@ -234,7 +236,7 @@ bool Holomap::isTriangleVisible(const Vertex *vertices) const {
 	return iVar2 - iVar1 != 0 && iVar1 <= iVar2;
 }
 
-void Holomap::renderHolomapSurfacePolygons() {
+void Holomap::renderHolomapSurfacePolygons(uint8 *holomapImage, uint32 holomapImageSize) {
 	prepareHolomapPolygons();
 	for (int32 i = 0; i < ARRAYSIZE(_holomapSort); ++i) {
 		assert(_holomapSort[i].projectedPosIdx + 34 < _projectedSurfaceIndex);
@@ -256,7 +258,7 @@ void Holomap::renderHolomapSurfacePolygons() {
 			vertexCoordinates2[1].y = pos2.y2;
 			vertexCoordinates2[2].x = pos3.x2;
 			vertexCoordinates2[2].y = pos3.y2;
-			_engine->_renderer->renderHolomapVertices(vertexCoordinates, vertexCoordinates2);
+			_engine->_renderer->renderHolomapVertices(vertexCoordinates, vertexCoordinates2, holomapImage, holomapImageSize);
 		}
 		const HolomapProjectedPos &pos4 = _projectedSurfacePositions[_holomapSort[i].projectedPosIdx + 33];
 		const HolomapProjectedPos &pos5 = _projectedSurfacePositions[_holomapSort[i].projectedPosIdx + 34];
@@ -275,7 +277,7 @@ void Holomap::renderHolomapSurfacePolygons() {
 			vertexCoordinates2[1].y = pos5.y2;
 			vertexCoordinates2[2].x = pos6.x2;
 			vertexCoordinates2[2].y = pos6.y2;
-			_engine->_renderer->renderHolomapVertices(vertexCoordinates, vertexCoordinates2);
+			_engine->_renderer->renderHolomapVertices(vertexCoordinates, vertexCoordinates2, holomapImage, holomapImageSize);
 		}
 	}
 }
@@ -345,7 +347,13 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 	_engine->_renderer->setCameraPosition(cameraPosX, cameraPosY, 128, 1024, 1024);
 	_engine->_renderer->setCameraAngle(0, 0, 0, data->pos.x, data->pos.y, data->pos.z, distance(zDistanceTrajectory));
 
-	renderHolomapSurfacePolygons();
+	constexpr TwineResource holomapImageRes(Resources::HQR_RESS_FILE, RESSHQR_HOLOIMG);
+	uint8 *holomapImagePtr = nullptr;
+	const int32 holomapImageSize = HQR::getAllocEntry(&holomapImagePtr, holomapImageRes);
+	if (holomapImageSize == 0) {
+		error("Failed to load holomap image");
+	}
+	renderHolomapSurfacePolygons(holomapImagePtr, holomapImageSize);
 
 	const Location &loc = _locations[data->locationIdx];
 	renderHolomapPointModel(data->pos, loc.angle.x, loc.angle.y);
@@ -420,6 +428,8 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 
 	_engine->_text->initSceneTextBank();
 	_engine->_input->enableKeyMap(mainKeyMapId);
+
+	free(holomapImagePtr);
 }
 
 int32 Holomap::getNextHolomapLocation(int32 currentLocation, int32 dir) const {
@@ -518,6 +528,13 @@ void Holomap::processHolomap() {
 	const int32 cameraPosY = scale(190);
 	_engine->_renderer->setCameraPosition(cameraPosX, cameraPosY, 128, 1024, 1024);
 
+	constexpr TwineResource holomapImageRes(Resources::HQR_RESS_FILE, RESSHQR_HOLOIMG);
+	uint8 *holomapImagePtr = nullptr;
+	const int32 holomapImageSize = HQR::getAllocEntry(&holomapImagePtr, holomapImageRes);
+	if (holomapImageSize == 0) {
+		error("Failed to load holomap image");
+	}
+
 	int32 currentLocation = _engine->_scene->_currentSceneIdx;
 	_engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
 
@@ -600,7 +617,7 @@ void Holomap::processHolomap() {
 			renderLocations(xRot, yRot, 0, false);
 			_engine->_renderer->setBaseRotation(xRot, yRot, 0, true);
 			_engine->_renderer->setBaseRotationPos(0, 0, distance(zDistanceHolomap));
-			renderHolomapSurfacePolygons();
+			renderHolomapSurfacePolygons(holomapImagePtr, holomapImageSize);
 			renderLocations(xRot, yRot, 0, true);
 			drawHolomapText(_engine->width() / 2, 25, "HoloMap");
 			if (rotate) {
@@ -636,6 +653,8 @@ void Holomap::processHolomap() {
 
 	_engine->_input->enableKeyMap(mainKeyMapId);
 	_engine->_text->initSceneTextBank();
+
+	free(holomapImagePtr);
 }
 
 const char *Holomap::getLocationName(int index) const {
diff --git a/engines/twine/holomap.h b/engines/twine/holomap.h
index 5b4f6d1bb2..0684a975a2 100644
--- a/engines/twine/holomap.h
+++ b/engines/twine/holomap.h
@@ -26,6 +26,10 @@
 #include "twine/shared.h"
 #include "common/scummsys.h"
 
+namespace Common {
+class SeekableReadStream;
+}
+
 namespace TwinE {
 
 class TwinEEngine;
@@ -86,10 +90,10 @@ private:
 	 * Renders a holomap path with single path points appearing slowly one after another
 	 */
 	void renderHolomapPointModel(const IVec3 &angle, int32 x, int32 y);
-	void prepareHolomapSurface();
+	void prepareHolomapSurface(Common::SeekableReadStream *holomapSurfaceStream);
 	void prepareHolomapProjectedPositions();
 	void prepareHolomapPolygons();
-	void renderHolomapSurfacePolygons();
+	void renderHolomapSurfacePolygons(uint8 *holomapImage, uint32 holomapImageSize);
 	void renderHolomapVehicle(uint &frameNumber, ActorMoveStruct &move, AnimTimerDataStruct &animTimerData, BodyData &bodyData, AnimData &animData);
 
 	/**
diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 3c0a8a3b9b..a6b8f93b01 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1692,16 +1692,16 @@ void Renderer::fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2,
 	computeHolomapPolygon(yTop, (uint32)(uint16)angles2.y, yBottom, (uint32)(uint16)angles1.y, polygonTabPtr);
 }
 
-void Renderer::renderHolomapVertices(const Vertex vertexCoordinates[3], const Vertex vertexCoordinates2[3]) {
+void Renderer::renderHolomapVertices(const Vertex vertexCoordinates[3], const Vertex vertexCoordinates2[3], uint8 *holomapImage, uint32 holomapImageSize) {
 	int32 top = SCENE_SIZE_MAX;
 	int32 bottom = SCENE_SIZE_MIN;
 	fillHolomapPolygons(vertexCoordinates[0], vertexCoordinates[1], vertexCoordinates2[0], vertexCoordinates2[1], top, bottom);
 	fillHolomapPolygons(vertexCoordinates[1], vertexCoordinates[2], vertexCoordinates2[1], vertexCoordinates2[2], top, bottom);
 	fillHolomapPolygons(vertexCoordinates[2], vertexCoordinates[0], vertexCoordinates2[2], vertexCoordinates2[0], top, bottom);
-	renderHolomapPolygons(top, bottom);
+	renderHolomapPolygons(top, bottom, holomapImage, holomapImageSize);
 }
 
-void Renderer::renderHolomapPolygons(int32 top, int32 bottom) {
+void Renderer::renderHolomapPolygons(int32 top, int32 bottom, uint8 *holomapImage, uint32 holomapImageSize) {
 	const void *pixelBegin = _engine->_frontVideoBuffer.getBasePtr(0, 0);
 	const void *pixelEnd = _engine->_frontVideoBuffer.getBasePtr(_engine->_frontVideoBuffer.w - 1, _engine->_frontVideoBuffer.h - 1);
 	if (top < 0 || top >= _engine->_frontVideoBuffer.h) {
@@ -1732,12 +1732,12 @@ void Renderer::renderHolomapPolygons(int32 top, int32 bottom) {
 			uint32 uVar3 = (uint32)x_1_2;
 			for (int16 i = 0; i < width; ++i) {
 				const uint32 holomapImageOffset = (uint32)((int32)uVar3 >> 8 & 0xffU) | (uVar1 & 0xff00);
-				assert(holomapImageOffset < _engine->_resources->_holomapImageSize);
+				assert(holomapImageOffset < holomapImageSize);
 				if (pixelBufPtr < pixelBegin || pixelBufPtr > pixelEnd) {
 					++pixelBufPtr;
 				} else {
 					//debug("holomapImageOffset: %i", holomapImageOffset);
-					*pixelBufPtr++ = _engine->_resources->_holomapImagePtr[holomapImageOffset];
+					*pixelBufPtr++ = holomapImage[holomapImageOffset];
 				}
 				uVar1 += (int32)(((uint32)x_2_3 - (uint32)x_1_3) + 1) / iWidth;
 				uVar3 += (int32)(((uint32)x_2_2 - (uint32)x_1_2) + 1) / iWidth;
diff --git a/engines/twine/renderer/renderer.h b/engines/twine/renderer/renderer.h
index 1e3ff1c62d..8ce42a01ed 100644
--- a/engines/twine/renderer/renderer.h
+++ b/engines/twine/renderer/renderer.h
@@ -202,7 +202,7 @@ private:
 
 	void baseMatrixTranspose();
 
-	void renderHolomapPolygons(int32 top, int32 bottom);
+	void renderHolomapPolygons(int32 top, int32 bottom, uint8 *holomapImage, uint32 holomapImageSize);
 	void computeHolomapPolygon(int32 y1, int32 x1, int32 y2, int32 x2, int16 *polygonTabPtr);
 	void fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2, const Vertex &vertex3, const Vertex &vertex4, int32 &top, int32 &bottom);
 
@@ -261,7 +261,7 @@ public:
 
 	void renderInventoryItem(int32 x, int32 y, const BodyData &bodyData, int32 angle, int32 param);
 
-	void renderHolomapVertices(const Vertex vertexCoordinates[3], const Vertex vertexCoordinates2[3]);
+	void renderHolomapVertices(const Vertex vertexCoordinates[3], const Vertex vertexCoordinates2[3], uint8 *holomapImage, uint32 holomapImageSize);
 };
 
 inline void Renderer::setBaseRotationPos(int32 x, int32 y, int32 z) {
diff --git a/engines/twine/resources/resources.cpp b/engines/twine/resources/resources.cpp
index 0e2e32aab9..dca05b661c 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -41,8 +41,6 @@ Resources::~Resources() {
 		free(_samplesTable[i]);
 	}
 	free(_fontPtr);
-	free(_holomapSurfacePtr);
-	free(_holomapImagePtr);
 }
 
 void Resources::initPalettes() {
@@ -148,41 +146,31 @@ void Resources::initResources() {
 	_engine->_text->setTextCrossColor(136, 143, 2);
 
 	if (_engine->isLBA1()) {
-		if (!_spriteShadowPtr.loadFromHQR(Resources::HQR_RESS_FILE, RESSHQR_SPRITESHADOW, _engine->isLBA1())) {
+		if (!_spriteShadowPtr.loadFromHQR(TwineResource(Resources::HQR_RESS_FILE, RESSHQR_SPRITESHADOW), _engine->isLBA1())) {
 			error("Failed to load shadow sprites");
 		}
 
-		if (!_spriteBoundingBox.loadFromHQR(Resources::HQR_RESS_FILE, RESSHQR_SPRITEBOXDATA, _engine->isLBA1())) {
+		if (!_spriteBoundingBox.loadFromHQR(TwineResource(Resources::HQR_RESS_FILE, RESSHQR_SPRITEBOXDATA), _engine->isLBA1())) {
 			error("Failed to load sprite bounding box data");
 		}
 
-		_holomapSurfaceSize = HQR::getAllocEntry(&_holomapSurfacePtr, Resources::HQR_RESS_FILE, RESSHQR_HOLOSURFACE);
-		if (_holomapSurfaceSize == 0) {
-			error("Failed to load holomap surface");
-		}
-
-		_holomapImageSize = HQR::getAllocEntry(&_holomapImagePtr, Resources::HQR_RESS_FILE, RESSHQR_HOLOIMG);
-		if (_holomapImageSize == 0) {
-			error("Failed to load holomap image");
-		}
-
-		if (!_holomapTwinsenModelPtr.loadFromHQR(Resources::HQR_RESS_FILE, RESSHQR_HOLOTWINMDL, _engine->isLBA1())) {
+		if (!_holomapTwinsenModelPtr.loadFromHQR(TwineResource(Resources::HQR_RESS_FILE, RESSHQR_HOLOTWINMDL), _engine->isLBA1())) {
 			error("Failed to load holomap twinsen model");
 		}
 
-		if (!_holomapPointModelPtr.loadFromHQR(Resources::HQR_RESS_FILE, RESSHQR_HOLOPOINTMDL, _engine->isLBA1())) {
+		if (!_holomapPointModelPtr.loadFromHQR(TwineResource(Resources::HQR_RESS_FILE, RESSHQR_HOLOPOINTMDL), _engine->isLBA1())) {
 			error("Failed to load holomap point model");
 		}
 
-		if (!_holomapArrowPtr.loadFromHQR(Resources::HQR_RESS_FILE, RESSHQR_HOLOARROWMDL, _engine->isLBA1())) {
+		if (!_holomapArrowPtr.loadFromHQR(TwineResource(Resources::HQR_RESS_FILE, RESSHQR_HOLOARROWMDL), _engine->isLBA1())) {
 			error("Failed to load holomap arrow model");
 		}
 
-		if (!_holomapTwinsenArrowPtr.loadFromHQR(Resources::HQR_RESS_FILE, RESSHQR_HOLOTWINARROWMDL, _engine->isLBA1())) {
+		if (!_holomapTwinsenArrowPtr.loadFromHQR(TwineResource(Resources::HQR_RESS_FILE, RESSHQR_HOLOTWINARROWMDL), _engine->isLBA1())) {
 			error("Failed to load holomap twinsen arrow model");
 		}
 
-		if (!_trajectories.loadFromHQR(Resources::HQR_RESS_FILE, RESSHQR_HOLOPOINTANIM, _engine->isLBA1())) {
+		if (!_trajectories.loadFromHQR(TwineResource(Resources::HQR_RESS_FILE, RESSHQR_HOLOPOINTANIM), _engine->isLBA1())) {
 			error("Failed to parse trajectory data");
 		}
 		debug("preload %i trajectories", (int)_trajectories.getTrajectories().size());
@@ -199,7 +187,7 @@ void Resources::initResources() {
 		error("Max body count exceeded: %i", bodyCount);
 	}
 	for (int32 i = 0; i < bodyCount; ++i) {
-		if (!_bodyData[i].loadFromHQR(Resources::HQR_BODY_FILE, i, _engine->isLBA1())) {
+		if (!_bodyData[i].loadFromHQR(TwineResource(Resources::HQR_BODY_FILE, i), _engine->isLBA1())) {
 			error("HQR ERROR: Parsing body entity for model %i failed", i);
 		}
 	}
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index 8e7b8fff4e..1194a8b961 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -177,11 +177,6 @@ public:
 	SpriteData _spriteShadowPtr;
 	SpriteBoundingBoxData _spriteBoundingBox;
 
-	uint32 _holomapSurfaceSize = 0;
-	uint8 *_holomapSurfacePtr = nullptr;
-	uint32 _holomapImageSize = 0;
-	uint8 *_holomapImagePtr = nullptr;
-
 	BodyData _holomapPointModelPtr;
 	BodyData _holomapTwinsenModelPtr;
 	BodyData _holomapTwinsenArrowPtr;


Commit: 7ec971a42fa042b9299611afd1c666bc2b3284d5
    https://github.com/scummvm/scummvm/commit/7ec971a42fa042b9299611afd1c666bc2b3284d5
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-15T17:34:50+02:00

Commit Message:
TWINE: removed outdated comments

Changed paths:
    engines/twine/holomap.cpp


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index acdd80cf77..2b677d5a8a 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -632,10 +632,6 @@ void Holomap::processHolomap() {
 
 		++_engine->_lbaTime;
 
-		// TODO: text afterwards on top (not before as it is currently implemented)?
-		// pos 0x140,0x19?
-
-		//_engine->restoreFrontBuffer();
 		if (fadeInPalette) {
 			fadeInPalette = false;
 			_engine->_screens->fadeToPal(_engine->_screens->_paletteRGBACustom);


Commit: e38cc4dc24b2ac3401f7dd44f44b9db95c3ba7ba
    https://github.com/scummvm/scummvm/commit/e38cc4dc24b2ac3401f7dd44f44b9db95c3ba7ba
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-15T17:34:50+02:00

Commit Message:
TWINE: pass-by-ref (TwineResource)

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


diff --git a/engines/twine/resources/hqr.h b/engines/twine/resources/hqr.h
index 1cddb9cfb4..886393044b 100644
--- a/engines/twine/resources/hqr.h
+++ b/engines/twine/resources/hqr.h
@@ -47,7 +47,7 @@ namespace HQR {
  * @return entry real size
  */
 int32 getEntry(uint8 *ptr, const char *filename, int32 index);
-inline int32 getEntry(uint8 *ptr, TwineResource resource) {
+inline int32 getEntry(uint8 *ptr, const TwineResource &resource) {
 	return getEntry(ptr, resource.hqr, resource.index);
 }
 
@@ -58,7 +58,7 @@ inline int32 getEntry(uint8 *ptr, TwineResource resource) {
  * @return entry real size
  */
 int32 entrySize(const char *filename, int32 index);
-inline int32 entrySize(TwineResource resource) {
+inline int32 entrySize(const TwineResource &resource) {
 	return entrySize(resource.hqr, resource.index);
 }
 
@@ -78,7 +78,7 @@ int32 numEntries(const char *filename);
  * @return entry real size
  */
 int32 getAllocEntry(uint8 **ptr, const char *filename, int32 index);
-inline int32 getAllocEntry(uint8 **ptr, TwineResource resource) {
+inline int32 getAllocEntry(uint8 **ptr, const TwineResource &resource) {
 	return getAllocEntry(ptr, resource.hqr, resource.index);
 }
 
@@ -86,7 +86,7 @@ inline int32 getAllocEntry(uint8 **ptr, TwineResource resource) {
  * @brief Helper method to dump the content of the given hqr index to a file
  */
 bool dumpEntry(const char *filename, int32 index, const char *targetFileName);
-inline bool dumpEntry(TwineResource resource, const char *targetFileName) {
+inline bool dumpEntry(const TwineResource &resource, const char *targetFileName) {
 	return dumpEntry(resource.hqr, resource.index, targetFileName);
 }
 
@@ -109,7 +109,7 @@ int32 getVoxEntry(uint8 *ptr, const char *filename, int32 index, int32 hiddenInd
 int32 getAllocVoxEntry(uint8 **ptr, const char *filename, int32 index, int32 hiddenIndex);
 
 Common::SeekableReadStream *makeReadStream(const char *filename, int index);
-inline Common::SeekableReadStream *makeReadStream(TwineResource resource) {
+inline Common::SeekableReadStream *makeReadStream(const TwineResource &resource) {
 	return makeReadStream(resource.hqr, resource.index);
 }
 } // namespace HQR


Commit: ce2319398628e869866589489beb54861796ce51
    https://github.com/scummvm/scummvm/commit/ce2319398628e869866589489beb54861796ce51
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-15T17:34:50+02:00

Commit Message:
TWINE: use Common::sort and remove the dirty cast

Changed paths:
    engines/twine/holomap.cpp


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 2b677d5a8a..0d0b72bf60 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "twine/holomap.h"
+#include "common/algorithm.h"
 #include "common/debug.h"
 #include "common/memstream.h"
 #include "common/stream.h"
@@ -149,10 +150,6 @@ void Holomap::loadHolomapGFX() {
 	_holomapPaletteIndex = 0;
 }
 
-static int sortHolomapSurfaceCoordsByDepth(const void *a1, const void *a2) {
-	return (int)*(const int16 *)a1 - (int)*(const int16 *)a2;
-}
-
 void Holomap::prepareHolomapSurface(Common::SeekableReadStream *holomapSurfaceStream) {
 	int holomapSurfaceArrayIdx = 0;
 	_engine->_renderer->setBaseRotation(0, 0, 0);
@@ -225,7 +222,7 @@ void Holomap::prepareHolomapPolygons() {
 	assert(holomapSortArrayIdx == ARRAYSIZE(_holomapSort));
 	assert(holomapSurfaceArrayIdx == ARRAYSIZE(_holomapSurface));
 	assert(_projectedSurfaceIndex == ARRAYSIZE(_projectedSurfacePositions));
-	qsort(_holomapSort, ARRAYSIZE(_holomapSort), sizeof(HolomapSort), sortHolomapSurfaceCoordsByDepth);
+	Common::sort(_holomapSort, _holomapSort + ARRAYSIZE(_holomapSort), [](const HolomapSort &a, const HolomapSort &b) { return a.z < b.z; });
 }
 
 bool Holomap::isTriangleVisible(const Vertex *vertices) const {


Commit: ac3c3e565e5448cdd33509f599f2f35096cf5e87
    https://github.com/scummvm/scummvm/commit/ac3c3e565e5448cdd33509f599f2f35096cf5e87
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-15T17:34:50+02:00

Commit Message:
TWINE: use angle constant

Changed paths:
    engines/twine/holomap.cpp


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 0d0b72bf60..db87ff33bc 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -157,7 +157,7 @@ void Holomap::prepareHolomapSurface(Common::SeekableReadStream *holomapSurfaceSt
 		int rotation = 0;
 		for (int i = 0; i <= ANGLE_11_25; ++i, rotation += ANGLE_11_25) {
 			const int32 rotX = holomapSurfaceStream->readByte();
-			const IVec3& rotVec = _engine->_renderer->getHolomapRotation(rotX, angle, rotation);
+			const IVec3 &rotVec = _engine->_renderer->getHolomapRotation(rotX, angle, rotation);
 			_holomapSurface[holomapSurfaceArrayIdx].x = rotVec.x;
 			_holomapSurface[holomapSurfaceArrayIdx].y = rotVec.y;
 			_holomapSurface[holomapSurfaceArrayIdx].z = rotVec.z;
@@ -196,9 +196,9 @@ void Holomap::prepareHolomapPolygons() {
 	int holomapSurfaceArrayIdx = 0;
 	_projectedSurfaceIndex = 0;
 	for (int32 angle = -ANGLE_90; angle <= ANGLE_90; angle += ANGLE_11_25) {
-		int rotation = 0;
+		int rotation = ANGLE_0;
 		for (int32 stepWidth = 0; stepWidth < ANGLE_11_25; ++stepWidth) {
-			IVec3* vec = &_holomapSurface[holomapSurfaceArrayIdx++];
+			IVec3 *vec = &_holomapSurface[holomapSurfaceArrayIdx++];
 			const IVec3 &destPos = _engine->_renderer->getBaseRotationPosition(vec->x, vec->y, vec->z);
 			if (angle != ANGLE_90) {
 				_holomapSort[holomapSortArrayIdx].z = destPos.z;
@@ -211,7 +211,7 @@ void Holomap::prepareHolomapPolygons() {
 			rotation += ANGLE_11_25;
 			++_projectedSurfaceIndex;
 		}
-		IVec3* vec = &_holomapSurface[holomapSurfaceArrayIdx++];
+		IVec3 *vec = &_holomapSurface[holomapSurfaceArrayIdx++];
 		const IVec3 &destPos = _engine->_renderer->getBaseRotationPosition(vec->x, vec->y, vec->z);
 		const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(destPos);
 		_projectedSurfacePositions[_projectedSurfaceIndex].x1 = projPos.x;


Commit: 06011741f56953a72795d2fe76cd71840dea75b4
    https://github.com/scummvm/scummvm/commit/06011741f56953a72795d2fe76cd71840dea75b4
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-15T17:34:50+02:00

Commit Message:
TWINE: added constants for holomap colors

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


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index db87ff33bc..c2783b76bf 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -125,15 +125,16 @@ void Holomap::loadHolomapGFX() {
 	constexpr TwineResource resource(Resources::HQR_RESS_FILE, RESSHQR_HOLOPAL);
 	_engine->_screens->loadCustomPalette(resource);
 
-	int32 j = 576;
-	for (int32 i = 0; i < 96; i += 3, j += 3) {
+	int32 j = HOLOMAP_PALETTE_INDEX * 3;
+	const int32 n = NUM_HOLOMAPCOLORS * 3;
+	for (int32 i = 0; i < n; i += 3, j += 3) {
 		_paletteHolomap[i + 0] = _engine->_screens->_palette[j + 0];
 		_paletteHolomap[i + 1] = _engine->_screens->_palette[j + 1];
 		_paletteHolomap[i + 2] = _engine->_screens->_palette[j + 2];
 	}
 
-	j = 576;
-	for (int32 i = 96; i < 189; i += 3, j += 3) {
+	j = HOLOMAP_PALETTE_INDEX * 3;
+	for (int32 i = n; i < 2 * n - 3; i += 3, j += 3) {
 		_paletteHolomap[i + 0] = _engine->_screens->_palette[j + 0];
 		_paletteHolomap[i + 1] = _engine->_screens->_palette[j + 1];
 		_paletteHolomap[i + 2] = _engine->_screens->_palette[j + 2];
@@ -377,8 +378,8 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 
 		if (!fadeInPalette && waterPaletteChangeTimer < _engine->_lbaTime) {
 			// animate the water surface
-			_engine->setPalette(192, 32, &_paletteHolomap[3 * _holomapPaletteIndex++]);
-			if (_holomapPaletteIndex == 32) {
+			_engine->setPalette(HOLOMAP_PALETTE_INDEX, NUM_HOLOMAPCOLORS, &_paletteHolomap[3 * _holomapPaletteIndex++]);
+			if (_holomapPaletteIndex == NUM_HOLOMAPCOLORS) {
 				_holomapPaletteIndex = 0;
 			}
 			waterPaletteChangeTimer = _engine->_lbaTime + 3;
@@ -597,8 +598,8 @@ void Holomap::processHolomap() {
 
 		if (!fadeInPalette && waterPaletteChangeTimer < _engine->_lbaTime) {
 			// animate the water surface
-			_engine->setPalette(192, 32, &_paletteHolomap[3 * _holomapPaletteIndex++]);
-			if (_holomapPaletteIndex == 32) {
+			_engine->setPalette(HOLOMAP_PALETTE_INDEX, NUM_HOLOMAPCOLORS, &_paletteHolomap[3 * _holomapPaletteIndex++]);
+			if (_holomapPaletteIndex == NUM_HOLOMAPCOLORS) {
 				_holomapPaletteIndex = 0;
 			}
 			waterPaletteChangeTimer = _engine->_lbaTime + 3;
diff --git a/engines/twine/holomap.h b/engines/twine/holomap.h
index 0684a975a2..05c368b5e7 100644
--- a/engines/twine/holomap.h
+++ b/engines/twine/holomap.h
@@ -26,6 +26,9 @@
 #include "twine/shared.h"
 #include "common/scummsys.h"
 
+#define NUM_HOLOMAPCOLORS 32
+#define HOLOMAP_PALETTE_INDEX 192
+
 namespace Common {
 class SeekableReadStream;
 }


Commit: 847689b5f7b90a54b1d5a776c6723066c2d256b3
    https://github.com/scummvm/scummvm/commit/847689b5f7b90a54b1d5a776c6723066c2d256b3
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-15T17:34:50+02:00

Commit Message:
TWINE: improved error checks for palette loading

Changed paths:
    engines/twine/renderer/screens.cpp


diff --git a/engines/twine/renderer/screens.cpp b/engines/twine/renderer/screens.cpp
index 98d4e6733d..8267e89f34 100644
--- a/engines/twine/renderer/screens.cpp
+++ b/engines/twine/renderer/screens.cpp
@@ -43,10 +43,15 @@ void Screens::loadMenuImage(bool fadeIn) {
 }
 
 void Screens::loadCustomPalette(const TwineResource &resource) {
-	if (HQR::getEntry(_palette, resource.hqr, resource.index) == 0) {
-		warning("Failed to load custom palette %i", resource.index);
+	const int32 size = HQR::getEntry(_palette, resource.hqr, resource.index);
+	if (size == 0) {
+		warning("Failed to load custom palette %s:%i", resource.hqr, resource.index);
 		return;
 	}
+	if (size != (int32)sizeof(_palette)) {
+		warning("Unexpected palette size %s:%i", resource.hqr, resource.index);
+	}
+	debug(3, "palette %s:%i with size %i", resource.hqr, resource.index, size);
 	convertPalToRGBA(_palette, _paletteRGBACustom);
 }
 




More information about the Scummvm-git-logs mailing list