[Scummvm-git-logs] scummvm master -> 15dd09a527a54aa77e1e893be6a4275f20732766

mgerhardy martin.gerhardy at gmail.com
Tue Aug 10 07:35:10 UTC 2021


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

Summary:
40e53bd4ef TWINE: started with lba2 model parsing
f8641cf823 TWINE: renamed members and use constants
8073e15a1b TWINE: moved constant into cpp file
ff79ea61da TWINE: moved mainpalette and renamed members
a7f09b0214 TWINE: improved sprite parser
0a928d25e0 TWINE: use SpriteData for shadow sprite
15dd09a527 EVENTRECORDER: fixed compilation


Commit: 40e53bd4ef60aecb1006de70398de86528cb2a49
    https://github.com/scummvm/scummvm/commit/40e53bd4ef60aecb1006de70398de86528cb2a49
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T09:21:33+02:00

Commit Message:
TWINE: started with lba2 model parsing

Changed paths:
    engines/twine/parser/body.cpp


diff --git a/engines/twine/parser/body.cpp b/engines/twine/parser/body.cpp
index 7d5201ebff..e92c74b5a1 100644
--- a/engines/twine/parser/body.cpp
+++ b/engines/twine/parser/body.cpp
@@ -154,21 +154,52 @@ void BodyData::loadSpheres(Common::SeekableReadStream &stream) {
 }
 
 bool BodyData::loadFromStream(Common::SeekableReadStream &stream, bool lba1) {
-	bodyFlag.value = stream.readUint16LE();
-	bbox.mins.x = stream.readSint16LE();
-	bbox.maxs.x = stream.readSint16LE();
-	bbox.mins.y = stream.readSint16LE();
-	bbox.maxs.y = stream.readSint16LE();
-	bbox.mins.z = stream.readSint16LE();
-	bbox.maxs.z = stream.readSint16LE();
-
-	stream.seek(0x1A);
-	loadVertices(stream);
-	loadBones(stream);
-	loadShades(stream);
-	loadPolygons(stream);
-	loadLines(stream);
-	loadSpheres(stream);
+	if (lba1) {
+		bodyFlag.value = stream.readUint16LE();
+		bbox.mins.x = stream.readSint16LE();
+		bbox.maxs.x = stream.readSint16LE();
+		bbox.mins.y = stream.readSint16LE();
+		bbox.maxs.y = stream.readSint16LE();
+		bbox.mins.z = stream.readSint16LE();
+		bbox.maxs.z = stream.readSint16LE();
+
+		stream.seek(0x1A);
+		loadVertices(stream);
+		loadBones(stream);
+		loadShades(stream);
+		loadPolygons(stream);
+		loadLines(stream);
+		loadSpheres(stream);
+	} else {
+		bodyFlag.value = stream.readUint32LE();
+		stream.skip(4);
+		bbox.mins.x = stream.readSint32LE();
+		bbox.maxs.x = stream.readSint32LE();
+		bbox.mins.y = stream.readSint32LE();
+		bbox.maxs.y = stream.readSint32LE();
+		bbox.mins.z = stream.readSint32LE();
+		bbox.maxs.z = stream.readSint32LE();
+		stream.seek(0x20);
+#if 0
+		const uint32 bonesSize = stream.readUint32LE();
+		const uint32 bonesOffset = stream.readUint32LE();
+		const uint32 verticesSize = stream.readUint32LE();
+		const uint32 verticesOffset = stream.readUint32LE();
+		const uint32 normalsSize = stream.readUint32LE();
+		const uint32 normalsOffset = stream.readUint32LE();
+		const uint32 unk1Size = stream.readUint32LE();
+		const uint32 unk1Offset = stream.readUint32LE();
+		const uint32 polygonsSize = stream.readUint32LE();
+		const uint32 polygonsOffset = stream.readUint32LE();
+		const uint32 linesSize = stream.readUint32LE();
+		const uint32 linesOffset = stream.readUint32LE();
+		const uint32 spheresSize = stream.readUint32LE();
+		const uint32 spheresOffset = stream.readUint32LE();
+		const uint32 uvGroupsSize = stream.readUint32LE();
+		const uint32 uvGroupsOffset = stream.readUint32LE();
+#endif
+	}
+
 	return !stream.err();
 }
 


Commit: f8641cf823977fae9c8b5758868760b853301de5
    https://github.com/scummvm/scummvm/commit/f8641cf823977fae9c8b5758868760b853301de5
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T09:21:33+02:00

Commit Message:
TWINE: renamed members and use constants

Changed paths:
    engines/twine/scene/actor.cpp
    engines/twine/scene/collision.cpp
    engines/twine/scene/grid.cpp
    engines/twine/scene/grid.h


diff --git a/engines/twine/scene/actor.cpp b/engines/twine/scene/actor.cpp
index b715bf823d..3c8afe1540 100644
--- a/engines/twine/scene/actor.cpp
+++ b/engines/twine/scene/actor.cpp
@@ -344,7 +344,7 @@ void Actor::hitActor(int32 actorIdx, int32 actorIdxAttacked, int32 strengthOfHit
 	}
 }
 
-void Actor::processActorCarrier(int32 actorIdx) { // CheckCarrier
+void Actor::processActorCarrier(int32 actorIdx) {
 	ActorStruct *actor = _engine->_scene->getActor(actorIdx);
 	if (!actor->_staticFlags.bIsCarrierActor) {
 		return;
@@ -356,7 +356,7 @@ void Actor::processActorCarrier(int32 actorIdx) { // CheckCarrier
 	}
 }
 
-void Actor::processActorExtraBonus(int32 actorIdx) { // GiveExtraBonus
+void Actor::processActorExtraBonus(int32 actorIdx) {
 	ActorStruct *actor = _engine->_scene->getActor(actorIdx);
 
 	const int bonusSprite = _engine->_extra->getBonusSprite(actor->_bonusParameter);
@@ -367,10 +367,11 @@ void Actor::processActorExtraBonus(int32 actorIdx) { // GiveExtraBonus
 		_engine->_extra->addExtraBonus(actor->pos(), ANGLE_90, ANGLE_0, bonusSprite, actor->_bonusAmount);
 		_engine->_sound->playSample(Samples::ItemPopup, 1, actor->pos(), actorIdx);
 	} else {
-		ActorStruct *sceneHero = _engine->_scene->_sceneHero;
+		const ActorStruct *sceneHero = _engine->_scene->_sceneHero;
 		const int32 angle = _engine->_movements->getAngleAndSetTargetActorDistance(actor->pos(), sceneHero->pos());
-		_engine->_extra->addExtraBonus(actor->_pos.x, actor->_pos.y + actor->_boudingBox.maxs.y, actor->_pos.z, ANGLE_70, angle, bonusSprite, actor->_bonusAmount);
-		_engine->_sound->playSample(Samples::ItemPopup, 1, actor->_pos.x, actor->_pos.y + actor->_boudingBox.maxs.y, actor->_pos.z, actorIdx);
+		const IVec3 pos(actor->_pos.x, actor->_pos.y + actor->_boudingBox.maxs.y, actor->_pos.z);
+		_engine->_extra->addExtraBonus(pos, ANGLE_70, angle, bonusSprite, actor->_bonusAmount);
+		_engine->_sound->playSample(Samples::ItemPopup, 1, pos, actorIdx);
 	}
 }
 
diff --git a/engines/twine/scene/collision.cpp b/engines/twine/scene/collision.cpp
index c9f8166495..65c7479366 100644
--- a/engines/twine/scene/collision.cpp
+++ b/engines/twine/scene/collision.cpp
@@ -123,14 +123,14 @@ void Collision::reajustActorPosition(ShapeType brickShape) {
 			}
 			break;
 		case ShapeType::kDoubleSideStairsLeft1:
-			if (512 - processActor.x - _collision.x <= processActor.z - _collision.z) {
+			if (BRICK_SIZE - processActor.x - _collision.x <= processActor.z - _collision.z) {
 				brickShape = ShapeType::kStairsTopLeft;
 			} else {
 				brickShape = ShapeType::kStairsBottomLeft;
 			}
 			break;
 		case ShapeType::kDoubleSideStairsRight1:
-			if (512 - processActor.x - _collision.x <= processActor.z - _collision.z) {
+			if (BRICK_SIZE - processActor.x - _collision.x <= processActor.z - _collision.z) {
 				brickShape = ShapeType::kStairsTopRight;
 			} else {
 				brickShape = ShapeType::kStairsBottomRight;
@@ -151,14 +151,14 @@ void Collision::reajustActorPosition(ShapeType brickShape) {
 			}
 			break;
 		case ShapeType::kDoubleSideStairsLeft2:
-			if (512 - processActor.x - _collision.x <= processActor.z - _collision.z) {
+			if (BRICK_SIZE - processActor.x - _collision.x <= processActor.z - _collision.z) {
 				brickShape = ShapeType::kStairsBottomLeft;
 			} else {
 				brickShape = ShapeType::kStairsTopLeft;
 			}
 			break;
 		case ShapeType::kDoubleSideStairsRight2:
-			if (512 - processActor.x - _collision.x <= processActor.z - _collision.z) {
+			if (BRICK_SIZE - processActor.x - _collision.x <= processActor.z - _collision.z) {
 				brickShape = ShapeType::kStairsBottomRight;
 			} else {
 				brickShape = ShapeType::kStairsTopRight;
diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index 5c331e0ba9..0385713eb0 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -51,7 +51,7 @@ Grid::~Grid() {
 		free(_brickTable[i]);
 	}
 	free(_currentGrid);
-	free(_currentBll);
+	free(_currentBlockLibrary);
 	free(_brickInfoBuffer);
 	free(_bricksDataBuffer);
 }
@@ -297,8 +297,8 @@ void Grid::loadGridBricks() {
 		const uint8 currentBitMask = 1 << (7 - (i & 7));
 
 		if (currentBitByte & currentBitMask) {
-			uint32 currentBllOffset = READ_LE_UINT32(_currentBll + currentBllEntryIdx);
-			const uint8 *currentBllPtr = _currentBll + currentBllOffset;
+			uint32 currentBllOffset = READ_LE_UINT32(_currentBlockLibrary + currentBllEntryIdx);
+			const uint8 *currentBllPtr = _currentBlockLibrary + currentBllOffset;
 
 			const uint32 bllSizeX = *currentBllPtr++;
 			const uint32 bllSizeY = *currentBllPtr++;
@@ -444,7 +444,7 @@ bool Grid::initGrid(int32 index) {
 	}
 
 	// load layouts from file
-	if (HQR::getAllocEntry(&_currentBll, Resources::HQR_LBA_BLL_FILE, index) == 0) {
+	if (HQR::getAllocEntry(&_currentBlockLibrary, Resources::HQR_LBA_BLL_FILE, index) == 0) {
 		warning("Failed to load block library index: %i", index);
 		return false;
 	}
@@ -453,7 +453,7 @@ bool Grid::initGrid(int32 index) {
 
 	createGridMask();
 
-	_numberOfBll = READ_LE_INT32(_currentBll) >> 2;
+	_numberOfBll = READ_LE_INT32(_currentBlockLibrary) >> 2;
 
 	createGridMap();
 
@@ -594,28 +594,29 @@ bool Grid::drawBrickSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr
 
 const uint8 *Grid::getBlockBufferGround(const IVec3 &pos, int32 &ground) {
 	const IVec3 &collision = updateCollisionCoordinates(pos.x, pos.y, pos.z);
-	const int32 tempX = collision.x;
-	int32 tempY = collision.y;
-	const int32 tempZ = collision.z;
-	const uint8 *ptr = _blockBuffer + tempY * 2 + tempX * GRID_SIZE_Y * 2 + (tempZ * GRID_SIZE_X) * GRID_SIZE_Y * 2;
+	const uint8 *ptr = _blockBuffer
+					   + collision.y * sizeof(int16)
+					   + collision.x * GRID_SIZE_Y * sizeof(int16)
+					   + collision.z * GRID_SIZE_X * GRID_SIZE_Y * sizeof(int16);
 
-	while (tempY) {
+	int32 collisionY = collision.y;
+	while (collisionY) {
 		if (READ_LE_INT16(ptr)) { // found the ground
 			break;
 		}
-		tempY--;
-		ptr -= 2;
+		collisionY--;
+		ptr -= sizeof(int16);
 	}
 
-	_engine->_collision->_collision.y = tempY;
-	ground = (int16)((tempY + 1) * BRICK_HEIGHT);
+	_engine->_collision->_collision.y = collisionY;
+	ground = (int16)((collisionY + 1) * BRICK_HEIGHT);
 
 	return ptr;
 }
 
 const uint8 *Grid::getBlockLibrary(int32 index) const {
-	const int32 offset = READ_LE_UINT32(_currentBll + 4 * index);
-	return (const uint8 *)(_currentBll + offset);
+	const int32 offset = READ_LE_UINT32(_currentBlockLibrary + 4 * index);
+	return (const uint8 *)(_currentBlockLibrary + offset);
 }
 
 void Grid::getBrickPos(int32 x, int32 y, int32 z) {
@@ -722,7 +723,7 @@ ShapeType Grid::getBrickShape(int32 x, int32 y, int32 z) {
 	uint8 blockIdx = *blockBufferPtr;
 
 	if (blockIdx) {
-		const uint8 *blockPtr = _currentBll;
+		const uint8 *blockPtr = _currentBlockLibrary;
 
 		blockPtr += READ_LE_UINT32(blockPtr + blockIdx * 4 - 4);
 		blockPtr += 3;
@@ -765,7 +766,7 @@ ShapeType Grid::getBrickShapeFull(int32 x, int32 y, int32 z, int32 y2) {
 	uint8 blockIdx = *blockBufferPtr;
 
 	if (blockIdx) {
-		const uint8 *blockPtr = _currentBll;
+		const uint8 *blockPtr = _currentBlockLibrary;
 
 		blockPtr += READ_LE_UINT32(blockPtr + blockIdx * 4 - 4);
 		blockPtr += 3;
@@ -837,7 +838,7 @@ int32 Grid::getBrickSoundType(int32 x, int32 y, int32 z) {
 	uint8 blockIdx = *blockBufferPtr;
 
 	if (blockIdx) {
-		const uint8 *blockPtr = _currentBll;
+		const uint8 *blockPtr = _currentBlockLibrary;
 
 		blockPtr += READ_LE_UINT32(blockPtr + blockIdx * 4 - 4);
 		blockPtr += 3;
diff --git a/engines/twine/scene/grid.h b/engines/twine/scene/grid.h
index 1d7cd5cfd0..c3f8e9bc89 100644
--- a/engines/twine/scene/grid.h
+++ b/engines/twine/scene/grid.h
@@ -159,7 +159,7 @@ private:
 	int32 _currentGridSize = 0;
 	uint8 *_currentGrid = nullptr;
 	/** Current block library pointer */
-	uint8 *_currentBll = nullptr;
+	uint8 *_currentBlockLibrary = nullptr;
 	/** Number of block libraries */
 	int32 _numberOfBll = 0;
 


Commit: 8073e15a1bff83a051f24e7def6b1128a149b285
    https://github.com/scummvm/scummvm/commit/8073e15a1bff83a051f24e7def6b1128a149b285
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T09:21:33+02:00

Commit Message:
TWINE: moved constant into cpp file

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


diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index 0385713eb0..3867f4771d 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -35,6 +35,8 @@
 #include "twine/scene/scene.h"
 #include "twine/twine.h"
 
+#define CELLING_GRIDS_START_INDEX 120
+
 namespace TwinE {
 
 Grid::Grid(TwinEEngine *engine) : _engine(engine) {
diff --git a/engines/twine/scene/grid.h b/engines/twine/scene/grid.h
index c3f8e9bc89..c73e50a904 100644
--- a/engines/twine/scene/grid.h
+++ b/engines/twine/scene/grid.h
@@ -64,9 +64,6 @@ struct BrickEntry {
 /** Total number of bricks allowed in the game */
 #define NUM_BRICKS 9000
 
-/** Total number of bricks allowed in the game */
-#define CELLING_GRIDS_START_INDEX 120
-
 /** Grip X size */
 #define GRID_SIZE_X 64
 /** Grip Y size */


Commit: ff79ea61da6cef1f2f83525f3121235d93c4e6ca
    https://github.com/scummvm/scummvm/commit/ff79ea61da6cef1f2f83525f3121235d93c4e6ca
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T09:21:34+02:00

Commit Message:
TWINE: moved mainpalette and renamed members

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


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 73008bfe6b..838dbd3d8a 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -281,7 +281,7 @@ void Holomap::renderHolomapPointModel(const IVec3 &angle, int32 x, int32 y) {
 	_engine->_renderer->getBaseRotationPosition(destPos);
 	_engine->_interface->resetClip();
 	Common::Rect dummy;
-	_engine->_renderer->renderIsoModel(destPos, x, y, ANGLE_0, _engine->_resources->holomapPointModelPtr, dummy);
+	_engine->_renderer->renderIsoModel(destPos, x, y, ANGLE_0, _engine->_resources->_holomapPointModelPtr, dummy);
 	// debug(3, "renderHolomapPointModel(%i, %i): dirty(%i:%i:%i:%i)", x, y, dummy.left, dummy.top, dummy.right, dummy.bottom);
 	// TODO: update the screen _engine->copyBlockPhys(_engine->rect());
 }
@@ -475,11 +475,11 @@ void Holomap::renderLocations(int xRot, int yRot, int zRot, bool lower) {
 		const uint16 flags = drawList.type;
 		const BodyData *bodyData = nullptr;
 		if (flags == 1u) {
-			bodyData = &_engine->_resources->holomapArrowPtr;
+			bodyData = &_engine->_resources->_holomapArrowPtr;
 		} else if (flags == 2u) {
-			bodyData = &_engine->_resources->holomapTwinsenModelPtr;
+			bodyData = &_engine->_resources->_holomapTwinsenModelPtr;
 		} else if (flags == 3u) {
-			bodyData = &_engine->_resources->holomapTwinsenArrowPtr;
+			bodyData = &_engine->_resources->_holomapTwinsenArrowPtr;
 		}
 		if (bodyData != nullptr) {
 			int32 angleX = _locations[drawList.actorIdx].angle.x;
diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 7e143b26c2..e06979f743 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1623,12 +1623,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 < _engine->_resources->_holomapImageSize);
 				if (pixelBufPtr < pixelBegin || pixelBufPtr > pixelEnd) {
 					++pixelBufPtr;
 				} else {
 					//debug("holomapImageOffset: %i", holomapImageOffset);
-					*pixelBufPtr++ = _engine->_resources->holomapImagePtr[holomapImageOffset];
+					*pixelBufPtr++ = _engine->_resources->_holomapImagePtr[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/screens.h b/engines/twine/renderer/screens.h
index d028f66760..e97b228249 100644
--- a/engines/twine/renderer/screens.h
+++ b/engines/twine/renderer/screens.h
@@ -66,9 +66,6 @@ public:
 	/** flag to check if we are using a different palette than the main one */
 	bool _useAlternatePalette = false;
 
-	/** main game palette */
-	uint8 *_mainPalette = nullptr;
-
 	/** converted in-game palette */
 	uint32 _mainPaletteRGBA[NUMOFCOLORS]{0};
 
diff --git a/engines/twine/resources/resources.cpp b/engines/twine/resources/resources.cpp
index e0a2b482fe..a2a603c8fb 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -43,21 +43,22 @@ Resources::~Resources() {
 	free(_fontPtr);
 	free(_spriteShadowPtr);
 	free(_holomapSurfacePtr);
-	free(holomapImagePtr);
-	free(_engine->_screens->_mainPalette);
+	free(_holomapImagePtr);
 }
 
 void Resources::initPalettes() {
-	const int32 size = HQR::getAllocEntry(&_engine->_screens->_mainPalette, Resources::HQR_RESS_FILE, RESSHQR_MAINPAL);
+	uint8 *mainPalette = nullptr;
+	const int32 size = HQR::getAllocEntry(&mainPalette, Resources::HQR_RESS_FILE, RESSHQR_MAINPAL);
 	if (size == 0) {
 		error("Failed to load main palette");
 	}
-	_engine->_screens->convertPalToRGBA(_engine->_screens->_mainPalette, _engine->_screens->_mainPaletteRGBA);
+	_engine->_screens->convertPalToRGBA(mainPalette, _engine->_screens->_mainPaletteRGBA);
 
-	memcpy(_engine->_screens->_palette, _engine->_screens->_mainPalette, NUMOFCOLORS * 3);
+	memcpy(_engine->_screens->_palette, mainPalette, NUMOFCOLORS * 3);
 
 	_engine->_screens->convertPalToRGBA(_engine->_screens->_palette, _engine->_screens->_paletteRGBA);
 	_engine->setPalette(_engine->_screens->_paletteRGBA);
+	free(mainPalette);
 }
 
 void Resources::preloadSprites() {
@@ -163,24 +164,24 @@ void Resources::initResources() {
 		error("Failed to load holomap surface");
 	}
 
-	holomapImageSize = HQR::getAllocEntry(&holomapImagePtr, Resources::HQR_RESS_FILE, RESSHQR_HOLOIMG);
-	if (holomapImageSize == 0) {
+	_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(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(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(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(Resources::HQR_RESS_FILE, RESSHQR_HOLOTWINARROWMDL, _engine->isLBA1())) {
 		error("Failed to load holomap twinsen arrow model");
 	}
 
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index c3f1e79b10..676f599e8a 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -191,13 +191,13 @@ public:
 
 	uint32 _holomapSurfaceSize = 0;
 	uint8 *_holomapSurfacePtr = nullptr;
-	uint32 holomapImageSize = 0;
-	uint8 *holomapImagePtr = nullptr;
+	uint32 _holomapImageSize = 0;
+	uint8 *_holomapImagePtr = nullptr;
 
-	BodyData holomapPointModelPtr;
-	BodyData holomapTwinsenModelPtr;
-	BodyData holomapTwinsenArrowPtr;
-	BodyData holomapArrowPtr;
+	BodyData _holomapPointModelPtr;
+	BodyData _holomapTwinsenModelPtr;
+	BodyData _holomapTwinsenArrowPtr;
+	BodyData _holomapArrowPtr;
 
 	/** Initialize resource pointers */
 	void initResources();
diff --git a/engines/twine/scene/grid.h b/engines/twine/scene/grid.h
index c73e50a904..19a27fe11d 100644
--- a/engines/twine/scene/grid.h
+++ b/engines/twine/scene/grid.h
@@ -199,9 +199,9 @@ public:
 	IVec3 _camera;
 
 	/** Flag to know if the engine is using celling grids */
-	int16 _useCellingGrid = 0; // useAnotherGrm
+	int16 _useCellingGrid = 0;
 	/** Current celling grid index */
-	int16 _cellingGridIdx = 0; // currentGrid2
+	int16 _cellingGridIdx = 0;
 
 	/**
 	 * Draw 3D actor over bricks


Commit: a7f09b021402e3d5cb1fe203aa3526255d713fc5
    https://github.com/scummvm/scummvm/commit/a7f09b021402e3d5cb1fe203aa3526255d713fc5
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T09:23:59+02:00

Commit Message:
TWINE: improved sprite parser

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


diff --git a/engines/twine/parser/sprite.cpp b/engines/twine/parser/sprite.cpp
index 2cd9b769bd..29a1986b0c 100644
--- a/engines/twine/parser/sprite.cpp
+++ b/engines/twine/parser/sprite.cpp
@@ -47,42 +47,65 @@ bool SpriteBoundingBoxData::loadFromStream(Common::SeekableReadStream &stream, b
 }
 
 bool SpriteData::loadFromStream(Common::SeekableReadStream &stream, bool lba1) {
-	stream.skip(8);
+	if (_bricks) {
+		// brick sprites don't have the offsets
+		return loadSprite(stream, 0);
+	}
+	const uint32 offset1 = stream.readUint32LE();
+	const uint32 offset2 = stream.readUint32LE();
+	const uint32 offsetData = stream.pos();
+	if (!loadSprite(stream, offset1)) {
+		return false;
+	}
+	// for most sprites the second offset is just the end of the stream - but
+	// some sprites (like shadow in lba1) have a second sprite following the
+	// first one.
+	if (offset2 + offsetData >= stream.size()) {
+		return true;
+	}
+	return loadSprite(stream, offset2);
+}
+
+bool SpriteData::loadSprite(Common::SeekableReadStream &stream, uint32 offset) {
+	stream.seek(offset);
 	int width = stream.readByte();
 	int height = stream.readByte();
-	_offsetX = stream.readByte();
-	_offsetY = stream.readByte();
+	_offsetX[_sprites] = stream.readByte();
+	_offsetY[_sprites] = stream.readByte();
 	const Graphics::PixelFormat format = Graphics::PixelFormat::createFormatCLUT8();
-	_surface.create(width, height, format);
-	const uint8 *last = (const uint8 *)_surface.getBasePtr(width, height - 1);
-	const int maxY = _offsetY + height;
-	for (int y = _offsetY; y < maxY; ++y) {
+	_surfaces[_sprites].create(width, height, format);
+	const uint8 *last = (const uint8 *)_surfaces[_sprites].getBasePtr(width, height - 1);
+	for (int y = 0; y < height; ++y) {
 		const uint8 numRuns = stream.readByte();
-		int x = _offsetX;
+		int x = 0;
 		for (uint8 run = 0; run < numRuns; ++run) {
 			const uint8 runSpec = stream.readByte();
 			const uint8 runLength = bits(runSpec, 0, 6) + 1;
 			const uint8 type = bits(runSpec, 6, 2);
-			if (type == 2) {
-				uint8 *start = (uint8 *)_surface.getBasePtr(x, y);
-				uint8 *end = (uint8 *)_surface.getBasePtr(x + runLength, y);
-				if (end > last) {
-					return false;
-				}
-				Common::fill(start, end, stream.readByte());
-			} else if (type == 1 || type == 3) {
-				uint8 *start = (uint8 *)_surface.getBasePtr(x, y);
+			if (type == 1) {
+				uint8 *start = (uint8 *)_surfaces[_sprites].getBasePtr(x, y);
 				for (uint8 i = 0; i < runLength; ++i) {
 					if (start > last) {
 						return false;
 					}
 					*start++ = stream.readByte();
 				}
+			} else if (type != 0) {
+				uint8 *start = (uint8 *)_surfaces[_sprites].getBasePtr(x, y);
+				uint8 *end = (uint8 *)_surfaces[_sprites].getBasePtr(x + runLength, y);
+				if (end > last) {
+					return false;
+				}
+				Common::fill(start, end, stream.readByte());
 			}
 			x += runLength;
 		}
 	}
-	return !stream.err();
+	if (stream.err()) {
+		return false;
+	}
+	++_sprites;
+	return true;
 }
 
 } // namespace TwinE
diff --git a/engines/twine/parser/sprite.h b/engines/twine/parser/sprite.h
index b912565a0e..e367337da6 100644
--- a/engines/twine/parser/sprite.h
+++ b/engines/twine/parser/sprite.h
@@ -66,24 +66,48 @@ inline const SpriteDim *SpriteBoundingBoxData::dim(int index) const {
 }
 
 class SpriteData : public Parser {
-private:
-	Graphics::ManagedSurface _surface;
-	int _offsetX = 0;
-	int _offsetY = 0;
+protected:
+	Graphics::ManagedSurface _surfaces[2];
+	int _offsetX[2] {0};
+	int _offsetY[2] {0};
+	int _sprites = 0;
+	bool _bricks = false;
+
+	bool loadSprite(Common::SeekableReadStream &stream, uint32 offset);
 
 public:
 	bool loadFromStream(Common::SeekableReadStream &stream, bool lba1) override;
 
-	inline const Graphics::ManagedSurface &surface() const {
-		return _surface;
+	inline const Graphics::ManagedSurface &surface(int index = 0) const {
+		if (index < 0 || index >= _sprites) {
+			error("Sprite surface index out of range: %i (max: %i)", index, _sprites);
+		}
+		return _surfaces[index];
+	}
+
+	inline int sprites() const {
+		return _sprites;
 	}
 
-	inline int offsetX() const {
-		return _offsetX;
+	inline int offsetX(int index = 0) const {
+		if (index < 0 || index >= _sprites) {
+			error("Sprite offset index out of range: %i (max: %i)", index, _sprites);
+		}
+		return _offsetX[index];
 	}
 
-	inline int offsetY() const {
-		return _offsetY;
+	inline int offsetY(int index = 0) const {
+		if (index < 0 || index >= _sprites) {
+			error("Sprite offset index out of range: %i (max: %i)", index, _sprites);
+		}
+		return _offsetY[index];
+	}
+};
+
+class BrickData : public SpriteData {
+public:
+	BrickData() {
+		_bricks = true;
 	}
 };
 


Commit: 0a928d25e0a5756b9f656624e6d9065f37d6c918
    https://github.com/scummvm/scummvm/commit/0a928d25e0a5756b9f656624e6d9065f37d6c918
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T09:23:59+02:00

Commit Message:
TWINE: use SpriteData for shadow sprite

Changed paths:
    engines/twine/renderer/redraw.cpp
    engines/twine/resources/resources.cpp
    engines/twine/resources/resources.h
    engines/twine/scene/grid.cpp
    engines/twine/scene/grid.h


diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index d9db0a287d..be46e88b59 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -251,7 +251,7 @@ int32 Redraw::fillActorDrawingList(DrawListStruct *drawList, bool bgRedraw) {
 				drawList[drawListPos].x = _engine->_actor->_shadowCoord.x;
 				drawList[drawListPos].y = _engine->_actor->_shadowCoord.y;
 				drawList[drawListPos].z = _engine->_actor->_shadowCoord.z;
-				drawList[drawListPos].offset = 2;
+				drawList[drawListPos].offset = 1;
 				drawListPos++;
 			}
 			if (_inSceneryView && a == _engine->_scene->_currentlyFollowedActor) {
@@ -309,8 +309,8 @@ void Redraw::processDrawListShadows(const DrawListStruct &drawCmd) {
 	// get actor position on screen
 	_engine->_renderer->projectPositionOnScreen(drawCmd.x - _engine->_grid->_camera.x, drawCmd.y - _engine->_grid->_camera.y, drawCmd.z - _engine->_grid->_camera.z);
 
-	int32 spriteWidth, spriteHeight;
-	_engine->_grid->getSpriteSize(drawCmd.offset, &spriteWidth, &spriteHeight, _engine->_resources->_spriteShadowPtr);
+	int32 spriteWidth = _engine->_resources->_spriteShadowPtr.surface(drawCmd.offset).w;
+	int32 spriteHeight = _engine->_resources->_spriteShadowPtr.surface(drawCmd.offset).h;
 
 	// calculate sprite size and position on screen
 	Common::Rect renderRect;
@@ -321,7 +321,7 @@ void Redraw::processDrawListShadows(const DrawListStruct &drawCmd) {
 
 	_engine->_interface->setClip(renderRect);
 
-	_engine->_grid->drawSprite(drawCmd.offset, renderRect.left, renderRect.top, _engine->_resources->_spriteShadowPtr);
+	_engine->_grid->drawSprite(renderRect.left, renderRect.top, _engine->_resources->_spriteShadowPtr, drawCmd.offset);
 
 	const int32 tmpX = (drawCmd.x + BRICK_HEIGHT) / BRICK_SIZE;
 	const int32 tmpY = drawCmd.y / BRICK_HEIGHT;
diff --git a/engines/twine/resources/resources.cpp b/engines/twine/resources/resources.cpp
index a2a603c8fb..e40196d6cd 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -41,7 +41,6 @@ Resources::~Resources() {
 		free(_samplesTable[i]);
 	}
 	free(_fontPtr);
-	free(_spriteShadowPtr);
 	free(_holomapSurfacePtr);
 	free(_holomapImagePtr);
 }
@@ -148,9 +147,8 @@ void Resources::initResources() {
 	_engine->_text->setFontColor(COLOR_14);
 	_engine->_text->setTextCrossColor(136, 143, 2);
 
-	_spriteShadowSize = HQR::getAllocEntry(&_spriteShadowPtr, Resources::HQR_RESS_FILE, RESSHQR_SPRITESHADOW);
-	if (_spriteShadowSize == 0) {
-		error("Failed to load sprite shadow");
+	if (!_spriteShadowPtr.loadFromHQR(Resources::HQR_RESS_FILE, RESSHQR_SPRITESHADOW, _engine->isLBA1())) {
+		error("Failed to load shadow sprites");
 	}
 
 	if (_engine->isLBA1()) {
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index 676f599e8a..d18b91091e 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -185,8 +185,7 @@ public:
 	int32 _fontBufSize = 0;
 	uint8 *_fontPtr = nullptr;
 
-	uint32 _spriteShadowSize = 0;
-	uint8 *_spriteShadowPtr = nullptr;
+	SpriteData _spriteShadowPtr;
 	SpriteBoundingBoxData _spriteBoundingBox;
 
 	uint32 _holomapSurfaceSize = 0;
diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index 3867f4771d..10ec7d1245 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -488,26 +488,26 @@ bool Grid::drawSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr) {
 	return drawBrickSprite(index, posX, posY, ptr, true);
 }
 
-bool Grid::drawSprite(int32 posX, int32 posY, const SpriteData &ptr) {
-	const int32 left = posX + ptr.offsetX();
+bool Grid::drawSprite(int32 posX, int32 posY, const SpriteData &ptr, int spriteIndex) {
+	const int32 left = posX + ptr.offsetX(spriteIndex);
 	if (left > _engine->_interface->_clip.right) {
 		return false;
 	}
-	const int32 right = ptr.surface().w + left;
+	const int32 right = ptr.surface(spriteIndex).w + left;
 	if (right < _engine->_interface->_clip.left) {
 		return false;
 	}
-	const int32 top = posY + ptr.offsetY();
+	const int32 top = posY + ptr.offsetY(spriteIndex);
 	if (top > _engine->_interface->_clip.bottom) {
 		return false;
 	}
-	const int32 bottom = ptr.surface().h + top;
+	const int32 bottom = ptr.surface(spriteIndex).h + top;
 	if (bottom < _engine->_interface->_clip.top) {
 		return false;
 	}
 
 	const Common::Point pos(left, top);
-	_engine->_frontVideoBuffer.transBlitFrom(ptr.surface(), pos);
+	_engine->_frontVideoBuffer.transBlitFrom(ptr.surface(spriteIndex), pos);
 	return true;
 }
 
diff --git a/engines/twine/scene/grid.h b/engines/twine/scene/grid.h
index 19a27fe11d..cf4084703f 100644
--- a/engines/twine/scene/grid.h
+++ b/engines/twine/scene/grid.h
@@ -248,7 +248,7 @@ public:
 	 * @param ptr sprite buffer pointer to draw
 	 */
 	bool drawSprite(int32 index, int32 posX, int32 posY, const uint8 *spritePtr);
-	bool drawSprite(int32 posX, int32 posY, const SpriteData &ptr);
+	bool drawSprite(int32 posX, int32 posY, const SpriteData &ptr, int spriteIndex = 0);
 
 	/**
 	 * Draw sprite or bricks in the screen according with the type


Commit: 15dd09a527a54aa77e1e893be6a4275f20732766
    https://github.com/scummvm/scummvm/commit/15dd09a527a54aa77e1e893be6a4275f20732766
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T09:34:48+02:00

Commit Message:
EVENTRECORDER: fixed compilation

Changed paths:
    gui/EventRecorder.cpp


diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index e151e3574a..07eded2169 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -631,7 +631,7 @@ Common::StringArray EventRecorder::listSaveFiles(const Common::String &pattern)
 	if (_recordMode == kRecorderPlayback) {
 		Common::StringArray result;
 		for (Common::HashMap<Common::String, Common::PlaybackFile::SaveFileBuffer>::iterator  i = _playbackFile->getHeader().saveFiles.begin(); i != _playbackFile->getHeader().saveFiles.end(); ++i) {
-			if (i->_key.matchString(pattern, false, true)) {
+			if (i->_key.matchString(pattern, false, "/")) {
 				result.push_back(i->_key);
 			}
 		}




More information about the Scummvm-git-logs mailing list