[Scummvm-git-logs] scummvm branch-2-7 -> bf2d332d52a37173f2dd9084288cb274ce93eab8
mgerhardy
noreply at scummvm.org
Mon Jan 30 07:21:56 UTC 2023
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
bf2d332d52 TWINE: unified holomap code and fixed weird rotations from one location to another
Commit: bf2d332d52a37173f2dd9084288cb274ce93eab8
https://github.com/scummvm/scummvm/commit/bf2d332d52a37173f2dd9084288cb274ce93eab8
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2023-01-30T08:21:45+01:00
Commit Message:
TWINE: unified holomap code and fixed weird rotations from one location to another
Changed paths:
engines/twine/holomap.cpp
diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 2795dd2ddeb..11c5396ecf1 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -51,9 +51,8 @@ namespace TwinE {
#define HOLOMAP_UNK4 (1 << 3)
#define HOLOMAP_UNK5 (1 << 4)
#define HOLOMAP_UNK6 (1 << 5)
-#define HOLOMAP_UNK7 (1 << 6)
+#define HOLOMAP_CUBE_DONE (1 << 6)
#define HOLOMAP_CAN_FOCUS (1 << 7)
-#define HOLOMAP_RESET (HOLOMAP_VISITED | HOLOMAP_UNK3 | HOLOMAP_UNK4 | HOLOMAP_UNK5 | HOLOMAP_UNK6 | HOLOMAP_UNK7)
#define HOLOMAP_ACTIVE (HOLOMAP_CAN_FOCUS | HOLOMAP_ARROW)
static const float ZOOM_BIG_HOLO = 9500.0f;
@@ -93,10 +92,10 @@ bool Holomap::loadLocations() {
_engine->_text->initDial(TextBankId::Inventory_Intro_and_Holomap);
for (int32 i = 0; i < _numLocations; i++) {
- _locations[i].angleX = (int16)ClampAngle(stream.readSint16LE());
- _locations[i].angleY = (int16)ClampAngle(stream.readSint16LE());
+ _locations[i].angleX = stream.readSint16LE();
+ _locations[i].angleY = stream.readSint16LE();
_locations[i].size = stream.readSint16LE();
- _locations[i].textIndex = (TextId)stream.readUint16LE();
+ _locations[i].textIndex = (TextId)stream.readSint16LE();
if (_engine->_text->getMenuText(_locations[i].textIndex, _locations[i].name, sizeof(_locations[i].name))) {
debug(2, "Scene %i: %s", i, _locations[i].name);
@@ -107,7 +106,7 @@ bool Holomap::loadLocations() {
return true;
}
-void Holomap::setHolomapPosition(int32 locationIdx) {
+void Holomap::setHolomapPosition(int32 locationIdx) { // SetHoloPos
assert(locationIdx >= 0 && locationIdx <= ARRAYSIZE(_engine->_gameState->_holomapFlags));
_engine->_gameState->_holomapFlags[locationIdx] = HOLOMAP_ACTIVE;
if (_engine->_gameState->hasItem(InventoryItems::kiHolomap)) {
@@ -115,10 +114,10 @@ void Holomap::setHolomapPosition(int32 locationIdx) {
}
}
-void Holomap::clearHolomapPosition(int32 locationIdx) {
+void Holomap::clearHolomapPosition(int32 locationIdx) { // ClrHoloPos
assert(locationIdx >= 0 && locationIdx <= ARRAYSIZE(_engine->_gameState->_holomapFlags));
- _engine->_gameState->_holomapFlags[locationIdx] &= HOLOMAP_RESET;
- _engine->_gameState->_holomapFlags[locationIdx] |= HOLOMAP_UNK7;
+ _engine->_gameState->_holomapFlags[locationIdx] &= ~HOLOMAP_ACTIVE;
+ _engine->_gameState->_holomapFlags[locationIdx] |= HOLOMAP_CUBE_DONE;
}
void Holomap::initHoloDatas() {
@@ -439,25 +438,26 @@ int32 Holomap::searchNextArrow(int32 currentLocation, int32 dir) const {
} else {
i %= NUM_LOCATIONS;
}
- if (i == _engine->_scene->_currentSceneIdx || (_engine->_gameState->_holomapFlags[i] & HOLOMAP_ACTIVE) != 0u) {
+ if ((_engine->_gameState->_holomapFlags[i] & HOLOMAP_ACTIVE) != 0u) {
return i;
}
}
return -1;
}
-void Holomap::drawListPos(int xRot, int yRot, int zRot, bool pos) {
- int n = 0;
- DrawListStruct drawListArray[NUM_LOCATIONS];
- for (int locationIdx = 0; locationIdx < NUM_LOCATIONS; ++locationIdx) {
- if (!(_engine->_gameState->_holomapFlags[locationIdx] & HOLOMAP_CAN_FOCUS) && locationIdx != _engine->_scene->_currentSceneIdx) {
+void Holomap::drawListPos(int calpha, int cbeta, int cgamma, bool pos) {
+ int nbobjets = 0;
+ DrawListStruct listTri[NUM_LOCATIONS];
+ const int numCube = _engine->_scene->_currentSceneIdx;
+ for (int n = 0; n < NUM_LOCATIONS; ++n) {
+ if (!(_engine->_gameState->_holomapFlags[n] & HOLOMAP_CAN_FOCUS) && n != numCube) {
continue;
}
- const Location &loc = _locations[locationIdx];
+ const Location &loc = _locations[n];
_engine->_renderer->setAngleCamera(loc.angleX, loc.angleY, 0);
const IVec3 &m = _engine->_renderer->worldRotatePoint(IVec3(0, 0, 1000 + loc.size));
const IVec3 &m1 = _engine->_renderer->worldRotatePoint(IVec3(0, 0, 1500));
- _engine->_renderer->setInverseAngleCamera(xRot, yRot, zRot);
+ _engine->_renderer->setInverseAngleCamera(calpha, cbeta, cgamma);
_engine->_renderer->setCameraRotation(0, 0, distance(ZOOM_BIG_HOLO));
const IVec3 &destPos3 = _engine->_renderer->worldRotatePoint(m);
@@ -472,29 +472,29 @@ void Holomap::drawListPos(int xRot, int yRot, int zRot, bool pos) {
continue;
}
}
- uint8 flags = _engine->_gameState->_holomapFlags[locationIdx] & HOLOMAP_ARROW;
- if (locationIdx == _engine->_scene->_currentSceneIdx) {
- flags |= 2u; // model type
+ uint32 t = (uint32)_engine->_gameState->_holomapFlags[n] & HOLOMAP_ARROW;
+ if (n == numCube) {
+ t |= HOLOMAP_VISITED; // model type
}
- DrawListStruct &drawList = drawListArray[n];
+ DrawListStruct &drawList = listTri[nbobjets];
drawList.posValue = destPos3.z;
- drawList.actorIdx = locationIdx;
- drawList.type = flags;
+ drawList.actorIdx = n;
+ drawList.type = t;
drawList.x = m.x;
drawList.y = m.y;
drawList.z = m.z;
- ++n;
+ ++nbobjets;
}
- _engine->_redraw->sortDrawingList(drawListArray, n);
- for (int i = 0; i < n; ++i) {
- const DrawListStruct &drawList = drawListArray[i];
- const uint16 flags = drawList.type;
+ _engine->_redraw->sortDrawingList(listTri, nbobjets);
+ for (int i = 0; i < nbobjets; ++i) {
+ const DrawListStruct &drawList = listTri[i];
+ const uint32 flags = drawList.type;
const BodyData *bodyData = nullptr;
- if (flags == 1u) {
+ if (flags == HOLOMAP_ARROW) {
bodyData = &_engine->_resources->_holomapArrowPtr;
- } else if (flags == 2u) {
+ } else if (flags == HOLOMAP_VISITED) {
bodyData = &_engine->_resources->_holomapTwinsenModelPtr;
- } else if (flags == 3u) {
+ } else if (flags == (HOLOMAP_ARROW | HOLOMAP_VISITED)) {
bodyData = &_engine->_resources->_holomapTwinsenArrowPtr;
}
if (bodyData != nullptr) {
@@ -540,13 +540,18 @@ void Holomap::holoMap() {
int32 currentLocation = _engine->_scene->_currentSceneIdx;
_engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
- int32 time = _engine->_lbaTime;
- int32 xRot = _locations[currentLocation].angleX;
- int32 yRot = _locations[currentLocation].angleY;
+ int32 otimer = _engine->_lbaTime;
+ int32 dalpha = _locations[currentLocation].angleX;
+ int32 dbeta = _locations[currentLocation].angleY;
+ int32 calpha = dalpha;
+ int32 cbeta = dbeta;
+ int32 cgamma = 0;
+ int32 oalpha = dalpha;
+ int32 obeta = dbeta;
bool automove = false;
bool redraw = true;
int waterPaletteChangeTimer = 0;
- bool fadeInPalette = true;
+ bool flagpal = true;
_engine->_input->enableKeyMap(holomapKeyMapId);
for (;;) {
FrameMarker frame(_engine);
@@ -556,51 +561,66 @@ void Holomap::holoMap() {
}
if (_engine->_input->toggleActionIfActive(TwinEActionType::HolomapPrev)) {
- const int32 nextLocation = searchNextArrow(currentLocation, -1);
- if (nextLocation != -1 && currentLocation != nextLocation) {
- currentLocation = nextLocation;
- _engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
- time = _engine->_lbaTime;
- automove = true;
+ currentLocation = searchNextArrow(currentLocation, -1);
+ if (currentLocation == -1) {
+ currentLocation = _engine->_scene->_currentSceneIdx;
}
+ _engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
+ oalpha = calpha;
+ obeta = cbeta;
+ otimer = _engine->_lbaTime;
+ dalpha = _locations[currentLocation].angleX;
+ dbeta = _locations[currentLocation].angleY;
+ automove = true;
+ redraw = true;
} else if (_engine->_input->toggleActionIfActive(TwinEActionType::HolomapNext)) {
- const int32 nextLocation = searchNextArrow(currentLocation, 1);
- if (nextLocation != -1 && currentLocation != nextLocation) {
- currentLocation = nextLocation;
- _engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
- time = _engine->_lbaTime;
- automove = true;
+ currentLocation = searchNextArrow(currentLocation, 1);
+ if (currentLocation == -1) {
+ currentLocation = _engine->_scene->_currentSceneIdx;
}
- }
-
- if (_engine->_input->isActionActive(TwinEActionType::HolomapDown)) {
- xRot += LBAAngles::ANGLE_2;
- automove = true;
- time = _engine->_lbaTime;
- } else if (_engine->_input->isActionActive(TwinEActionType::HolomapUp)) {
- xRot -= LBAAngles::ANGLE_2;
+ _engine->_text->drawHolomapLocation(_locations[currentLocation].textIndex);
+ oalpha = calpha;
+ obeta = cbeta;
+ otimer = _engine->_lbaTime;
+ dalpha = _locations[currentLocation].angleX;
+ dbeta = _locations[currentLocation].angleY;
automove = true;
- time = _engine->_lbaTime;
+ redraw = true;
}
- if (_engine->_input->isActionActive(TwinEActionType::HolomapRight)) {
- yRot += LBAAngles::ANGLE_2;
- automove = true;
- time = _engine->_lbaTime;
- } else if (_engine->_input->isActionActive(TwinEActionType::HolomapLeft)) {
- yRot -= LBAAngles::ANGLE_2;
- automove = true;
- time = _engine->_lbaTime;
+ if (!automove) {
+ if (_engine->_input->isActionActive(TwinEActionType::HolomapDown)) {
+ calpha += LBAAngles::ANGLE_2;
+ calpha = ClampAngle(calpha);
+ cbeta = ClampAngle(cbeta);
+ redraw = true;
+ } else if (_engine->_input->isActionActive(TwinEActionType::HolomapUp)) {
+ calpha -= LBAAngles::ANGLE_2;
+ calpha = ClampAngle(calpha);
+ cbeta = ClampAngle(cbeta);
+ redraw = true;
+ }
+ if (_engine->_input->isActionActive(TwinEActionType::HolomapRight)) {
+ cbeta += LBAAngles::ANGLE_2;
+ calpha = ClampAngle(calpha);
+ cbeta = ClampAngle(cbeta);
+ redraw = true;
+ } else if (_engine->_input->isActionActive(TwinEActionType::HolomapLeft)) {
+ cbeta -= LBAAngles::ANGLE_2;
+ calpha = ClampAngle(calpha);
+ cbeta = ClampAngle(cbeta);
+ redraw = true;
+ }
}
if (automove) {
- const int32 dt = _engine->_lbaTime - time;
- xRot = _engine->_collision->clampedLerp(ClampAngle(xRot), _locations[currentLocation].angleX, 75, dt);
- yRot = _engine->_collision->clampedLerp(ClampAngle(yRot), _locations[currentLocation].angleY, 75, dt);
+ const int32 dt = _engine->_lbaTime - otimer;
+ calpha = _engine->_collision->clampedLerp(oalpha, dalpha, 75, dt);
+ cbeta = _engine->_collision->clampedLerp(obeta, dbeta, 75, dt);
redraw = true;
}
- if (!fadeInPalette && waterPaletteChangeTimer < _engine->_lbaTime) {
+ if (!flagpal && waterPaletteChangeTimer < _engine->_lbaTime) {
// animate the water surface
_engine->setPalette(HOLOMAP_PALETTE_INDEX, NUM_HOLOMAPCOLORS, &_paletteHolomap[3 * _holomapPaletteIndex++]);
if (_holomapPaletteIndex == NUM_HOLOMAPCOLORS) {
@@ -618,13 +638,13 @@ void Holomap::holoMap() {
_engine->_interface->memoClip();
_engine->_interface->setClip(rect);
_engine->_interface->drawFilledRect(rect, COLOR_BLACK);
- _engine->_renderer->setInverseAngleCamera(xRot, yRot, 0);
- _engine->_renderer->setLightVector(xRot, yRot, 0);
- drawListPos(xRot, yRot, 0, false);
- _engine->_renderer->setInverseAngleCamera(xRot, yRot, 0);
+ _engine->_renderer->setInverseAngleCamera(calpha, cbeta, cgamma);
+ _engine->_renderer->setLightVector(calpha, cbeta, 0);
+ drawListPos(calpha, cbeta, cgamma, false);
+ _engine->_renderer->setInverseAngleCamera(calpha, cbeta, cgamma);
_engine->_renderer->setCameraRotation(0, 0, distance(ZOOM_BIG_HOLO));
drawHoloMap(holomapImagePtr, holomapImageSize);
- drawListPos(xRot, yRot, 0, true);
+ drawListPos(calpha, cbeta, cgamma, true);
_engine->_interface->restoreClip();
drawHolomapText(_engine->width() / 2, 25, "HoloMap");
if (automove) {
@@ -634,14 +654,14 @@ void Holomap::holoMap() {
}
}
- if (automove && xRot == _locations[currentLocation].angleX && yRot == _locations[currentLocation].angleY) {
+ if (automove && dalpha == calpha && dbeta == cbeta) {
automove = false;
}
++_engine->_lbaTime;
- if (fadeInPalette) {
- fadeInPalette = false;
+ if (flagpal) {
+ flagpal = false;
_engine->_screens->fadeToPal(_engine->_screens->_paletteRGBACustom);
}
}
More information about the Scummvm-git-logs
mailing list