[Scummvm-git-logs] scummvm master -> c1a27b7512073f69667a457fb1e31974be845ead
mgerhardy
martin.gerhardy at gmail.com
Sat Jul 31 06:38:53 UTC 2021
This automated email contains information about 11 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
709e9e7841 TWINE: unified loops
fd95562d0e TWINE: extract to local vars
4c0f188a3b TWINE: extract to named constants
e2d84ceae1 TWINE: simplified code
03489fb1c1 TWINE: removed unused method
1f98639584 TWINE: use ANGLE_XX constants
e8af5882e8 TWINE: reduced code duplication
f6f869539c TWINE: the non-rect method is the default
1cebbfdd51 TWINE: use Rect::isValidRect and renamed member
f95d6fd0ea TWINE: use Rect::clip and renamed member
c1a27b7512 TWINE: converted member to local var (Redraw::renderRect)
Commit: 709e9e7841ed88206395d2df120ae0c03093480f
https://github.com/scummvm/scummvm/commit/709e9e7841ed88206395d2df120ae0c03093480f
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: unified loops
Changed paths:
engines/twine/debugger/debug_scene.cpp
engines/twine/renderer/redraw.cpp
engines/twine/scene/scene.cpp
diff --git a/engines/twine/debugger/debug_scene.cpp b/engines/twine/debugger/debug_scene.cpp
index d30b73d655..7fb7e8464b 100644
--- a/engines/twine/debugger/debug_scene.cpp
+++ b/engines/twine/debugger/debug_scene.cpp
@@ -163,8 +163,8 @@ bool DebugScene::drawBox(const ScenePositionsProjected &positions, uint8 color)
bool DebugScene::displayActors() {
bool state = false;
- for (int i = 0; i < _engine->_scene->sceneNumActors; i++) {
- const ActorStruct *actorPtr = _engine->_scene->getActor(i);
+ for (int32 a = 0; a < _engine->_scene->sceneNumActors; a++) {
+ const ActorStruct *actorPtr = _engine->_scene->getActor(a);
// TODO: redrawing doesn't work properly yet for moving actors
if (!actorPtr->staticFlags.bIsSpriteActor) {
continue;
@@ -181,7 +181,7 @@ bool DebugScene::displayActors() {
const Common::Rect filledRect(positions.frontTopRightPoint2D.x, positions.frontTopRightPoint2D.y, positions.frontTopRightPoint2D.x + boxwidth, positions.frontTopRightPoint2D.y + boxheight);
_engine->_interface->drawFilledRect(filledRect, COLOR_WHITE);
_engine->_menu->drawBox(filledRect);
- _engine->drawText(positions.frontTopRightPoint2D.x, positions.frontTopRightPoint2D.y, Common::String::format("Actor: %i", i), true, false, boxwidth);
+ _engine->drawText(positions.frontTopRightPoint2D.x, positions.frontTopRightPoint2D.y, Common::String::format("Actor: %i", a), true, false, boxwidth);
_engine->drawText(positions.frontTopRightPoint2D.x, positions.frontTopRightPoint2D.y + lineHeight, Common::String::format("pos: %i:%i:%i", positions.frontTopRightPoint.x, positions.frontTopRightPoint.y, positions.frontTopRightPoint.z), true, false, boxwidth);
state = true;
}
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index bbf55e2ce0..5f55327533 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -188,8 +188,8 @@ void Redraw::updateOverlayTypePosition(int16 x1, int16 y1, int16 x2, int16 y2) {
int32 Redraw::fillActorDrawingList(bool bgRedraw) {
int32 drawListPos = 0;
- for (int32 modelActorPos = 0; modelActorPos < _engine->_scene->sceneNumActors; modelActorPos++) {
- ActorStruct *actor = _engine->_scene->getActor(modelActorPos);
+ for (int32 a = 0; a < _engine->_scene->sceneNumActors; a++) {
+ ActorStruct *actor = _engine->_scene->getActor(a);
actor->dynamicFlags.bIsVisible = 0; // reset visible state
if (_engine->_grid->useCellingGrid != -1 && actor->pos.y > _engine->_scene->sceneZones[_engine->_grid->cellingGridIdx].maxs.y) {
@@ -226,13 +226,13 @@ int32 Redraw::fillActorDrawingList(bool bgRedraw) {
if (actor->staticFlags.bIsSpriteActor) {
drawList[drawListPos].type = DrawListType::DrawActorSprites;
- drawList[drawListPos].actorIdx = modelActorPos;
+ drawList[drawListPos].actorIdx = a;
if (actor->staticFlags.bUsesClipping) {
tmpVal = actor->lastPos.x - _engine->_grid->camera.x + actor->lastPos.z - _engine->_grid->camera.z;
}
} else {
drawList[drawListPos].type = 0;
- drawList[drawListPos].actorIdx = modelActorPos;
+ drawList[drawListPos].actorIdx = a;
}
drawList[drawListPos].posValue = tmpVal;
@@ -258,7 +258,7 @@ int32 Redraw::fillActorDrawingList(bool bgRedraw) {
drawList[drawListPos].offset = 2;
drawListPos++;
}
- if (inSceneryView && modelActorPos == _engine->_scene->currentlyFollowedActor) {
+ if (inSceneryView && a == _engine->_scene->currentlyFollowedActor) {
_sceneryViewX = _engine->_renderer->projPos.x;
_sceneryViewY = _engine->_renderer->projPos.y;
}
diff --git a/engines/twine/scene/scene.cpp b/engines/twine/scene/scene.cpp
index b9306c5462..cb5cf7144f 100644
--- a/engines/twine/scene/scene.cpp
+++ b/engines/twine/scene/scene.cpp
@@ -187,9 +187,9 @@ bool Scene::loadSceneLBA2() {
sceneNumActors = stream.readUint16LE();
int cnt = 1;
- for (int32 i = 1; i < sceneNumActors; i++, cnt++) {
- _engine->_actor->resetActor(i);
- ActorStruct *act = &_sceneActors[i];
+ for (int32 a = 1; a < sceneNumActors; a++, cnt++) {
+ _engine->_actor->resetActor(a);
+ ActorStruct *act = &_sceneActors[a];
setActorStaticFlags(act, stream.readUint32LE());
act->loadModel(stream.readUint16LE());
@@ -232,7 +232,7 @@ bool Scene::loadSceneLBA2() {
if (_engine->_debugScene->onlyLoadActor != -1 && _engine->_debugScene->onlyLoadActor != cnt) {
sceneNumActors--;
- i--;
+ a--;
}
}
@@ -317,10 +317,10 @@ bool Scene::loadSceneLBA1() {
sceneNumActors = stream.readUint16LE();
int cnt = 1;
- for (int32 i = 1; i < sceneNumActors; i++, cnt++) {
- _engine->_actor->resetActor(i);
+ for (int32 a = 1; a < sceneNumActors; a++, cnt++) {
+ _engine->_actor->resetActor(a);
- ActorStruct *act = &_sceneActors[i];
+ ActorStruct *act = &_sceneActors[a];
setActorStaticFlags(act, stream.readUint16LE());
act->loadModel(stream.readUint16LE());
@@ -360,7 +360,7 @@ bool Scene::loadSceneLBA1() {
if (_engine->_debugScene->onlyLoadActor != -1 && _engine->_debugScene->onlyLoadActor != cnt) {
sceneNumActors--;
- i--;
+ a--;
}
}
Commit: fd95562d0eb6e49e872698211d4033a61e49f88d
https://github.com/scummvm/scummvm/commit/fd95562d0eb6e49e872698211d4033a61e49f88d
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: extract to local vars
Changed paths:
engines/twine/debugger/debug_grid.cpp
diff --git a/engines/twine/debugger/debug_grid.cpp b/engines/twine/debugger/debug_grid.cpp
index 6bb10f12b7..3c2873f09f 100644
--- a/engines/twine/debugger/debug_grid.cpp
+++ b/engines/twine/debugger/debug_grid.cpp
@@ -39,19 +39,22 @@ void DebugGrid::changeGridCamera() {
return;
}
- if (_engine->_input->isActionActive(TwinEActionType::DebugGridCameraPressUp)) {
- _engine->_grid->newCamera.z--;
- _engine->_redraw->reqBgRedraw = true;
- } else if (_engine->_input->isActionActive(TwinEActionType::DebugGridCameraPressDown)) {
- _engine->_grid->newCamera.z++;
- _engine->_redraw->reqBgRedraw = true;
+ Grid *grid = _engine->_grid;
+ Redraw *redraw = _engine->_redraw;
+ Input *input = _engine->_input;
+ if (input->isActionActive(TwinEActionType::DebugGridCameraPressUp)) {
+ grid->newCamera.z--;
+ redraw->reqBgRedraw = true;
+ } else if (input->isActionActive(TwinEActionType::DebugGridCameraPressDown)) {
+ grid->newCamera.z++;
+ redraw->reqBgRedraw = true;
}
- if (_engine->_input->isActionActive(TwinEActionType::DebugGridCameraPressLeft)) {
- _engine->_grid->newCamera.x--;
- _engine->_redraw->reqBgRedraw = true;
- } else if (_engine->_input->isActionActive(TwinEActionType::DebugGridCameraPressRight)) {
- _engine->_grid->newCamera.x++;
- _engine->_redraw->reqBgRedraw = true;
+ if (input->isActionActive(TwinEActionType::DebugGridCameraPressLeft)) {
+ grid->newCamera.x--;
+ redraw->reqBgRedraw = true;
+ } else if (input->isActionActive(TwinEActionType::DebugGridCameraPressRight)) {
+ grid->newCamera.x++;
+ redraw->reqBgRedraw = true;
}
}
@@ -59,53 +62,58 @@ void DebugGrid::changeGrid() {
if (!canChangeScenes) {
return;
}
- if (_engine->_input->toggleActionIfActive(TwinEActionType::NextRoom)) {
- _engine->_scene->currentSceneIdx++;
- if (_engine->_scene->currentSceneIdx >= LBA1SceneId::SceneIdMax) {
- _engine->_scene->currentSceneIdx = LBA1SceneId::Citadel_Island_Prison;
+ Scene *scene = _engine->_scene;
+ Redraw *redraw = _engine->_redraw;
+ Input *input = _engine->_input;
+ if (input->toggleActionIfActive(TwinEActionType::NextRoom)) {
+ scene->currentSceneIdx++;
+ if (scene->currentSceneIdx >= LBA1SceneId::SceneIdMax) {
+ scene->currentSceneIdx = LBA1SceneId::Citadel_Island_Prison;
}
- _engine->_scene->needChangeScene = _engine->_scene->currentSceneIdx;
- _engine->_redraw->reqBgRedraw = true;
+ scene->needChangeScene = scene->currentSceneIdx;
+ redraw->reqBgRedraw = true;
}
- if (_engine->_input->toggleActionIfActive(TwinEActionType::PreviousRoom)) {
- _engine->_scene->currentSceneIdx--;
- if (_engine->_scene->currentSceneIdx < LBA1SceneId::Citadel_Island_Prison) {
- _engine->_scene->currentSceneIdx = LBA1SceneId::SceneIdMax - 1;
+ if (input->toggleActionIfActive(TwinEActionType::PreviousRoom)) {
+ scene->currentSceneIdx--;
+ if (scene->currentSceneIdx < LBA1SceneId::Citadel_Island_Prison) {
+ scene->currentSceneIdx = LBA1SceneId::SceneIdMax - 1;
}
- _engine->_scene->needChangeScene = _engine->_scene->currentSceneIdx;
- _engine->_redraw->reqBgRedraw = true;
+ scene->needChangeScene = scene->currentSceneIdx;
+ redraw->reqBgRedraw = true;
}
}
void DebugGrid::applyCellingGrid() {
+ Grid *grid = _engine->_grid;
+ Input *input = _engine->_input;
// Increase celling grid index
- if (_engine->_input->toggleActionIfActive(TwinEActionType::IncreaseCellingGridIndex)) {
- _engine->_grid->cellingGridIdx++;
- if (_engine->_grid->cellingGridIdx > 133) {
- _engine->_grid->cellingGridIdx = 133;
+ if (input->toggleActionIfActive(TwinEActionType::IncreaseCellingGridIndex)) {
+ grid->cellingGridIdx++;
+ if (grid->cellingGridIdx > 133) {
+ grid->cellingGridIdx = 133;
}
}
// Decrease celling grid index
- else if (_engine->_input->toggleActionIfActive(TwinEActionType::DecreaseCellingGridIndex)) {
- _engine->_grid->cellingGridIdx--;
- if (_engine->_grid->cellingGridIdx < 0) {
- _engine->_grid->cellingGridIdx = 0;
+ else if (input->toggleActionIfActive(TwinEActionType::DecreaseCellingGridIndex)) {
+ grid->cellingGridIdx--;
+ if (grid->cellingGridIdx < 0) {
+ grid->cellingGridIdx = 0;
}
}
// Enable/disable celling grid
- else if (_engine->_input->toggleActionIfActive(TwinEActionType::ApplyCellingGrid)) {
- if (_engine->_grid->useCellingGrid == -1) {
- _engine->_grid->useCellingGrid = 1;
+ else if (input->toggleActionIfActive(TwinEActionType::ApplyCellingGrid)) {
+ if (grid->useCellingGrid == -1) {
+ grid->useCellingGrid = 1;
//createGridMap();
- _engine->_grid->initCellingGrid(_engine->_grid->cellingGridIdx);
- debug("Enable Celling Grid index: %d", _engine->_grid->cellingGridIdx);
+ grid->initCellingGrid(grid->cellingGridIdx);
+ debug("Enable Celling Grid index: %d", grid->cellingGridIdx);
_engine->_scene->needChangeScene = -2; // tricky to make the fade
- } else if (_engine->_grid->useCellingGrid == 1) {
- _engine->_grid->useCellingGrid = -1;
- _engine->_grid->createGridMap();
+ } else if (grid->useCellingGrid == 1) {
+ grid->useCellingGrid = -1;
+ grid->createGridMap();
_engine->_redraw->reqBgRedraw = true;
- debug("Disable Celling Grid index: %d", _engine->_grid->cellingGridIdx);
+ debug("Disable Celling Grid index: %d", grid->cellingGridIdx);
_engine->_scene->needChangeScene = -2; // tricky to make the fade
}
}
Commit: 4c0f188a3b3b792e8c5f642f88c668ce9a8b81c3
https://github.com/scummvm/scummvm/commit/4c0f188a3b3b792e8c5f642f88c668ce9a8b81c3
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: extract to named constants
Changed paths:
engines/twine/debugger/debug_grid.cpp
engines/twine/renderer/redraw.cpp
engines/twine/scene/gamestate.cpp
engines/twine/scene/scene.cpp
engines/twine/shared.h
engines/twine/twine.cpp
diff --git a/engines/twine/debugger/debug_grid.cpp b/engines/twine/debugger/debug_grid.cpp
index 3c2873f09f..b8755bad86 100644
--- a/engines/twine/debugger/debug_grid.cpp
+++ b/engines/twine/debugger/debug_grid.cpp
@@ -105,16 +105,16 @@ void DebugGrid::applyCellingGrid() {
else if (input->toggleActionIfActive(TwinEActionType::ApplyCellingGrid)) {
if (grid->useCellingGrid == -1) {
grid->useCellingGrid = 1;
- //createGridMap();
+ //grid->createGridMap();
grid->initCellingGrid(grid->cellingGridIdx);
debug("Enable Celling Grid index: %d", grid->cellingGridIdx);
- _engine->_scene->needChangeScene = -2; // tricky to make the fade
+ _engine->_scene->needChangeScene = SCENE_CEILING_GRID_FADE_2; // tricky to make the fade
} else if (grid->useCellingGrid == 1) {
grid->useCellingGrid = -1;
grid->createGridMap();
_engine->_redraw->reqBgRedraw = true;
debug("Disable Celling Grid index: %d", grid->cellingGridIdx);
- _engine->_scene->needChangeScene = -2; // tricky to make the fade
+ _engine->_scene->needChangeScene = SCENE_CEILING_GRID_FADE_2; // tricky to make the fade
}
}
}
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index 5f55327533..219b4bded4 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -679,7 +679,7 @@ void Redraw::redrawEngineActions(bool bgRedraw) {
if (bgRedraw) {
_engine->freezeTime();
- if (_engine->_scene->needChangeScene != -1 && _engine->_scene->needChangeScene != -2) {
+ if (_engine->_scene->needChangeScene != SCENE_CEILING_GRID_FADE_1 && _engine->_scene->needChangeScene != SCENE_CEILING_GRID_FADE_2) {
_engine->_screens->fadeOut(_engine->_screens->paletteRGBA);
}
_engine->_screens->clearScreen();
@@ -687,7 +687,7 @@ void Redraw::redrawEngineActions(bool bgRedraw) {
updateOverlayTypePosition(tmp_projPosX, tmp_projPosY, _engine->_renderer->projPosScreen.x, _engine->_renderer->projPosScreen.y);
_engine->saveFrontBuffer();
- if (_engine->_scene->needChangeScene != -1 && _engine->_scene->needChangeScene != -2) {
+ if (_engine->_scene->needChangeScene != SCENE_CEILING_GRID_FADE_1 && _engine->_scene->needChangeScene != SCENE_CEILING_GRID_FADE_2) {
_engine->_screens->fadeIn(_engine->_screens->paletteRGBA);
}
} else {
@@ -709,11 +709,11 @@ void Redraw::redrawEngineActions(bool bgRedraw) {
_engine->_interface->resetClip();
- // make celling grid fade
+ // make ceiling grid fade
// need to be here to fade after drawing all actors in scene
- if (_engine->_scene->needChangeScene == -2) {
+ if (_engine->_scene->needChangeScene == SCENE_CEILING_GRID_FADE_2) {
_engine->crossFade(_engine->_screens->paletteRGBA);
- _engine->_scene->needChangeScene = -1;
+ _engine->_scene->needChangeScene = SCENE_CEILING_GRID_FADE_1;
}
if (bgRedraw) {
diff --git a/engines/twine/scene/gamestate.cpp b/engines/twine/scene/gamestate.cpp
index de6a8a1e25..e75183b68f 100644
--- a/engines/twine/scene/gamestate.cpp
+++ b/engines/twine/scene/gamestate.cpp
@@ -115,7 +115,7 @@ void GameState::initEngineVars() {
_engine->_scene->newHeroPos.y = 0x1800;
_engine->_scene->newHeroPos.z = 0x2000;
- _engine->_scene->currentSceneIdx = -1;
+ _engine->_scene->currentSceneIdx = SCENE_CEILING_GRID_FADE_1;
_engine->_scene->needChangeScene = LBA1SceneId::Citadel_Island_Prison;
_engine->quitGame = -1;
_engine->_scene->mecaPinguinIdx = -1;
@@ -221,7 +221,7 @@ bool GameState::loadGame(Common::SeekableReadStream *file) {
file->readUint32LE();
}
- _engine->_scene->currentSceneIdx = -1;
+ _engine->_scene->currentSceneIdx = SCENE_CEILING_GRID_FADE_1;
_engine->_scene->heroPositionType = ScenePositionType::kReborn;
return true;
}
diff --git a/engines/twine/scene/scene.cpp b/engines/twine/scene/scene.cpp
index cb5cf7144f..22b6927100 100644
--- a/engines/twine/scene/scene.cpp
+++ b/engines/twine/scene/scene.cpp
@@ -534,7 +534,7 @@ void Scene::changeScene() {
_engine->_renderer->setLightVector(alphaLight, betaLight, ANGLE_0);
- if (previousSceneIdx != -1 && previousSceneIdx != needChangeScene) {
+ if (previousSceneIdx != SCENE_CEILING_GRID_FADE_1 && previousSceneIdx != needChangeScene) {
_engine->_actor->previousHeroBehaviour = _engine->_actor->heroBehaviour;
_engine->_actor->previousHeroAngle = sceneHero->angle;
_engine->autoSave();
@@ -560,7 +560,7 @@ void Scene::changeScene() {
_engine->_grid->cellingGridIdx = -1;
_engine->_screens->lockPalette = false;
- needChangeScene = -1;
+ needChangeScene = SCENE_CEILING_GRID_FADE_1;
enableGridTileRendering = true;
_engine->_renderer->setLightVector(alphaLight, betaLight, ANGLE_0);
diff --git a/engines/twine/shared.h b/engines/twine/shared.h
index 9cfff336bd..41519ea864 100644
--- a/engines/twine/shared.h
+++ b/engines/twine/shared.h
@@ -280,6 +280,9 @@ enum class ZoneType {
kLadder = 6 // Hero can climb on it
};
+#define SCENE_CEILING_GRID_FADE_1 (-1)
+#define SCENE_CEILING_GRID_FADE_2 (-2)
+
enum LBA1SceneId {
Citadel_Island_Prison = 0,
Citadel_Island_outside_the_citadel = 1,
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 211193c47d..611b6b34ec 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -1011,7 +1011,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
_scene->sceneHero->staticFlags.bIsHidden = 0;
}
- _scene->needChangeScene = -1;
+ _scene->needChangeScene = SCENE_CEILING_GRID_FADE_1;
_redraw->reqBgRedraw = false;
return 0;
Commit: e2d84ceae15c91bcbe2431321427346c04477273
https://github.com/scummvm/scummvm/commit/e2d84ceae15c91bcbe2431321427346c04477273
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: simplified code
Changed paths:
engines/twine/scene/animations.cpp
diff --git a/engines/twine/scene/animations.cpp b/engines/twine/scene/animations.cpp
index affec949f7..c866c909cb 100644
--- a/engines/twine/scene/animations.cpp
+++ b/engines/twine/scene/animations.cpp
@@ -649,7 +649,7 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
if (actor->staticFlags.bComputeCollisionWithBricks) {
_engine->_collision->collision.y = 0;
- ShapeType brickShape = _engine->_grid->getBrickShape(_engine->_movements->previousActor.x, _engine->_movements->previousActor.y, _engine->_movements->previousActor.z);
+ ShapeType brickShape = _engine->_grid->getBrickShape(_engine->_movements->previousActor);
if (brickShape != ShapeType::kNone) {
if (brickShape != ShapeType::kSolid) {
@@ -706,7 +706,7 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
}
}
- brickShape = _engine->_grid->getBrickShape(_engine->_movements->processActor.x, _engine->_movements->processActor.y, _engine->_movements->processActor.z);
+ brickShape = _engine->_grid->getBrickShape(_engine->_movements->processActor);
actor->setBrickShape(brickShape);
if (brickShape != ShapeType::kNone) {
Commit: 03489fb1c1498c842538ed63585b9df81a077d77
https://github.com/scummvm/scummvm/commit/03489fb1c1498c842538ed63585b9df81a077d77
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: removed unused method
Changed paths:
engines/twine/renderer/redraw.cpp
engines/twine/scene/grid.cpp
engines/twine/scene/grid.h
engines/twine/scene/movements.cpp
engines/twine/scene/movements.h
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index 219b4bded4..3034b7d98d 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -246,7 +246,7 @@ int32 Redraw::fillActorDrawingList(bool bgRedraw) {
_engine->_actor->shadowCoord.y = actor->pos.y - 1;
_engine->_actor->shadowCoord.z = actor->pos.z;
} else {
- _engine->_movements->getShadowPosition(actor->pos.x, actor->pos.y, actor->pos.z);
+ _engine->_movements->getShadowPosition(actor->pos);
}
drawList[drawListPos].posValue = tmpVal - 1; // save the shadow entry in the drawList
@@ -292,7 +292,7 @@ int32 Redraw::fillExtraDrawingList(int32 drawListPos) {
drawListPos++;
if (_engine->cfgfile.ShadowMode == 2 && !(extra->info0 & EXTRA_SPECIAL_MASK)) {
- _engine->_movements->getShadowPosition(extra->pos.x, extra->pos.y, extra->pos.z);
+ _engine->_movements->getShadowPosition(extra->pos);
drawList[drawListPos].posValue = tmpVal - 1;
drawList[drawListPos].actorIdx = 0;
diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index bdbae97d64..25f1c6da68 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -592,15 +592,8 @@ bool Grid::drawBrickSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr
return true;
}
-uint8 *Grid::getBlockBuffer(int32 x, int32 y, int32 z) {
- const int32 tempX = (x + BRICK_HEIGHT) / BRICK_SIZE;
- const int32 tempY = y / BRICK_HEIGHT;
- const int32 tempZ = (z + BRICK_HEIGHT) / BRICK_SIZE;
- return _blockBuffer + tempY * 2 + tempX * GRID_SIZE_Y * 2 + (tempZ * GRID_SIZE_X) * GRID_SIZE_Y * 2;
-}
-
-const uint8 *Grid::getBlockBufferGround(int32 x, int32 y, int32 z, int32 &ground) {
- updateCollisionCoordinates(x, y, z);
+const uint8 *Grid::getBlockBufferGround(const IVec3 &pos, int32 &ground) {
+ updateCollisionCoordinates(pos.x, pos.y, pos.z);
const int32 tempX = _engine->_collision->collision.x;
int32 tempY = _engine->_collision->collision.y;
const int32 tempZ = _engine->_collision->collision.z;
@@ -823,7 +816,7 @@ ShapeType Grid::getBrickShapeFull(int32 x, int32 y, int32 z, int32 y2) {
return ShapeType::kNone;
}
-int32 Grid::getBrickSoundType(int32 x, int32 y, int32 z) { // getPos2
+int32 Grid::getBrickSoundType(int32 x, int32 y, int32 z) {
updateCollisionCoordinates(x, y, z);
if (_engine->_collision->collision.x < 0 || _engine->_collision->collision.x >= GRID_SIZE_X) {
@@ -880,6 +873,7 @@ void Grid::centerScreenOnActor() {
_engine->_renderer->projectPositionOnScreen(actor->pos.x - (newCamera.x * BRICK_SIZE),
actor->pos.y - (newCamera.y * BRICK_HEIGHT),
actor->pos.z - (newCamera.z * BRICK_SIZE));
+ // TODO: these border values should get scaled for hiher resolutions
if (_engine->_renderer->projPos.x < 80 || _engine->_renderer->projPos.x >= _engine->width() - 60 || _engine->_renderer->projPos.y < 80 || _engine->_renderer->projPos.y >= _engine->height() - 50) {
newCamera.x = ((actor->pos.x + BRICK_HEIGHT) / BRICK_SIZE) + (((actor->pos.x + BRICK_HEIGHT) / BRICK_SIZE) - newCamera.x) / 2;
newCamera.y = actor->pos.y / BRICK_HEIGHT;
diff --git a/engines/twine/scene/grid.h b/engines/twine/scene/grid.h
index 11f17188b2..8f893e484f 100644
--- a/engines/twine/scene/grid.h
+++ b/engines/twine/scene/grid.h
@@ -178,7 +178,6 @@ private:
int32 _blockBufferSize = 0;
uint8 *_blockBuffer = nullptr;
- uint8 *getBlockBuffer(int32 x, int32 y, int32 z);
const BrickEntry* getBrickEntry(int32 j, int32 i) const;
void updateCollisionCoordinates(int32 x, int32 y, int32 z);
@@ -194,7 +193,7 @@ public:
/**
* search down until either ground is found or lower border of the cube is reached
*/
- const uint8 *getBlockBufferGround(int32 x, int32 y, int32 z, int32 &ground);
+ const uint8 *getBlockBufferGround(const IVec3 &pos, int32 &ground);
/** New grid camera x, y and z coordinates */
IVec3 newCamera;
diff --git a/engines/twine/scene/movements.cpp b/engines/twine/scene/movements.cpp
index 790d536121..54257c5856 100644
--- a/engines/twine/scene/movements.cpp
+++ b/engines/twine/scene/movements.cpp
@@ -38,10 +38,10 @@ namespace TwinE {
Movements::Movements(TwinEEngine *engine) : _engine(engine) {}
-void Movements::getShadowPosition(int32 x, int32 y, int32 z) {
- const uint8 *ptr = _engine->_grid->getBlockBufferGround(x, y, z, processActor.y);
- processActor.x = x;
- processActor.z = z;
+void Movements::getShadowPosition(const IVec3 &pos) {
+ const uint8 *ptr = _engine->_grid->getBlockBufferGround(pos, processActor.y);
+ processActor.x = pos.x;
+ processActor.z = pos.z;
ShapeType shadowCollisionType;
if (*ptr) {
diff --git a/engines/twine/scene/movements.h b/engines/twine/scene/movements.h
index e28cefe440..fd70c0286f 100644
--- a/engines/twine/scene/movements.h
+++ b/engines/twine/scene/movements.h
@@ -136,11 +136,9 @@ public:
/**
* Get shadow position
- * @param x Shadow X coordinate
- * @param y Shadow Y coordinate
- * @param z Shadow Z coordinate
+ * @param pos Shadow coordinates
*/
- void getShadowPosition(int32 x, int32 y, int32 z);
+ void getShadowPosition(const IVec3 &pos);
/**
* Set actor safe angle
Commit: 1f986395846301e66310f7af58257d2e86bb79f3
https://github.com/scummvm/scummvm/commit/1f986395846301e66310f7af58257d2e86bb79f3
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: use ANGLE_XX constants
Changed paths:
engines/twine/holomap.cpp
diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 72babf7572..a826aea197 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -275,7 +275,7 @@ void Holomap::renderHolomapModel(const BodyData &bodyData, int32 x, int32 y, int
_engine->_renderer->getBaseRotationPosition(0, 0, zPos + 1000);
_engine->_renderer->getBaseRotationPosition(_engine->_renderer->destPos.x, _engine->_renderer->destPos.y, _engine->_renderer->destPos.z);
_engine->_interface->resetClip();
- _engine->_renderer->renderIsoModel(_engine->_renderer->destPos.x, _engine->_renderer->destPos.y, _engine->_renderer->destPos.z, x, y, 0, bodyData);
+ _engine->_renderer->renderIsoModel(_engine->_renderer->destPos.x, _engine->_renderer->destPos.y, _engine->_renderer->destPos.z, x, y, ANGLE_0, bodyData);
}
void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
@@ -350,7 +350,7 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
_engine->_renderer->setLightVector(-60, 128, 0);
const Common::Rect rect(0, 200, 199, 479);
_engine->_interface->drawFilledRect(rect, COLOR_BLACK);
- _engine->_renderer->renderIsoModel(0, 0, 0, 0, newAngle, 0, bodyData);
+ _engine->_renderer->renderIsoModel(0, 0, 0, ANGLE_0, newAngle, ANGLE_0, bodyData);
_engine->copyBlockPhys(rect);
_engine->_renderer->setCameraPosition(400, 240, 128, 1024, 1024);
_engine->_renderer->setCameraAngle(0, 0, 0, data->pos.x, data->pos.y, data->pos.z, 5300);
@@ -465,7 +465,7 @@ void Holomap::renderLocations(int xRot, int yRot, int zRot, bool lower) {
if (bodyData != nullptr) {
int32 angleX = _locations[drawList.actorIdx].angle.x;
int32 angleY = _locations[drawList.actorIdx].angle.y;
- _engine->_renderer->renderIsoModel(drawList.x, drawList.y, drawList.z, angleX, angleY, 0, *bodyData);
+ _engine->_renderer->renderIsoModel(drawList.x, drawList.y, drawList.z, angleX, angleY, ANGLE_0, *bodyData);
}
}
}
Commit: e8af5882e8b628a3168a9cfe831351a8735ac634
https://github.com/scummvm/scummvm/commit/e8af5882e8b628a3168a9cfe831351a8735ac634
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: reduced code duplication
Changed paths:
engines/twine/renderer/redraw.cpp
engines/twine/renderer/redraw.h
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index 3034b7d98d..b00c4f79bc 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -128,14 +128,10 @@ void Redraw::moveNextAreas() {
void Redraw::flipRedrawAreas() {
for (int32 i = 0; i < numOfRedrawBox; i++) { // redraw areas on screen
- _engine->copyBlockPhys(_currentRedrawList[i].left, _currentRedrawList[i].top, _currentRedrawList[i].right, _currentRedrawList[i].bottom);
+ _engine->copyBlockPhys(_currentRedrawList[i]);
}
- numOfRedrawBox = 0;
-
- for (int32 i = 0; i < currNumOfRedrawBox; i++) { //setup the redraw areas for next display
- addRedrawCurrentArea(_nextRedrawList[i]);
- }
+ moveNextAreas();
}
void Redraw::blitBackgroundAreas() {
diff --git a/engines/twine/renderer/redraw.h b/engines/twine/renderer/redraw.h
index 9a49718416..b170b2fc92 100644
--- a/engines/twine/renderer/redraw.h
+++ b/engines/twine/renderer/redraw.h
@@ -94,7 +94,10 @@ private:
* @param redrawArea redraw the region
*/
void addRedrawCurrentArea(const Common::Rect &redrawArea);
- /** Move next regions to the current redraw list */
+ /**
+ * Move next regions to the current redraw list,
+ * setup the redraw areas for next display
+ */
void moveNextAreas();
void updateOverlayTypePosition(int16 x1, int16 y1, int16 x2, int16 y2);
Commit: f6f869539cd7804a72eeb2020535fc103316f27f
https://github.com/scummvm/scummvm/commit/f6f869539cd7804a72eeb2020535fc103316f27f
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: the non-rect method is the default
Changed paths:
engines/twine/text.cpp
diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index 3fd8a6c3aa..8b52a986dd 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -482,7 +482,7 @@ void Text::renderContinueReadingTriangle() {
polygon.renderType = POLYGONTYPE_FLAT;
_engine->_renderer->renderPolygons(polygon, vertices, top, bottom);
- _engine->copyBlockPhys(Common::Rect(left, top, right, bottom));
+ _engine->copyBlockPhys(left, top, right, bottom);
}
void Text::fadeInCharacters(int32 counter, int32 fontColor) {
Commit: 1cebbfdd519e0d8e999ae9fc98ba3aecdda2f715
https://github.com/scummvm/scummvm/commit/1cebbfdd519e0d8e999ae9fc98ba3aecdda2f715
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: use Rect::isValidRect and renamed member
Changed paths:
engines/twine/menu/interface.cpp
engines/twine/menu/interface.h
engines/twine/renderer/redraw.cpp
engines/twine/scene/grid.cpp
diff --git a/engines/twine/menu/interface.cpp b/engines/twine/menu/interface.cpp
index e20322689f..33631db692 100644
--- a/engines/twine/menu/interface.cpp
+++ b/engines/twine/menu/interface.cpp
@@ -37,14 +37,14 @@ const int32 BOTTOM = 8; // 1000
int32 Interface::checkClipping(int32 x, int32 y) const {
int32 code = INSIDE;
- if (x < textWindow.left) {
+ if (x < clip.left) {
code |= LEFT;
- } else if (x > textWindow.right) {
+ } else if (x > clip.right) {
code |= RIGHT;
}
- if (y < textWindow.top) {
+ if (y < clip.top) {
code |= TOP;
- } else if (y > textWindow.bottom) {
+ } else if (y > clip.bottom) {
code |= BOTTOM;
}
return code;
@@ -73,17 +73,17 @@ bool Interface::drawLine(int32 startWidth, int32 startHeight, int32 endWidth, in
int32 x = 0;
int32 y = 0;
if (outcodeOut & TOP) { // point is above the clip rectangle
- x = startWidth + (int)((endWidth - startWidth) * (float)(textWindow.top - startHeight) / (float)(endHeight - startHeight));
- y = textWindow.top;
+ x = startWidth + (int)((endWidth - startWidth) * (float)(clip.top - startHeight) / (float)(endHeight - startHeight));
+ y = clip.top;
} else if (outcodeOut & BOTTOM) { // point is below the clip rectangle
- x = startWidth + (int)((endWidth - startWidth) * (float)(textWindow.bottom - startHeight) / (float)(endHeight - startHeight));
- y = textWindow.bottom;
+ x = startWidth + (int)((endWidth - startWidth) * (float)(clip.bottom - startHeight) / (float)(endHeight - startHeight));
+ y = clip.bottom;
} else if (outcodeOut & RIGHT) { // point is to the right of clip rectangle
- y = startHeight + (int)((endHeight - startHeight) * (float)(textWindow.right - startWidth) / (float)(endWidth - startWidth));
- x = textWindow.right;
+ y = startHeight + (int)((endHeight - startHeight) * (float)(clip.right - startWidth) / (float)(endWidth - startWidth));
+ x = clip.right;
} else if (outcodeOut & LEFT) { // point is to the left of clip rectangle
- y = startHeight + (int)((endHeight - startHeight) * (float)(textWindow.left - startWidth) / (float)(endWidth - startWidth));
- x = textWindow.left;
+ y = startHeight + (int)((endHeight - startHeight) * (float)(clip.left - startWidth) / (float)(endWidth - startWidth));
+ x = clip.left;
}
// Clip the point
@@ -181,22 +181,22 @@ void Interface::drawFilledRect(const Common::Rect &rect, uint8 colorIndex) {
}
void Interface::setClip(const Common::Rect &rect) {
- textWindow.left = MAX((int32)0, (int32)rect.left);
- textWindow.top = MAX((int32)0, (int32)rect.top);
- textWindow.right = MIN((int32)(_engine->width() - 1), (int32)rect.right);
- textWindow.bottom = MIN((int32)(_engine->height() - 1), (int32)rect.bottom);
+ clip.left = MAX((int32)0, (int32)rect.left);
+ clip.top = MAX((int32)0, (int32)rect.top);
+ clip.right = MIN((int32)(_engine->width() - 1), (int32)rect.right);
+ clip.bottom = MIN((int32)(_engine->height() - 1), (int32)rect.bottom);
}
void Interface::saveClip() {
- textWindowSave = textWindow;
+ textWindowSave = clip;
}
void Interface::loadClip() {
- textWindow = textWindowSave;
+ clip = textWindowSave;
}
void Interface::resetClip() {
- textWindow = _engine->rect();
+ clip = _engine->rect();
}
} // namespace TwinE
diff --git a/engines/twine/menu/interface.h b/engines/twine/menu/interface.h
index f557c90721..918feff1ea 100644
--- a/engines/twine/menu/interface.h
+++ b/engines/twine/menu/interface.h
@@ -42,7 +42,7 @@ private:
public:
Interface(TwinEEngine *engine);
- Common::Rect textWindow { 0, 0, 0, 0 };
+ Common::Rect clip { 0, 0, 0, 0 };
/**
* Draw button line
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index b00c4f79bc..8d6b36c63b 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -328,7 +328,7 @@ void Redraw::processDrawListShadows(const DrawListStruct &drawCmd) {
_engine->_grid->drawOverModelActor(tmpX, tmpY, tmpZ);
- addRedrawArea(_engine->_interface->textWindow);
+ addRedrawArea(_engine->_interface->clip);
_engine->_debugScene->drawClip(renderRect);
}
@@ -366,7 +366,7 @@ void Redraw::processDrawListActors(const DrawListStruct &drawCmd, bool bgRedraw)
_engine->_interface->setClip(renderRect);
- if (_engine->_interface->textWindow.left <= _engine->_interface->textWindow.right && _engine->_interface->textWindow.top <= _engine->_interface->textWindow.bottom) {
+ if (_engine->_interface->clip.isValidRect()) {
actor->dynamicFlags.bIsVisible = 1;
const int32 tempX = (actor->pos.x + BRICK_HEIGHT) / BRICK_SIZE;
@@ -379,13 +379,13 @@ void Redraw::processDrawListActors(const DrawListStruct &drawCmd, bool bgRedraw)
_engine->_grid->drawOverModelActor(tempX, tempY, tempZ);
if (_engine->_actor->cropBottomScreen) {
- renderRect.bottom = _engine->_interface->textWindow.bottom = _engine->_actor->cropBottomScreen + 10;
+ renderRect.bottom = _engine->_interface->clip.bottom = _engine->_actor->cropBottomScreen + 10;
}
- addRedrawArea(_engine->_interface->textWindow);
+ addRedrawArea(_engine->_interface->clip);
if (actor->staticFlags.bIsBackgrounded && bgRedraw) {
- _engine->blitFrontToWork(_engine->_interface->textWindow);
+ _engine->blitFrontToWork(_engine->_interface->clip);
}
_engine->_debugScene->drawClip(renderRect);
@@ -419,7 +419,7 @@ void Redraw::processDrawListActorSprites(const DrawListStruct &drawCmd, bool bgR
_engine->_interface->setClip(renderRect);
}
- if (_engine->_interface->textWindow.left <= _engine->_interface->textWindow.right && _engine->_interface->textWindow.top <= _engine->_interface->textWindow.bottom) {
+ if (_engine->_interface->clip.isValidRect()) {
_engine->_grid->drawSprite(0, renderRect.left, renderRect.top, spritePtr);
actor->dynamicFlags.bIsVisible = 1;
@@ -440,10 +440,10 @@ void Redraw::processDrawListActorSprites(const DrawListStruct &drawCmd, bool bgR
_engine->_grid->drawOverSpriteActor(tmpX, tmpY, tmpZ);
}
- addRedrawArea(_engine->_interface->textWindow);
+ addRedrawArea(_engine->_interface->clip);
if (actor->staticFlags.bIsBackgrounded && bgRedraw) {
- _engine->blitFrontToWork(_engine->_interface->textWindow);
+ _engine->blitFrontToWork(_engine->_interface->clip);
}
_engine->_debugScene->drawClip(renderRect);
@@ -475,13 +475,13 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
_engine->_interface->setClip(renderRect);
- if (_engine->_interface->textWindow.left <= _engine->_interface->textWindow.right && _engine->_interface->textWindow.top <= _engine->_interface->textWindow.bottom) {
+ if (_engine->_interface->clip.isValidRect()) {
const int32 tmpX = (drawCmd.x + BRICK_HEIGHT) / BRICK_SIZE;
const int32 tmpY = drawCmd.y / BRICK_HEIGHT;
const int32 tmpZ = (drawCmd.z + BRICK_HEIGHT) / BRICK_SIZE;
_engine->_grid->drawOverModelActor(tmpX, tmpY, tmpZ);
- addRedrawArea(_engine->_interface->textWindow);
+ addRedrawArea(_engine->_interface->clip);
// show clipping area
//drawBox(renderRect);
@@ -563,7 +563,7 @@ void Redraw::renderOverlays() {
_engine->_grid->drawSprite(renderRect.left, renderRect.top, spritePtr);
- addRedrawArea(_engine->_interface->textWindow);
+ addRedrawArea(_engine->_interface->clip);
break;
}
case OverlayType::koNumber: {
@@ -584,7 +584,7 @@ void Redraw::renderOverlays() {
_engine->_text->drawText(renderRect.left, renderRect.top, text);
- addRedrawArea(_engine->_interface->textWindow);
+ addRedrawArea(_engine->_interface->clip);
break;
}
case OverlayType::koNumberRange: {
@@ -607,7 +607,7 @@ void Redraw::renderOverlays() {
_engine->_text->drawText(renderRect.left, renderRect.top, text);
- addRedrawArea(_engine->_interface->textWindow);
+ addRedrawArea(_engine->_interface->clip);
break;
}
case OverlayType::koInventoryItem: {
@@ -659,7 +659,7 @@ void Redraw::renderOverlays() {
_engine->_text->drawText(renderRect.left, renderRect.top, text);
- addRedrawArea(_engine->_interface->textWindow);
+ addRedrawArea(_engine->_interface->clip);
break;
}
}
diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index 25f1c6da68..449e7e8a5c 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -72,7 +72,7 @@ void Grid::copyGridMask(int32 index, int32 x, int32 y, const Graphics::ManagedSu
int32 right = *ptr + left - 1;
int32 bottom = *(ptr + 1) + top - 1;
- if (left > _engine->_interface->textWindow.right || right < _engine->_interface->textWindow.left || bottom < _engine->_interface->textWindow.top || top > _engine->_interface->textWindow.bottom) {
+ if (left > _engine->_interface->clip.right || right < _engine->_interface->clip.left || bottom < _engine->_interface->clip.top || top > _engine->_interface->clip.bottom) {
return;
}
@@ -93,8 +93,8 @@ void Grid::copyGridMask(int32 index, int32 x, int32 y, const Graphics::ManagedSu
bottom++;
// if line on top aren't in the blitting area...
- if (absY < _engine->_interface->textWindow.top) {
- int numOfLineToRemove = _engine->_interface->textWindow.top - absY;
+ if (absY < _engine->_interface->clip.top) {
+ int numOfLineToRemove = _engine->_interface->clip.top - absY;
vSize -= numOfLineToRemove;
if (vSize <= 0) {
@@ -112,8 +112,8 @@ void Grid::copyGridMask(int32 index, int32 x, int32 y, const Graphics::ManagedSu
}
// reduce the vSize to remove lines on bottom
- if (absY + vSize - 1 > _engine->_interface->textWindow.bottom) {
- vSize = _engine->_interface->textWindow.bottom - absY + 1;
+ if (absY + vSize - 1 > _engine->_interface->clip.bottom) {
+ vSize = _engine->_interface->clip.bottom - absY + 1;
if (vSize <= 0) {
return;
}
@@ -140,7 +140,7 @@ void Grid::copyGridMask(int32 index, int32 x, int32 y, const Graphics::ManagedSu
width = *(ptr++); // copy size
for (int32 j = 0; j < width; j++) {
- if (absX >= _engine->_interface->textWindow.left && absX <= _engine->_interface->textWindow.right) {
+ if (absX >= _engine->_interface->clip.left && absX <= _engine->_interface->clip.right) {
*outPtr = *inPtr;
}
@@ -162,14 +162,14 @@ const BrickEntry* Grid::getBrickEntry(int32 j, int32 i) const {
}
void Grid::drawOverModelActor(int32 x, int32 y, int32 z) {
- const int32 copyBlockPhysLeft = ((_engine->_interface->textWindow.left + 24) / 24) - 1;
- const int32 copyBlockPhysRight = ((_engine->_interface->textWindow.right + 24) / 24);
+ const int32 copyBlockPhysLeft = ((_engine->_interface->clip.left + 24) / 24) - 1;
+ const int32 copyBlockPhysRight = ((_engine->_interface->clip.right + 24) / 24);
for (int32 j = copyBlockPhysLeft; j <= copyBlockPhysRight; j++) {
for (int32 i = 0; i < _brickInfoBuffer[j]; i++) {
const BrickEntry *currBrickEntry = getBrickEntry(j, i);
- if (currBrickEntry->posY + 38 > _engine->_interface->textWindow.top && currBrickEntry->posY <= _engine->_interface->textWindow.bottom && currBrickEntry->y >= y) {
+ if (currBrickEntry->posY + 38 > _engine->_interface->clip.top && currBrickEntry->posY <= _engine->_interface->clip.bottom && currBrickEntry->y >= y) {
if (currBrickEntry->x + currBrickEntry->z > z + x) {
copyGridMask(currBrickEntry->index, (j * 24) - 24, currBrickEntry->posY, _engine->workVideoBuffer);
}
@@ -179,14 +179,14 @@ void Grid::drawOverModelActor(int32 x, int32 y, int32 z) {
}
void Grid::drawOverSpriteActor(int32 x, int32 y, int32 z) {
- const int32 copyBlockPhysLeft = ((_engine->_interface->textWindow.left + 24) / 24) - 1;
- const int32 copyBlockPhysRight = (_engine->_interface->textWindow.right + 24) / 24;
+ const int32 copyBlockPhysLeft = ((_engine->_interface->clip.left + 24) / 24) - 1;
+ const int32 copyBlockPhysRight = (_engine->_interface->clip.right + 24) / 24;
for (int32 j = copyBlockPhysLeft; j <= copyBlockPhysRight; j++) {
for (int32 i = 0; i < _brickInfoBuffer[j]; i++) {
const BrickEntry *currBrickEntry = getBrickEntry(j, i);
- if (currBrickEntry->posY + 38 > _engine->_interface->textWindow.top && currBrickEntry->posY <= _engine->_interface->textWindow.bottom && currBrickEntry->y >= y) {
+ if (currBrickEntry->posY + 38 > _engine->_interface->clip.top && currBrickEntry->posY <= _engine->_interface->clip.bottom && currBrickEntry->y >= y) {
if (currBrickEntry->x == x && currBrickEntry->z == z) {
copyGridMask(currBrickEntry->index, (j * 24) - 24, currBrickEntry->posY, _engine->workVideoBuffer);
}
@@ -488,19 +488,19 @@ bool Grid::drawSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr) {
bool Grid::drawSprite(int32 posX, int32 posY, const SpriteData &ptr) {
const int32 left = posX + ptr.offsetX();
- if (left > _engine->_interface->textWindow.right) {
+ if (left > _engine->_interface->clip.right) {
return false;
}
const int32 right = ptr.surface().w + left;
- if (right < _engine->_interface->textWindow.left) {
+ if (right < _engine->_interface->clip.left) {
return false;
}
const int32 top = posY + ptr.offsetY();
- if (top > _engine->_interface->textWindow.bottom) {
+ if (top > _engine->_interface->clip.bottom) {
return false;
}
const int32 bottom = ptr.surface().h + top;
- if (bottom < _engine->_interface->textWindow.top) {
+ if (bottom < _engine->_interface->clip.top) {
return false;
}
@@ -511,27 +511,27 @@ bool Grid::drawSprite(int32 posX, int32 posY, const SpriteData &ptr) {
// WARNING: Rewrite this function to have better performance
bool Grid::drawBrickSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr, bool isSprite) {
- if (_engine->_interface->textWindow.left > _engine->_interface->textWindow.right || _engine->_interface->textWindow.top > _engine->_interface->textWindow.bottom) {
+ if (_engine->_interface->clip.left > _engine->_interface->clip.right || _engine->_interface->clip.top > _engine->_interface->clip.bottom) {
return false;
}
const int32 left = posX + *(ptr + 2);
- if (left > _engine->_interface->textWindow.right) {
+ if (left > _engine->_interface->clip.right) {
return false;
}
const int32 right = *ptr + left;
- if (right < _engine->_interface->textWindow.left) {
+ if (right < _engine->_interface->clip.left) {
return false;
}
const int32 top = posY + *(ptr + 3);
- if (top > _engine->_interface->textWindow.bottom) {
+ if (top > _engine->_interface->clip.bottom) {
return false;
}
const int32 bottom = (int32)*(ptr + 1) + top;
- if (bottom < _engine->_interface->textWindow.top) {
+ if (bottom < _engine->_interface->clip.top) {
return false;
}
- const int32 maxY = MIN(bottom, (int32)_engine->_interface->textWindow.bottom);
+ const int32 maxY = MIN(bottom, (int32)_engine->_interface->clip.bottom);
ptr += 4;
@@ -549,7 +549,7 @@ bool Grid::drawBrickSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr
x += iterations;
continue;
}
- if (y < _engine->_interface->textWindow.top || x >= _engine->_interface->textWindow.right || x + iterations < _engine->_interface->textWindow.left) {
+ if (y < _engine->_interface->clip.top || x >= _engine->_interface->clip.right || x + iterations < _engine->_interface->clip.left) {
if (type == 1) {
ptr += iterations;
} else {
@@ -561,7 +561,7 @@ bool Grid::drawBrickSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr
if (type == 1) {
uint8 *out = (uint8 *)_engine->frontVideoBuffer.getBasePtr(x, y);
for (uint8 i = 0; i < iterations; i++) {
- if (x >= _engine->_interface->textWindow.left && x < _engine->_interface->textWindow.right) {
+ if (x >= _engine->_interface->clip.left && x < _engine->_interface->clip.right) {
*out = *ptr;
}
@@ -573,7 +573,7 @@ bool Grid::drawBrickSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr
const uint8 pixel = *ptr++;
uint8 *out = (uint8 *)_engine->frontVideoBuffer.getBasePtr(x, y);
for (uint8 i = 0; i < iterations; i++) {
- if (x >= _engine->_interface->textWindow.left && x < _engine->_interface->textWindow.right) {
+ if (x >= _engine->_interface->clip.left && x < _engine->_interface->clip.right) {
*out = pixel;
}
Commit: f95d6fd0eaa6fb0ca069087c4a2adbce47550106
https://github.com/scummvm/scummvm/commit/f95d6fd0eaa6fb0ca069087c4a2adbce47550106
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: use Rect::clip and renamed member
Changed paths:
engines/twine/menu/interface.cpp
engines/twine/menu/interface.h
engines/twine/renderer/redraw.cpp
diff --git a/engines/twine/menu/interface.cpp b/engines/twine/menu/interface.cpp
index 33631db692..5a03480d21 100644
--- a/engines/twine/menu/interface.cpp
+++ b/engines/twine/menu/interface.cpp
@@ -181,18 +181,16 @@ void Interface::drawFilledRect(const Common::Rect &rect, uint8 colorIndex) {
}
void Interface::setClip(const Common::Rect &rect) {
- clip.left = MAX((int32)0, (int32)rect.left);
- clip.top = MAX((int32)0, (int32)rect.top);
- clip.right = MIN((int32)(_engine->width() - 1), (int32)rect.right);
- clip.bottom = MIN((int32)(_engine->height() - 1), (int32)rect.bottom);
+ clip = rect;
+ clip.clip(_engine->rect());
}
void Interface::saveClip() {
- textWindowSave = clip;
+ savedClip = clip;
}
void Interface::loadClip() {
- clip = textWindowSave;
+ clip = savedClip;
}
void Interface::resetClip() {
diff --git a/engines/twine/menu/interface.h b/engines/twine/menu/interface.h
index 918feff1ea..f039aa547a 100644
--- a/engines/twine/menu/interface.h
+++ b/engines/twine/menu/interface.h
@@ -38,7 +38,7 @@ class Interface {
private:
TwinEEngine *_engine;
int32 checkClipping(int32 x, int32 y) const;
- Common::Rect textWindowSave;
+ Common::Rect savedClip;
public:
Interface(TwinEEngine *engine);
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index 8d6b36c63b..ea56f3b8ea 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -633,25 +633,11 @@ void Redraw::renderOverlays() {
const int32 textHeight = 48;
renderRect.left = overlay->x - (textLength / 2);
- renderRect.top = overlay->y - 24;
+ renderRect.top = overlay->y - (textHeight / 2);
renderRect.right = overlay->x + (textLength / 2);
renderRect.bottom = overlay->y + textHeight;
- if (renderRect.left < 0) {
- renderRect.left = 0;
- }
-
- if (renderRect.top < 0) {
- renderRect.top = 0;
- }
-
- if (renderRect.right > (_engine->width() - 1)) {
- renderRect.right = (_engine->width() - 1);
- }
-
- if (renderRect.bottom > (_engine->height() - 1)) {
- renderRect.bottom = (_engine->height() - 1);
- }
+ renderRect.clip(_engine->rect());
_engine->_interface->setClip(renderRect);
Commit: c1a27b7512073f69667a457fb1e31974be845ead
https://github.com/scummvm/scummvm/commit/c1a27b7512073f69667a457fb1e31974be845ead
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-07-31T08:38:38+02:00
Commit Message:
TWINE: converted member to local var (Redraw::renderRect)
Changed paths:
engines/twine/debugger/debug_scene.cpp
engines/twine/holomap.cpp
engines/twine/menu/interface.cpp
engines/twine/menu/interface.h
engines/twine/renderer/redraw.cpp
engines/twine/renderer/redraw.h
engines/twine/renderer/renderer.cpp
engines/twine/renderer/renderer.h
engines/twine/scene/animations.cpp
engines/twine/scene/collision.cpp
engines/twine/scene/extra.cpp
engines/twine/scene/extra.h
engines/twine/scene/gamestate.cpp
engines/twine/twine.cpp
diff --git a/engines/twine/debugger/debug_scene.cpp b/engines/twine/debugger/debug_scene.cpp
index 7fb7e8464b..53cd0a9899 100644
--- a/engines/twine/debugger/debug_scene.cpp
+++ b/engines/twine/debugger/debug_scene.cpp
@@ -47,22 +47,6 @@ void DebugScene::projectBoundingBoxPoints(IVec3 *pPoint3d, IVec3 *pPoint3dProjec
pPoint3dProjected->x = _engine->_renderer->projPos.x;
pPoint3dProjected->y = _engine->_renderer->projPos.y;
pPoint3dProjected->z = _engine->_renderer->projPos.z;
-
- if (_engine->_redraw->renderRect.left > _engine->_renderer->projPos.x) {
- _engine->_redraw->renderRect.left = _engine->_renderer->projPos.x;
- }
-
- if (_engine->_redraw->renderRect.right < _engine->_renderer->projPos.x) {
- _engine->_redraw->renderRect.right = _engine->_renderer->projPos.x;
- }
-
- if (_engine->_redraw->renderRect.top > _engine->_renderer->projPos.y) {
- _engine->_redraw->renderRect.top = _engine->_renderer->projPos.y;
- }
-
- if (_engine->_redraw->renderRect.bottom < _engine->_renderer->projPos.y) {
- _engine->_redraw->renderRect.bottom = _engine->_renderer->projPos.y;
- }
}
bool DebugScene::checkZoneType(ZoneType type) const {
diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index a826aea197..c611819674 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -275,7 +275,8 @@ void Holomap::renderHolomapModel(const BodyData &bodyData, int32 x, int32 y, int
_engine->_renderer->getBaseRotationPosition(0, 0, zPos + 1000);
_engine->_renderer->getBaseRotationPosition(_engine->_renderer->destPos.x, _engine->_renderer->destPos.y, _engine->_renderer->destPos.z);
_engine->_interface->resetClip();
- _engine->_renderer->renderIsoModel(_engine->_renderer->destPos.x, _engine->_renderer->destPos.y, _engine->_renderer->destPos.z, x, y, ANGLE_0, bodyData);
+ Common::Rect dummy;
+ _engine->_renderer->renderIsoModel(_engine->_renderer->destPos.x, _engine->_renderer->destPos.y, _engine->_renderer->destPos.z, x, y, ANGLE_0, bodyData, dummy);
}
void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
@@ -350,7 +351,8 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
_engine->_renderer->setLightVector(-60, 128, 0);
const Common::Rect rect(0, 200, 199, 479);
_engine->_interface->drawFilledRect(rect, COLOR_BLACK);
- _engine->_renderer->renderIsoModel(0, 0, 0, ANGLE_0, newAngle, ANGLE_0, bodyData);
+ Common::Rect dummy;
+ _engine->_renderer->renderIsoModel(0, 0, 0, ANGLE_0, newAngle, ANGLE_0, bodyData, dummy);
_engine->copyBlockPhys(rect);
_engine->_renderer->setCameraPosition(400, 240, 128, 1024, 1024);
_engine->_renderer->setCameraAngle(0, 0, 0, data->pos.x, data->pos.y, data->pos.z, 5300);
@@ -465,7 +467,8 @@ void Holomap::renderLocations(int xRot, int yRot, int zRot, bool lower) {
if (bodyData != nullptr) {
int32 angleX = _locations[drawList.actorIdx].angle.x;
int32 angleY = _locations[drawList.actorIdx].angle.y;
- _engine->_renderer->renderIsoModel(drawList.x, drawList.y, drawList.z, angleX, angleY, ANGLE_0, *bodyData);
+ Common::Rect dummy;
+ _engine->_renderer->renderIsoModel(drawList.x, drawList.y, drawList.z, angleX, angleY, ANGLE_0, *bodyData, dummy);
}
}
}
diff --git a/engines/twine/menu/interface.cpp b/engines/twine/menu/interface.cpp
index 5a03480d21..c365126f3c 100644
--- a/engines/twine/menu/interface.cpp
+++ b/engines/twine/menu/interface.cpp
@@ -180,9 +180,13 @@ void Interface::drawFilledRect(const Common::Rect &rect, uint8 colorIndex) {
_engine->frontVideoBuffer.fillRect(Common::Rect(rect.left, rect.top, rect.right + 1, rect.bottom + 1), colorIndex);
}
-void Interface::setClip(const Common::Rect &rect) {
+bool Interface::setClip(const Common::Rect &rect) {
+ if (!clip.isValidRect()) {
+ return false;
+ }
clip = rect;
clip.clip(_engine->rect());
+ return true;
}
void Interface::saveClip() {
diff --git a/engines/twine/menu/interface.h b/engines/twine/menu/interface.h
index f039aa547a..cf05f431f5 100644
--- a/engines/twine/menu/interface.h
+++ b/engines/twine/menu/interface.h
@@ -68,7 +68,7 @@ public:
void drawFilledRect(const Common::Rect &rect, uint8 colorIndex);
- void setClip(const Common::Rect &rect);
+ bool setClip(const Common::Rect &rect);
void saveClip(); // saveTextWindow
void loadClip(); // loadSavedTextWindow
void resetClip();
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index ea56f3b8ea..fed62aae2e 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -313,6 +313,7 @@ void Redraw::processDrawListShadows(const DrawListStruct &drawCmd) {
_engine->_grid->getSpriteSize(drawCmd.offset, &spriteWidth, &spriteHeight, _engine->_resources->spriteShadowPtr);
// calculate sprite size and position on screen
+ Common::Rect renderRect;
renderRect.left = _engine->_renderer->projPos.x - (spriteWidth / 2);
renderRect.top = _engine->_renderer->projPos.y - (spriteHeight / 2);
renderRect.right = _engine->_renderer->projPos.x + (spriteWidth / 2);
@@ -344,29 +345,12 @@ void Redraw::processDrawListActors(const DrawListStruct &drawCmd, bool bgRedraw)
const int32 x = actor->pos.x - _engine->_grid->camera.x;
const int32 y = actor->pos.y - _engine->_grid->camera.y;
const int32 z = actor->pos.z - _engine->_grid->camera.z;
- if (!_engine->_renderer->renderIsoModel(x, y, z, ANGLE_0, actor->angle, ANGLE_0, _engine->_resources->bodyData[actor->entity])) {
+ Common::Rect renderRect;
+ if (!_engine->_renderer->renderIsoModel(x, y, z, ANGLE_0, actor->angle, ANGLE_0, _engine->_resources->bodyData[actor->entity], renderRect)) {
return;
}
- if (renderRect.left < 0) {
- renderRect.left = 0;
- }
-
- if (renderRect.top < 0) {
- renderRect.top = 0;
- }
-
- if (renderRect.right >= _engine->width()) {
- renderRect.right = (_engine->width() - 1);
- }
-
- if (renderRect.bottom >= _engine->height()) {
- renderRect.bottom = (_engine->height() - 1);
- }
-
- _engine->_interface->setClip(renderRect);
-
- if (_engine->_interface->clip.isValidRect()) {
+ if (_engine->_interface->setClip(renderRect)) {
actor->dynamicFlags.bIsVisible = 1;
const int32 tempX = (actor->pos.x + BRICK_HEIGHT) / BRICK_SIZE;
@@ -379,7 +363,7 @@ void Redraw::processDrawListActors(const DrawListStruct &drawCmd, bool bgRedraw)
_engine->_grid->drawOverModelActor(tempX, tempY, tempZ);
if (_engine->_actor->cropBottomScreen) {
- renderRect.bottom = _engine->_interface->clip.bottom = _engine->_actor->cropBottomScreen + 10;
+ _engine->_interface->clip.bottom = _engine->_actor->cropBottomScreen + 10;
}
addRedrawArea(_engine->_interface->clip);
@@ -388,7 +372,7 @@ void Redraw::processDrawListActors(const DrawListStruct &drawCmd, bool bgRedraw)
_engine->blitFrontToWork(_engine->_interface->clip);
}
- _engine->_debugScene->drawClip(renderRect);
+ _engine->_debugScene->drawClip(_engine->_interface->clip);
}
}
@@ -407,6 +391,7 @@ void Redraw::processDrawListActorSprites(const DrawListStruct &drawCmd, bool bgR
// calculate sprite position on screen
const SpriteDim *dim = _engine->_resources->spriteBoundingBox.dim(actor->entity);
+ Common::Rect renderRect;
renderRect.left = _engine->_renderer->projPos.x + dim->x;
renderRect.top = _engine->_renderer->projPos.y + dim->y;
renderRect.right = renderRect.left + spriteWidth;
@@ -456,8 +441,9 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
_engine->_renderer->projectPositionOnScreen(extra->pos - _engine->_grid->camera);
+ Common::Rect renderRect;
if (extra->info0 & EXTRA_SPECIAL_MASK) {
- _engine->_extra->drawExtraSpecial(extraIdx, _engine->_renderer->projPos.x, _engine->_renderer->projPos.y);
+ _engine->_extra->drawExtraSpecial(extraIdx, _engine->_renderer->projPos.x, _engine->_renderer->projPos.y, renderRect);
} else {
const SpriteData &spritePtr = _engine->_resources->spriteData[extra->info0];
const int32 spriteWidth = spritePtr.surface().w;
@@ -556,6 +542,7 @@ void Redraw::renderOverlays() {
const int32 spriteHeight = spritePtr.surface().h;
const SpriteDim *dim = _engine->_resources->spriteBoundingBox.dim(overlay->info0);
+ Common::Rect renderRect;
renderRect.left = dim->x + overlay->x;
renderRect.top = dim->y + overlay->y;
renderRect.right = renderRect.left + spriteWidth;
@@ -573,6 +560,7 @@ void Redraw::renderOverlays() {
const int32 textLength = _engine->_text->getTextSize(text);
const int32 textHeight = 48;
+ Common::Rect renderRect;
renderRect.left = overlay->x - (textLength / 2);
renderRect.top = overlay->y - 24;
renderRect.right = overlay->x + (textLength / 2);
@@ -596,6 +584,7 @@ void Redraw::renderOverlays() {
const int32 textLength = _engine->_text->getTextSize(text);
const int32 textHeight = 48;
+ Common::Rect renderRect;
renderRect.left = overlay->x - (textLength / 2);
renderRect.top = overlay->y - 24;
renderRect.right = overlay->x + (textLength / 2);
@@ -632,6 +621,7 @@ void Redraw::renderOverlays() {
const int32 textLength = _engine->_text->getTextSize(text);
const int32 textHeight = 48;
+ Common::Rect renderRect;
renderRect.left = overlay->x - (textLength / 2);
renderRect.top = overlay->y - (textHeight / 2);
renderRect.right = overlay->x + (textLength / 2);
@@ -735,6 +725,7 @@ void Redraw::drawBubble(int32 actorIdx) {
const int32 spriteHeight = spritePtr.surface().h;
// calculate sprite position on screen
+ Common::Rect renderRect;
if (bubbleSpriteIndex == SPRITEHQR_DIAG_BUBBLE_RIGHT) {
renderRect.left = _engine->_renderer->projPos.x + 10;
} else {
diff --git a/engines/twine/renderer/redraw.h b/engines/twine/renderer/redraw.h
index b170b2fc92..34f9ad0922 100644
--- a/engines/twine/renderer/redraw.h
+++ b/engines/twine/renderer/redraw.h
@@ -114,9 +114,6 @@ private:
public:
Redraw(TwinEEngine *engine) : _engine(engine) {}
- /** Auxiliar object render position on screen */
- Common::Rect renderRect { 0, 0, 0, 0 };
-
bool inSceneryView = false;
/** Request background redraw */
diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 2fb39be1f4..e9892d62aa 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1169,17 +1169,13 @@ const Renderer::RenderCommand *Renderer::depthSortRenderCommands(int32 numOfPrim
return _renderCmds;
}
-bool Renderer::renderModelElements(int32 numOfPrimitives, const BodyData &bodyData, RenderCommand **renderCmds, ModelData *modelData) {
+bool Renderer::renderModelElements(int32 numOfPrimitives, const BodyData &bodyData, RenderCommand **renderCmds, ModelData *modelData, Common::Rect &modelRect) {
uint8 *renderBufferPtr = _renderCoordinatesBuffer;
renderBufferPtr = preparePolygons(bodyData.getPolygons(), numOfPrimitives, renderCmds, renderBufferPtr, modelData);
renderBufferPtr = prepareLines(bodyData.getLines(), numOfPrimitives, renderCmds, renderBufferPtr, modelData);
renderBufferPtr = prepareSpheres(bodyData.getSpheres(), numOfPrimitives, renderCmds, renderBufferPtr, modelData);
if (numOfPrimitives == 0) {
- _engine->_redraw->renderRect.right = -1;
- _engine->_redraw->renderRect.bottom = -1;
- _engine->_redraw->renderRect.left = -1;
- _engine->_redraw->renderRect.top = -1;
return false;
}
const RenderCommand *cmds = depthSortRenderCommands(numOfPrimitives);
@@ -1218,20 +1214,20 @@ bool Renderer::renderModelElements(int32 numOfPrimitives, const BodyData &bodyDa
radius += 3;
- if (sphere->x + radius > _engine->_redraw->renderRect.right) {
- _engine->_redraw->renderRect.right = sphere->x + radius;
+ if (sphere->x + radius > modelRect.right) {
+ modelRect.right = sphere->x + radius;
}
- if (sphere->x - radius < _engine->_redraw->renderRect.left) {
- _engine->_redraw->renderRect.left = sphere->x - radius;
+ if (sphere->x - radius < modelRect.left) {
+ modelRect.left = sphere->x - radius;
}
- if (sphere->y + radius > _engine->_redraw->renderRect.bottom) {
- _engine->_redraw->renderRect.bottom = sphere->y + radius;
+ if (sphere->y + radius > modelRect.bottom) {
+ modelRect.bottom = sphere->y + radius;
}
- if (sphere->y - radius < _engine->_redraw->renderRect.top) {
- _engine->_redraw->renderRect.top = sphere->y - radius;
+ if (sphere->y - radius < modelRect.top) {
+ modelRect.top = sphere->y - radius;
}
radius -= 3;
@@ -1248,7 +1244,7 @@ bool Renderer::renderModelElements(int32 numOfPrimitives, const BodyData &bodyDa
return true;
}
-bool Renderer::renderAnimatedModel(ModelData *modelData, const BodyData &bodyData, RenderCommand *renderCmds, const IVec3 &angleVec, const IVec3 &renderPos) {
+bool Renderer::renderAnimatedModel(ModelData *modelData, const BodyData &bodyData, RenderCommand *renderCmds, const IVec3 &angleVec, const IVec3 &renderPos, Common::Rect &modelRect) {
const int32 numVertices = bodyData.getNumVertices();
const int32 numBones = bodyData.getNumBones();
@@ -1296,18 +1292,18 @@ bool Renderer::renderAnimatedModel(ModelData *modelData, const BodyData &bodyDat
pointPtrDest->y = (((coX - coZ) * 12) - coY * 30) / BRICK_SIZE + _orthoProjPos.y;
pointPtrDest->z = coZ - coX - coY;
- if (pointPtrDest->x < _engine->_redraw->renderRect.left) {
- _engine->_redraw->renderRect.left = pointPtrDest->x;
+ if (pointPtrDest->x < modelRect.left) {
+ modelRect.left = pointPtrDest->x;
}
- if (pointPtrDest->x > _engine->_redraw->renderRect.right) {
- _engine->_redraw->renderRect.right = pointPtrDest->x;
+ if (pointPtrDest->x > modelRect.right) {
+ modelRect.right = pointPtrDest->x;
}
- if (pointPtrDest->y < _engine->_redraw->renderRect.top) {
- _engine->_redraw->renderRect.top = pointPtrDest->y;
+ if (pointPtrDest->y < modelRect.top) {
+ modelRect.top = pointPtrDest->y;
}
- if (pointPtrDest->y > _engine->_redraw->renderRect.bottom) {
- _engine->_redraw->renderRect.bottom = pointPtrDest->y;
+ if (pointPtrDest->y > modelRect.bottom) {
+ modelRect.bottom = pointPtrDest->y;
}
pointPtr++;
@@ -1335,12 +1331,12 @@ bool Renderer::renderAnimatedModel(ModelData *modelData, const BodyData &bodyDat
pointPtrDest->x = coX;
- if (pointPtrDest->x < _engine->_redraw->renderRect.left) {
- _engine->_redraw->renderRect.left = pointPtrDest->x;
+ if (pointPtrDest->x < modelRect.left) {
+ modelRect.left = pointPtrDest->x;
}
- if (pointPtrDest->x > _engine->_redraw->renderRect.right) {
- _engine->_redraw->renderRect.right = pointPtrDest->x;
+ if (pointPtrDest->x > modelRect.right) {
+ modelRect.right = pointPtrDest->x;
}
}
@@ -1354,11 +1350,11 @@ bool Renderer::renderAnimatedModel(ModelData *modelData, const BodyData &bodyDat
pointPtrDest->y = coY;
- if (pointPtrDest->y < _engine->_redraw->renderRect.top) {
- _engine->_redraw->renderRect.top = pointPtrDest->y;
+ if (pointPtrDest->y < modelRect.top) {
+ modelRect.top = pointPtrDest->y;
}
- if (pointPtrDest->y > _engine->_redraw->renderRect.bottom) {
- _engine->_redraw->renderRect.bottom = pointPtrDest->y;
+ if (pointPtrDest->y > modelRect.bottom) {
+ modelRect.bottom = pointPtrDest->y;
}
}
@@ -1426,20 +1422,20 @@ bool Renderer::renderAnimatedModel(ModelData *modelData, const BodyData &bodyDat
} while (--numOfPrimitives);
}
- return renderModelElements(numOfPrimitives, bodyData, &renderCmds, modelData);
+ return renderModelElements(numOfPrimitives, bodyData, &renderCmds, modelData, modelRect);
}
-bool Renderer::renderIsoModel(int32 x, int32 y, int32 z, int32 angleX, int32 angleY, int32 angleZ, const BodyData &bodyData) {
+bool Renderer::renderIsoModel(int32 x, int32 y, int32 z, int32 angleX, int32 angleY, int32 angleZ, const BodyData &bodyData, Common::Rect &modelRect) {
IVec3 renderAngle;
renderAngle.x = angleX;
renderAngle.y = angleY;
renderAngle.z = angleZ;
// model render size reset
- _engine->_redraw->renderRect.left = SCENE_SIZE_MAX;
- _engine->_redraw->renderRect.top = SCENE_SIZE_MAX;
- _engine->_redraw->renderRect.right = SCENE_SIZE_MIN;
- _engine->_redraw->renderRect.bottom = SCENE_SIZE_MIN;
+ modelRect.left = SCENE_SIZE_MAX;
+ modelRect.top = SCENE_SIZE_MAX;
+ modelRect.right = SCENE_SIZE_MIN;
+ modelRect.bottom = SCENE_SIZE_MIN;
IVec3 renderPos;
if (_isUsingOrthoProjection) {
@@ -1456,7 +1452,14 @@ bool Renderer::renderIsoModel(int32 x, int32 y, int32 z, int32 angleX, int32 ang
error("Unsupported unanimated model render!");
}
// restart at the beginning of the renderTable
- return renderAnimatedModel(&_modelData, bodyData, _renderCmds, renderAngle, renderPos);
+ if (!renderAnimatedModel(&_modelData, bodyData, _renderCmds, renderAngle, renderPos, modelRect)) {
+ modelRect.right = -1;
+ modelRect.bottom = -1;
+ modelRect.left = -1;
+ modelRect.top = -1;
+ return false;
+ }
+ return true;
}
void Renderer::renderBehaviourModel(const Common::Rect &rect, int32 y, int32 angle, const BodyData &bodyData) {
@@ -1470,15 +1473,16 @@ void Renderer::renderBehaviourModel(int32 boxLeft, int32 boxTop, int32 boxRight,
setOrthoProjection(xpos, ypos, 0);
_engine->_interface->setClip(Common::Rect(boxLeft, boxTop, boxRight, boxBottom));
+ Common::Rect dummy;
if (angle == -1) {
ActorMoveStruct &move = _engine->_menu->moveMenu;
const int16 newAngle = move.getRealAngle(_engine->lbaTime);
if (move.numOfStep == 0) {
_engine->_movements->setActorAngleSafe(newAngle, newAngle - ANGLE_90, ANGLE_17, &move);
}
- renderIsoModel(0, y, 0, ANGLE_0, newAngle, ANGLE_0, bodyData);
+ renderIsoModel(0, y, 0, ANGLE_0, newAngle, ANGLE_0, bodyData, dummy);
} else {
- renderIsoModel(0, y, 0, ANGLE_0, angle, ANGLE_0, bodyData);
+ renderIsoModel(0, y, 0, ANGLE_0, angle, ANGLE_0, bodyData, dummy);
}
}
@@ -1486,7 +1490,8 @@ void Renderer::renderInventoryItem(int32 x, int32 y, const BodyData &bodyData, i
setCameraPosition(x, y, 128, 200, 200);
setCameraAngle(0, 0, 0, 60, 0, 0, param);
- renderIsoModel(0, 0, 0, ANGLE_0, angle, ANGLE_0, bodyData);
+ Common::Rect dummy;
+ renderIsoModel(0, 0, 0, ANGLE_0, angle, ANGLE_0, bodyData, dummy);
}
void Renderer::computeHolomapPolygon(int32 top, int32 x1, int32 bottom, int32 x2, int16 *polygonTabPtr) {
diff --git a/engines/twine/renderer/renderer.h b/engines/twine/renderer/renderer.h
index abee470d0b..b7c4029e4c 100644
--- a/engines/twine/renderer/renderer.h
+++ b/engines/twine/renderer/renderer.h
@@ -134,9 +134,9 @@ private:
ModelData _modelData;
- bool renderAnimatedModel(ModelData *modelData, const BodyData &bodyData, RenderCommand *renderCmds, const IVec3 &angleVec, const IVec3 &renderPos);
+ bool renderAnimatedModel(ModelData *modelData, const BodyData &bodyData, RenderCommand *renderCmds, const IVec3 &angleVec, const IVec3 &renderPos, Common::Rect &modelRect);
void circleFill(int32 x, int32 y, int32 radius, uint8 color);
- bool renderModelElements(int32 numOfPrimitives, const BodyData &bodyData, RenderCommand **renderCmds, ModelData *modelData);
+ bool renderModelElements(int32 numOfPrimitives, const BodyData &bodyData, RenderCommand **renderCmds, ModelData *modelData, Common::Rect &modelRect);
void getCameraAnglePositions(int32 x, int32 y, int32 z);
void applyRotation(IMatrix3x3 *targetMatrix, const IMatrix3x3 *currentMatrix, const IVec3 &angleVec);
void applyPointsRotation(const Common::Array<BodyVertex>& vertices, int32 firstPoint, int32 numPoints, I16Vec3 *destPoints, const IMatrix3x3 *rotationMatrix);
@@ -234,7 +234,7 @@ public:
void setBaseRotation(int32 x, int32 y, int32 z, bool transpose = false);
void setOrthoProjection(int32 x, int32 y, int32 z);
- bool renderIsoModel(int32 x, int32 y, int32 z, int32 angleX, int32 angleY, int32 angleZ, const BodyData &bodyData);
+ bool renderIsoModel(int32 x, int32 y, int32 z, int32 angleX, int32 angleY, int32 angleZ, const BodyData &bodyData, Common::Rect &modelRect);
/**
* @param angle A value of @c -1 means that the model is automatically rotated
diff --git a/engines/twine/scene/animations.cpp b/engines/twine/scene/animations.cpp
index c866c909cb..deb9410101 100644
--- a/engines/twine/scene/animations.cpp
+++ b/engines/twine/scene/animations.cpp
@@ -464,14 +464,16 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
return;
}
- _engine->_movements->previousActor = actor->collisionPos;
+ IVec3 &previousActor = _engine->_movements->previousActor;
+ previousActor = actor->collisionPos;
+ IVec3 &processActor = _engine->_movements->processActor;
if (actor->staticFlags.bIsSpriteActor) {
if (actor->strengthOfHit) {
actor->dynamicFlags.bIsHitting = 1;
}
- _engine->_movements->processActor = actor->pos;
+ processActor = actor->pos;
if (!actor->dynamicFlags.bIsFalling) {
if (actor->speed) {
@@ -486,26 +488,26 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
_engine->_movements->rotateActor(xAxisRotation, 0, actor->spriteActorRotation);
- _engine->_movements->processActor.y = actor->pos.y - _engine->_renderer->destPos.z;
+ processActor.y = actor->pos.y - _engine->_renderer->destPos.z;
_engine->_movements->rotateActor(0, _engine->_renderer->destPos.x, actor->angle);
- _engine->_movements->processActor.x = actor->pos.x + _engine->_renderer->destPos.x;
- _engine->_movements->processActor.z = actor->pos.z + _engine->_renderer->destPos.z;
+ processActor.x = actor->pos.x + _engine->_renderer->destPos.x;
+ processActor.z = actor->pos.z + _engine->_renderer->destPos.z;
_engine->_movements->setActorAngle(ANGLE_0, actor->speed, ANGLE_17, &actor->move);
if (actor->dynamicFlags.bIsSpriteMoving) {
if (actor->doorStatus) { // open door
- if (_engine->_movements->getDistance2D(_engine->_movements->processActor.x, _engine->_movements->processActor.z, actor->lastPos.x, actor->lastPos.z) >= actor->doorStatus) {
+ if (_engine->_movements->getDistance2D(processActor.x, processActor.z, actor->lastPos.x, actor->lastPos.z) >= actor->doorStatus) {
if (actor->angle == ANGLE_0) {
- _engine->_movements->processActor.z = actor->lastPos.z + actor->doorStatus;
+ processActor.z = actor->lastPos.z + actor->doorStatus;
} else if (actor->angle == ANGLE_90) {
- _engine->_movements->processActor.x = actor->lastPos.x + actor->doorStatus;
+ processActor.x = actor->lastPos.x + actor->doorStatus;
} else if (actor->angle == ANGLE_180) {
- _engine->_movements->processActor.z = actor->lastPos.z - actor->doorStatus;
+ processActor.z = actor->lastPos.z - actor->doorStatus;
} else if (actor->angle == ANGLE_270) {
- _engine->_movements->processActor.x = actor->lastPos.x - actor->doorStatus;
+ processActor.x = actor->lastPos.x - actor->doorStatus;
}
actor->dynamicFlags.bIsSpriteMoving = 0;
@@ -515,25 +517,25 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
bool updatePos = false;
if (actor->angle == ANGLE_0) {
- if (_engine->_movements->processActor.z <= actor->lastPos.z) {
+ if (processActor.z <= actor->lastPos.z) {
updatePos = true;
}
} else if (actor->angle == ANGLE_90) {
- if (_engine->_movements->processActor.x <= actor->lastPos.x) {
+ if (processActor.x <= actor->lastPos.x) {
updatePos = true;
}
} else if (actor->angle == ANGLE_180) {
- if (_engine->_movements->processActor.z >= actor->lastPos.z) {
+ if (processActor.z >= actor->lastPos.z) {
updatePos = true;
}
} else if (actor->angle == ANGLE_270) {
- if (_engine->_movements->processActor.x >= actor->lastPos.x) {
+ if (processActor.x >= actor->lastPos.x) {
updatePos = true;
}
}
if (updatePos) {
- _engine->_movements->processActor = actor->lastPos;
+ processActor = actor->lastPos;
actor->dynamicFlags.bIsSpriteMoving = 0;
actor->speed = 0;
@@ -543,11 +545,11 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
}
if (actor->staticFlags.bCanBePushed) {
- _engine->_movements->processActor += actor->lastPos;
+ processActor += actor->lastPos;
if (actor->staticFlags.bUseMiniZv) {
- _engine->_movements->processActor.x = ((_engine->_movements->processActor.x / 128) * 128);
- _engine->_movements->processActor.z = ((_engine->_movements->processActor.z / 128) * 128);
+ processActor.x = ((processActor.x / 128) * 128);
+ processActor.z = ((processActor.z / 128) * 128);
}
actor->lastPos.x = 0;
@@ -578,7 +580,7 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
currentStep.x = _engine->_renderer->destPos.x;
currentStep.z = _engine->_renderer->destPos.z;
- _engine->_movements->processActor = actor->pos + currentStep - actor->lastPos;
+ processActor = actor->pos + currentStep - actor->lastPos;
actor->lastPos = currentStep;
@@ -630,8 +632,8 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
// actor standing on another actor
if (actor->standOn != -1) {
const ActorStruct *standOnActor = _engine->_scene->getActor(actor->standOn);
- _engine->_movements->processActor -= standOnActor->collisionPos;
- _engine->_movements->processActor += standOnActor->pos;
+ processActor -= standOnActor->collisionPos;
+ processActor += standOnActor->pos;
if (!_engine->_collision->standingOnActor(actorIdx, actor->standOn)) {
actor->standOn = -1; // no longer standing on other actor
@@ -640,16 +642,15 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
// actor falling Y speed
if (actor->dynamicFlags.bIsFalling) {
- _engine->_movements->processActor.x = _engine->_movements->previousActor.x;
- _engine->_movements->processActor.y = _engine->_movements->previousActor.y + _engine->loopActorStep; // add step to fall
- _engine->_movements->processActor.z = _engine->_movements->previousActor.z;
+ processActor = previousActor;
+ processActor.y += _engine->loopActorStep; // add step to fall
}
// actor collisions with bricks
if (actor->staticFlags.bComputeCollisionWithBricks) {
_engine->_collision->collision.y = 0;
- ShapeType brickShape = _engine->_grid->getBrickShape(_engine->_movements->previousActor);
+ ShapeType brickShape = _engine->_grid->getBrickShape(previousActor);
if (brickShape != ShapeType::kNone) {
if (brickShape != ShapeType::kSolid) {
@@ -669,7 +670,7 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
_engine->_collision->causeActorDamage = 0;
- _engine->_collision->processCollision = _engine->_movements->processActor;
+ _engine->_collision->processCollision = processActor;
if (IS_HERO(actorIdx) && !actor->staticFlags.bComputeLowCollision) {
// check hero collisions with bricks
@@ -689,11 +690,11 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
if (_engine->_collision->causeActorDamage && !actor->dynamicFlags.bIsFalling && !currentlyProcessedActorIdx && _engine->_actor->heroBehaviour == HeroBehaviourType::kAthletic && actor->anim == AnimationTypes::kForward) {
_engine->_movements->rotateActor(actor->boudingBox.mins.x, actor->boudingBox.mins.z, actor->angle + ANGLE_360 + ANGLE_135);
- _engine->_renderer->destPos.x += _engine->_movements->processActor.x;
- _engine->_renderer->destPos.z += _engine->_movements->processActor.z;
+ _engine->_renderer->destPos.x += processActor.x;
+ _engine->_renderer->destPos.z += processActor.z;
if (_engine->_renderer->destPos.x >= 0 && _engine->_renderer->destPos.z >= 0 && _engine->_renderer->destPos.x <= 0x7E00 && _engine->_renderer->destPos.z <= 0x7E00) {
- if (_engine->_grid->getBrickShape(_engine->_renderer->destPos.x, _engine->_movements->processActor.y + BRICK_HEIGHT, _engine->_renderer->destPos.z) != ShapeType::kNone && _engine->cfgfile.WallCollision) { // avoid wall hit damage
+ if (_engine->_grid->getBrickShape(_engine->_renderer->destPos.x, processActor.y + BRICK_HEIGHT, _engine->_renderer->destPos.z) != ShapeType::kNone && _engine->cfgfile.WallCollision) { // avoid wall hit damage
_engine->_extra->addExtraSpecial(actor->pos.x, actor->pos.y + 1000, actor->pos.z, ExtraSpecialType::kHitStars);
initAnim(AnimationTypes::kBigHit, AnimType::kAnimationType_2, AnimationTypes::kStanding, currentlyProcessedActorIdx);
@@ -706,14 +707,14 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
}
}
- brickShape = _engine->_grid->getBrickShape(_engine->_movements->processActor);
+ brickShape = _engine->_grid->getBrickShape(processActor);
actor->setBrickShape(brickShape);
if (brickShape != ShapeType::kNone) {
if (brickShape == ShapeType::kSolid) {
if (actor->dynamicFlags.bIsFalling) {
_engine->_collision->stopFalling();
- _engine->_movements->processActor.y = (_engine->_collision->collision.y * BRICK_HEIGHT) + BRICK_HEIGHT;
+ processActor.y = (_engine->_collision->collision.y * BRICK_HEIGHT) + BRICK_HEIGHT;
} else {
if (IS_HERO(actorIdx) && _engine->_actor->heroBehaviour == HeroBehaviourType::kAthletic && actor->anim == AnimationTypes::kForward && _engine->cfgfile.WallCollision) { // avoid wall hit damage
_engine->_extra->addExtraSpecial(actor->pos.x, actor->pos.y + 1000, actor->pos.z, ExtraSpecialType::kHitStars);
@@ -723,18 +724,18 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
}
// no Z coordinate issue
- if (_engine->_grid->getBrickShape(_engine->_movements->processActor.x, _engine->_movements->processActor.y, _engine->_movements->previousActor.z) == ShapeType::kNone) {
- _engine->_movements->processActor.z = _engine->_movements->previousActor.z;
+ if (_engine->_grid->getBrickShape(processActor.x, processActor.y, previousActor.z) == ShapeType::kNone) {
+ processActor.z = previousActor.z;
}
// no X coordinate issue
- if (_engine->_grid->getBrickShape(_engine->_movements->previousActor.x, _engine->_movements->processActor.y, _engine->_movements->processActor.z) == ShapeType::kNone) {
- _engine->_movements->processActor.x = _engine->_movements->previousActor.x;
+ if (_engine->_grid->getBrickShape(previousActor.x, processActor.y, processActor.z) == ShapeType::kNone) {
+ processActor.x = previousActor.x;
}
// X and Z with issue, no move
- if (_engine->_grid->getBrickShape(_engine->_movements->processActor.x, _engine->_movements->processActor.y, _engine->_movements->previousActor.z) != ShapeType::kNone &&
- _engine->_grid->getBrickShape(_engine->_movements->previousActor.x, _engine->_movements->processActor.y, _engine->_movements->processActor.z) != ShapeType::kNone) {
+ if (_engine->_grid->getBrickShape(processActor.x, processActor.y, previousActor.z) != ShapeType::kNone &&
+ _engine->_grid->getBrickShape(previousActor.x, processActor.y, processActor.z) != ShapeType::kNone) {
return;
}
}
@@ -749,7 +750,7 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
actor->dynamicFlags.bIsFalling = 0;
} else {
if (actor->staticFlags.bCanFall && actor->standOn == -1) {
- brickShape = _engine->_grid->getBrickShape(_engine->_movements->processActor.x, _engine->_movements->processActor.y - 1, _engine->_movements->processActor.z);
+ brickShape = _engine->_grid->getBrickShape(processActor.x, processActor.y - 1, processActor.z);
if (brickShape != ShapeType::kNone) {
if (actor->dynamicFlags.bIsFalling) {
@@ -762,7 +763,7 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
actor->dynamicFlags.bIsFalling = 1;
if (IS_HERO(actorIdx) && _engine->_scene->heroYBeforeFall == 0) {
- _engine->_scene->heroYBeforeFall = _engine->_movements->processActor.y;
+ _engine->_scene->heroYBeforeFall = processActor.y;
}
initAnim(AnimationTypes::kFall, AnimType::kAnimationTypeLoop, AnimationTypes::kAnimInvalid, actorIdx);
@@ -786,27 +787,27 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
}
// check and fix actor bounding position
- if (_engine->_movements->processActor.x < 0) {
- _engine->_movements->processActor.x = 0;
+ if (processActor.x < 0) {
+ processActor.x = 0;
}
- if (_engine->_movements->processActor.y < 0) {
- _engine->_movements->processActor.y = 0;
+ if (processActor.y < 0) {
+ processActor.y = 0;
}
- if (_engine->_movements->processActor.z < 0) {
- _engine->_movements->processActor.z = 0;
+ if (processActor.z < 0) {
+ processActor.z = 0;
}
- if (_engine->_movements->processActor.x > 0x7E00) { // SCENE_SIZE_MAX
- _engine->_movements->processActor.x = 0x7E00;
+ if (processActor.x > 0x7E00) { // SCENE_SIZE_MAX
+ processActor.x = 0x7E00;
}
- if (_engine->_movements->processActor.z > 0x7E00) { // SCENE_SIZE_MAX
- _engine->_movements->processActor.z = 0x7E00;
+ if (processActor.z > 0x7E00) { // SCENE_SIZE_MAX
+ processActor.z = 0x7E00;
}
- actor->pos = _engine->_movements->processActor;
+ actor->pos = processActor;
}
} // namespace TwinE
diff --git a/engines/twine/scene/collision.cpp b/engines/twine/scene/collision.cpp
index b6e2f7c823..996f12c2cc 100644
--- a/engines/twine/scene/collision.cpp
+++ b/engines/twine/scene/collision.cpp
@@ -196,6 +196,7 @@ int32 Collision::checkCollisionWithActors(int32 actorIdx) {
ActorStruct *actor = _engine->_scene->getActor(actorIdx);
IVec3 &processActor = _engine->_movements->processActor;
+ IVec3 &previousActor = _engine->_movements->previousActor;
IVec3 mins = processActor + actor->boudingBox.mins;
IVec3 maxs = processActor + actor->boudingBox.maxs;
@@ -261,7 +262,7 @@ int32 Collision::checkCollisionWithActors(int32 actorIdx) {
}
} else {
if (!actor->dynamicFlags.bIsFalling) {
- processActor = _engine->_movements->previousActor;
+ processActor = previousActor;
}
}
}
@@ -311,7 +312,7 @@ int32 Collision::checkCollisionWithActors(int32 actorIdx) {
}
} else {
if (!actor->dynamicFlags.bIsFalling) {
- processActor = _engine->_movements->previousActor;
+ processActor = previousActor;
}
}
}
diff --git a/engines/twine/scene/extra.cpp b/engines/twine/scene/extra.cpp
index 91e379d24b..2d2fd6c9d1 100644
--- a/engines/twine/scene/extra.cpp
+++ b/engines/twine/scene/extra.cpp
@@ -400,37 +400,37 @@ void Extra::addExtraThrowMagicball(int32 x, int32 y, int32 z, int32 xAngle, int3
}
}
-void Extra::drawSpecialShape(const ExtraShape &shapeTable, int32 x, int32 y, int32 color, int32 angle, int32 size) {
+void Extra::drawSpecialShape(const ExtraShape &shapeTable, int32 x, int32 y, int32 color, int32 angle, int32 size, Common::Rect &renderRect) {
int shapeDataIndex = 0;
int16 shapeX = shapeTable.data[shapeDataIndex].x * size / 16;
int16 shapeZ = shapeTable.data[shapeDataIndex].z * size / 16;
++shapeDataIndex;
- _engine->_redraw->renderRect.left = 0x7D00;
- _engine->_redraw->renderRect.right = -0x7D00;
- _engine->_redraw->renderRect.top = 0x7D00;
- _engine->_redraw->renderRect.bottom = -0x7D00;
+ renderRect.left = 0x7D00;
+ renderRect.right = -0x7D00;
+ renderRect.top = 0x7D00;
+ renderRect.bottom = -0x7D00;
_engine->_movements->rotateActor(shapeX, shapeZ, angle);
const int32 computedX = _engine->_renderer->destPos.x + x;
const int32 computedY = _engine->_renderer->destPos.z + y;
- if (computedX < _engine->_redraw->renderRect.left) {
- _engine->_redraw->renderRect.left = computedX;
+ if (computedX < renderRect.left) {
+ renderRect.left = computedX;
}
- if (computedX > _engine->_redraw->renderRect.right) {
- _engine->_redraw->renderRect.right = computedX;
+ if (computedX > renderRect.right) {
+ renderRect.right = computedX;
}
- if (computedY < _engine->_redraw->renderRect.top) {
- _engine->_redraw->renderRect.top = computedY;
+ if (computedY < renderRect.top) {
+ renderRect.top = computedY;
}
- if (computedY > _engine->_redraw->renderRect.bottom) {
- _engine->_redraw->renderRect.bottom = computedY;
+ if (computedY > renderRect.bottom) {
+ renderRect.bottom = computedY;
}
int32 currentX = computedX;
@@ -452,20 +452,20 @@ void Extra::drawSpecialShape(const ExtraShape &shapeTable, int32 x, int32 y, int
currentX = _engine->_renderer->destPos.x + x;
currentY = _engine->_renderer->destPos.z + y;
- if (currentX < _engine->_redraw->renderRect.left) {
- _engine->_redraw->renderRect.left = currentX;
+ if (currentX < renderRect.left) {
+ renderRect.left = currentX;
}
- if (currentX > _engine->_redraw->renderRect.right) {
- _engine->_redraw->renderRect.right = currentX;
+ if (currentX > renderRect.right) {
+ renderRect.right = currentX;
}
- if (currentY < _engine->_redraw->renderRect.top) {
- _engine->_redraw->renderRect.top = currentY;
+ if (currentY < renderRect.top) {
+ renderRect.top = currentY;
}
- if (currentY > _engine->_redraw->renderRect.bottom) {
- _engine->_redraw->renderRect.bottom = currentY;
+ if (currentY > renderRect.bottom) {
+ renderRect.bottom = currentY;
}
_engine->_renderer->projPos.x = currentX;
@@ -482,13 +482,13 @@ void Extra::drawSpecialShape(const ExtraShape &shapeTable, int32 x, int32 y, int
_engine->_interface->drawLine(currentX, currentY, computedX, computedY, color);
}
-void Extra::drawExtraSpecial(int32 extraIdx, int32 x, int32 y) {
+void Extra::drawExtraSpecial(int32 extraIdx, int32 x, int32 y, Common::Rect &renderRect) {
ExtraListStruct *extra = &extraList[extraIdx];
ExtraSpecialType specialType = (ExtraSpecialType)(extra->info0 & (EXTRA_SPECIAL_MASK - 1));
switch (specialType) {
case ExtraSpecialType::kHitStars:
- drawSpecialShape(hitStarsShape, x, y, COLOR_WHITE, (_engine->lbaTime * 32) & ANGLE_270, 4);
+ drawSpecialShape(hitStarsShape, x, y, COLOR_WHITE, (_engine->lbaTime * 32) & ANGLE_270, 4, renderRect);
break;
case ExtraSpecialType::kExplodeCloud: {
int32 cloudTime = 1 + _engine->lbaTime - extra->spawnTime;
@@ -497,7 +497,7 @@ void Extra::drawExtraSpecial(int32 extraIdx, int32 x, int32 y) {
cloudTime = 32;
}
- drawSpecialShape(explodeCloudShape, x, y, COLOR_WHITE, ANGLE_0, cloudTime);
+ drawSpecialShape(explodeCloudShape, x, y, COLOR_WHITE, ANGLE_0, cloudTime, renderRect);
break;
}
}
diff --git a/engines/twine/scene/extra.h b/engines/twine/scene/extra.h
index 3dad9f9101..0eec559778 100644
--- a/engines/twine/scene/extra.h
+++ b/engines/twine/scene/extra.h
@@ -92,7 +92,7 @@ private:
void processMagicballBounce(ExtraListStruct *extra, int32 x, int32 y, int32 z);
int32 findExtraKey() const;
int32 addExtraAimingAtKey(int32 actorIdx, int32 x, int32 y, int32 z, int32 spriteIdx, int32 extraIdx);
- void drawSpecialShape(const ExtraShape &shapeTable, int32 x, int32 y, int32 color, int32 angle, int32 size);
+ void drawSpecialShape(const ExtraShape &shapeTable, int32 x, int32 y, int32 color, int32 angle, int32 size, Common::Rect &renderRect);
public:
Extra(TwinEEngine *engine);
@@ -117,7 +117,7 @@ public:
int32 addExtraAiming(int32 actorIdx, int32 x, int32 y, int32 z, int32 spriteIdx, int32 targetActorIdx, int32 finalAngle, int32 strengthOfHit);
void addExtraThrowMagicball(int32 x, int32 y, int32 z, int32 xAngle, int32 yAngle, int32 xRotPoint, int32 extraAngle);
- void drawExtraSpecial(int32 extraIdx, int32 x, int32 y);
+ void drawExtraSpecial(int32 extraIdx, int32 x, int32 y, Common::Rect &renderRect);
int getBonusSprite(BonusParameter bonusParameter) const;
diff --git a/engines/twine/scene/gamestate.cpp b/engines/twine/scene/gamestate.cpp
index e75183b68f..89233bb838 100644
--- a/engines/twine/scene/gamestate.cpp
+++ b/engines/twine/scene/gamestate.cpp
@@ -318,8 +318,9 @@ void GameState::processFoundItem(InventoryItems item) {
const int32 bodyX = _engine->_scene->sceneHero->pos.x - itemCameraX;
const int32 bodyY = _engine->_scene->sceneHero->pos.y - itemCameraY;
const int32 bodyZ = _engine->_scene->sceneHero->pos.z - itemCameraZ;
- _engine->_renderer->renderIsoModel(bodyX, bodyY, bodyZ, ANGLE_0, ANGLE_45, ANGLE_0, bodyData);
- _engine->_interface->setClip(_engine->_redraw->renderRect);
+ Common::Rect modelRect;
+ _engine->_renderer->renderIsoModel(bodyX, bodyY, bodyZ, ANGLE_0, ANGLE_45, ANGLE_0, bodyData, modelRect);
+ _engine->_interface->setClip(modelRect);
const int32 itemX = (_engine->_scene->sceneHero->pos.x + BRICK_HEIGHT) / BRICK_SIZE;
int32 itemY = _engine->_scene->sceneHero->pos.y / BRICK_HEIGHT;
@@ -389,10 +390,10 @@ void GameState::processFoundItem(InventoryItems item) {
}
}
- _engine->_renderer->renderIsoModel(bodyX, bodyY, bodyZ, ANGLE_0, ANGLE_45, ANGLE_0, bodyData);
- _engine->_interface->setClip(_engine->_redraw->renderRect);
+ _engine->_renderer->renderIsoModel(bodyX, bodyY, bodyZ, ANGLE_0, ANGLE_45, ANGLE_0, bodyData, modelRect);
+ _engine->_interface->setClip(modelRect);
_engine->_grid->drawOverModelActor(itemX, itemY, itemZ);
- _engine->_redraw->addRedrawArea(_engine->_redraw->renderRect);
+ _engine->_redraw->addRedrawArea(modelRect);
if (textState == ProgressiveTextState::ContinueRunning) {
_engine->_interface->resetClip();
@@ -495,6 +496,7 @@ void GameState::processGameoverAnimation() {
const Common::Rect &rect = _engine->centerOnScreen(_engine->width() / 2, _engine->height() / 2);
_engine->_interface->setClip(rect);
+ Common::Rect dummy;
while (!_engine->_input->toggleAbortAction() && (_engine->lbaTime - startLbaTime) <= 500) {
FrameMarker frame(_engine, 66);
_engine->readKeys();
@@ -507,7 +509,7 @@ void GameState::processGameoverAnimation() {
_engine->blitWorkToFront(rect);
_engine->_renderer->setCameraAngle(0, 0, 0, 0, -cdot, 0, avg);
- _engine->_renderer->renderIsoModel(0, 0, 0, ANGLE_0, ANGLE_0, ANGLE_0, gameOverPtr);
+ _engine->_renderer->renderIsoModel(0, 0, 0, ANGLE_0, ANGLE_0, ANGLE_0, gameOverPtr, dummy);
_engine->copyBlockPhys(rect);
_engine->lbaTime++;
@@ -516,7 +518,7 @@ void GameState::processGameoverAnimation() {
_engine->_sound->playSample(Samples::Explode);
_engine->blitWorkToFront(rect);
_engine->_renderer->setCameraAngle(0, 0, 0, 0, 0, 0, 3200);
- _engine->_renderer->renderIsoModel(0, 0, 0, ANGLE_0, ANGLE_0, ANGLE_0, gameOverPtr);
+ _engine->_renderer->renderIsoModel(0, 0, 0, ANGLE_0, ANGLE_0, ANGLE_0, gameOverPtr, dummy);
_engine->copyBlockPhys(rect);
_engine->delaySkip(2000);
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 611b6b34ec..8369f2d126 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -532,7 +532,6 @@ void TwinEEngine::initAll() {
_scene->sceneHero = _scene->getActor(OWN_ACTOR_SCENE_INDEX);
- _redraw->renderRect = rect();
// Set clip to fullscreen by default, allows main menu to render properly after load
_interface->resetClip();
More information about the Scummvm-git-logs
mailing list