[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