[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