[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