[Scummvm-git-logs] scummvm master -> aea7c3ff1ac9ccea6315eafaa1f235d883012591

mgerhardy martin.gerhardy at gmail.com
Tue Aug 10 19:22:16 UTC 2021


This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
f78b93cb56 TWINE: use IVec3 class copy
2693ad0332 TWINE: let projectPositionOnScreen return the position vector
aa073eb5a1 TWINE: use isValidRect()
aea7c3ff1a TWINE: fixed cliprect handling for extras


Commit: f78b93cb56774fc97cb5548a17e371469371c0d7
    https://github.com/scummvm/scummvm/commit/f78b93cb56774fc97cb5548a17e371469371c0d7
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T21:21:57+02:00

Commit Message:
TWINE: use IVec3 class copy

Changed paths:
    engines/twine/debugger/debug_scene.cpp


diff --git a/engines/twine/debugger/debug_scene.cpp b/engines/twine/debugger/debug_scene.cpp
index 9b0175d909..b7d5f9eafa 100644
--- a/engines/twine/debugger/debug_scene.cpp
+++ b/engines/twine/debugger/debug_scene.cpp
@@ -42,11 +42,9 @@ void DebugScene::drawClip(const Common::Rect &rect) {
 }
 
 void DebugScene::projectBoundingBoxPoints(IVec3 *pPoint3d, IVec3 *pPoint3dProjected) {
-	_engine->_renderer->projectPositionOnScreen(pPoint3d->x, pPoint3d->y, pPoint3d->z);
+	_engine->_renderer->projectPositionOnScreen(*pPoint3d);
 
-	pPoint3dProjected->x = _engine->_renderer->_projPos.x;
-	pPoint3dProjected->y = _engine->_renderer->_projPos.y;
-	pPoint3dProjected->z = _engine->_renderer->_projPos.z;
+	*pPoint3dProjected = _engine->_renderer->_projPos;
 }
 
 bool DebugScene::checkZoneType(ZoneType type) const {


Commit: 2693ad0332c74db74702403dfb61f276517f2089
    https://github.com/scummvm/scummvm/commit/2693ad0332c74db74702403dfb61f276517f2089
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T21:21:57+02:00

Commit Message:
TWINE: let projectPositionOnScreen return the position vector

... to reduce direct access to the member

Changed paths:
    engines/twine/debugger/debug_scene.cpp
    engines/twine/renderer/redraw.cpp
    engines/twine/renderer/redraw.h
    engines/twine/renderer/renderer.cpp
    engines/twine/renderer/renderer.h
    engines/twine/scene/collision.cpp
    engines/twine/scene/collision.h
    engines/twine/scene/extra.cpp
    engines/twine/scene/gamestate.cpp
    engines/twine/scene/grid.cpp
    engines/twine/shared.h


diff --git a/engines/twine/debugger/debug_scene.cpp b/engines/twine/debugger/debug_scene.cpp
index b7d5f9eafa..5cfb04e349 100644
--- a/engines/twine/debugger/debug_scene.cpp
+++ b/engines/twine/debugger/debug_scene.cpp
@@ -42,9 +42,7 @@ void DebugScene::drawClip(const Common::Rect &rect) {
 }
 
 void DebugScene::projectBoundingBoxPoints(IVec3 *pPoint3d, IVec3 *pPoint3dProjected) {
-	_engine->_renderer->projectPositionOnScreen(*pPoint3d);
-
-	*pPoint3dProjected = _engine->_renderer->_projPos;
+	*pPoint3dProjected = _engine->_renderer->projectPositionOnScreen(*pPoint3d);
 }
 
 bool DebugScene::checkZoneType(ZoneType type) const {
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index a3a894959b..0466f2e314 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -42,6 +42,7 @@
 #include "twine/scene/grid.h"
 #include "twine/scene/movements.h"
 #include "twine/scene/scene.h"
+#include "twine/shared.h"
 #include "twine/text.h"
 
 namespace TwinE {
@@ -194,10 +195,10 @@ int32 Redraw::fillActorDrawingList(DrawListStruct *drawList, bool bgRedraw) {
 		// no redraw required
 		if (actor->_staticFlags.bIsBackgrounded && !bgRedraw) {
 			// get actor position on screen
-			_engine->_renderer->projectPositionOnScreen(actor->pos() - _engine->_grid->_camera);
+			const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(actor->pos() - _engine->_grid->_camera);
 
 			// check if actor is visible on screen, otherwise don't display it
-			if (_engine->_renderer->_projPos.x > -50 && _engine->_renderer->_projPos.x < _engine->width() + 40 && _engine->_renderer->_projPos.y > -30 && _engine->_renderer->_projPos.y < _engine->height() + 100) {
+			if (projPos.x > -50 && projPos.x < _engine->width() + 40 && projPos.y > -30 && projPos.y < _engine->height() + 100) {
 				actor->_dynamicFlags.bIsVisible = 1;
 			}
 			continue;
@@ -207,10 +208,10 @@ int32 Redraw::fillActorDrawingList(DrawListStruct *drawList, bool bgRedraw) {
 			continue;
 		}
 		// get actor position on screen
-		_engine->_renderer->projectPositionOnScreen(actor->pos() - _engine->_grid->_camera);
+		const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(actor->pos() - _engine->_grid->_camera);
 
-		if ((actor->_staticFlags.bUsesClipping && _engine->_renderer->_projPos.x > -112 && _engine->_renderer->_projPos.x < _engine->width() + 112 && _engine->_renderer->_projPos.y > -50 && _engine->_renderer->_projPos.y < _engine->height() + 171) ||
-		    ((!actor->_staticFlags.bUsesClipping) && _engine->_renderer->_projPos.x > -50 && _engine->_renderer->_projPos.x < _engine->width() + 40 && _engine->_renderer->_projPos.y > -30 && _engine->_renderer->_projPos.y < _engine->height() + 100)) {
+		if ((actor->_staticFlags.bUsesClipping && projPos.x > -112 && projPos.x < _engine->width() + 112 && projPos.y > -50 && projPos.y < _engine->height() + 171) ||
+		    ((!actor->_staticFlags.bUsesClipping) && projPos.x > -50 && projPos.x < _engine->width() + 40 && projPos.y > -30 && projPos.y < _engine->height() + 100)) {
 
 			int32 tmpVal = actor->_pos.z + actor->_pos.x - _engine->_grid->_camera.x - _engine->_grid->_camera.z;
 
@@ -255,8 +256,8 @@ int32 Redraw::fillActorDrawingList(DrawListStruct *drawList, bool bgRedraw) {
 				drawListPos++;
 			}
 			if (_inSceneryView && a == _engine->_scene->_currentlyFollowedActor) {
-				_sceneryViewX = _engine->_renderer->_projPos.x;
-				_sceneryViewY = _engine->_renderer->_projPos.y;
+				_sceneryViewX = projPos.x;
+				_sceneryViewY = projPos.y;
 			}
 		}
 	}
@@ -278,9 +279,9 @@ int32 Redraw::fillExtraDrawingList(DrawListStruct *drawList, int32 drawListPos)
 			continue;
 		}
 		if ((extra->type & ExtraType::TIME_OUT) || (extra->type & ExtraType::FLASH) || (extra->payload.lifeTime + extra->spawnTime - 150 < _engine->_lbaTime) || (!((_engine->_lbaTime + extra->spawnTime) & 8))) {
-			_engine->_renderer->projectPositionOnScreen(extra->pos - _engine->_grid->_camera);
+			const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(extra->pos - _engine->_grid->_camera);
 
-			if (_engine->_renderer->_projPos.x > -50 && _engine->_renderer->_projPos.x < _engine->width() + 40 && _engine->_renderer->_projPos.y > -30 && _engine->_renderer->_projPos.y < _engine->height() + 100) {
+			if (projPos.x > -50 && projPos.x < _engine->width() + 40 && projPos.y > -30 && projPos.y < _engine->height() + 100) {
 				const int16 tmpVal = extra->pos.x - _engine->_grid->_camera.x + extra->pos.z - _engine->_grid->_camera.z;
 				drawList[drawListPos].posValue = tmpVal;
 				drawList[drawListPos].actorIdx = i;
@@ -307,17 +308,17 @@ int32 Redraw::fillExtraDrawingList(DrawListStruct *drawList, int32 drawListPos)
 
 void Redraw::processDrawListShadows(const DrawListStruct &drawCmd) {
 	// get actor position on screen
-	_engine->_renderer->projectPositionOnScreen(drawCmd.x - _engine->_grid->_camera.x, drawCmd.y - _engine->_grid->_camera.y, drawCmd.z - _engine->_grid->_camera.z);
+	const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(drawCmd.x - _engine->_grid->_camera.x, drawCmd.y - _engine->_grid->_camera.y, drawCmd.z - _engine->_grid->_camera.z);
 
 	int32 spriteWidth = _engine->_resources->_spriteShadowPtr.surface(drawCmd.offset).w;
 	int32 spriteHeight = _engine->_resources->_spriteShadowPtr.surface(drawCmd.offset).h;
 
 	// calculate sprite size and position on screen
 	Common::Rect renderRect;
-	renderRect.left = _engine->_renderer->_projPos.x - (spriteWidth / 2);
-	renderRect.top = _engine->_renderer->_projPos.y - (spriteHeight / 2);
-	renderRect.right = _engine->_renderer->_projPos.x + (spriteWidth / 2);
-	renderRect.bottom = _engine->_renderer->_projPos.y + (spriteHeight / 2);
+	renderRect.left = projPos.x - (spriteWidth / 2);
+	renderRect.top = projPos.y - (spriteHeight / 2);
+	renderRect.right = projPos.x + (spriteWidth / 2);
+	renderRect.bottom = projPos.y + (spriteHeight / 2);
 
 	_engine->_interface->setClip(renderRect);
 
@@ -382,7 +383,7 @@ void Redraw::processDrawListActorSprites(const DrawListStruct &drawCmd, bool bgR
 	const uint8 *spritePtr = _engine->_resources->_spriteTable[actor->_entity];
 
 	// get actor position on screen
-	_engine->_renderer->projectPositionOnScreen(actor->pos() - _engine->_grid->_camera);
+	const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(actor->pos() - _engine->_grid->_camera);
 
 	const int32 spriteWidth = spriteData.surface().w;
 	const int32 spriteHeight = spriteData.surface().h;
@@ -390,8 +391,8 @@ 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.left = projPos.x + dim->x;
+	renderRect.top = projPos.y + dim->y;
 	renderRect.right = renderRect.left + spriteWidth;
 	renderRect.bottom = renderRect.top + spriteHeight;
 
@@ -437,11 +438,11 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
 	int32 extraIdx = drawCmd.actorIdx;
 	ExtraListStruct *extra = &_engine->_extra->_extraList[extraIdx];
 
-	_engine->_renderer->projectPositionOnScreen(extra->pos - _engine->_grid->_camera);
+	const IVec3 &projPos = _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, renderRect);
+		_engine->_extra->drawExtraSpecial(extraIdx, projPos.x, projPos.y, renderRect);
 	} else {
 		const SpriteData &spritePtr = _engine->_resources->_spriteData[extra->info0];
 		const int32 spriteWidth = spritePtr.surface().w;
@@ -449,8 +450,8 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
 
 		// calculate sprite position on screen
 		const SpriteDim *dim = _engine->_resources->_spriteBoundingBox.dim(extra->info0);
-		renderRect.left = _engine->_renderer->_projPos.x + dim->x;
-		renderRect.top = _engine->_renderer->_projPos.y + dim->y;
+		renderRect.left = projPos.x + dim->x;
+		renderRect.top = projPos.y + dim->y;
 		renderRect.right = renderRect.left + spriteWidth;
 		renderRect.bottom = renderRect.top + spriteHeight;
 
@@ -519,10 +520,10 @@ void Redraw::renderOverlays() {
 			case OverlayPosType::koFollowActor: {
 				ActorStruct *actor2 = _engine->_scene->getActor(overlay->info1);
 
-				_engine->_renderer->projectPositionOnScreen(actor2->_pos.x - _engine->_grid->_camera.x, actor2->_pos.y + actor2->_boudingBox.maxs.y - _engine->_grid->_camera.y, actor2->_pos.z - _engine->_grid->_camera.z);
+				const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(actor2->_pos.x - _engine->_grid->_camera.x, actor2->_pos.y + actor2->_boudingBox.maxs.y - _engine->_grid->_camera.y, actor2->_pos.z - _engine->_grid->_camera.z);
 
-				overlay->x = _engine->_renderer->_projPos.x;
-				overlay->y = _engine->_renderer->_projPos.y;
+				overlay->x = projPos.x;
+				overlay->y = projPos.y;
 
 				if (_engine->_lbaTime >= overlay->lifeTime) {
 					overlay->info0 = -1;
@@ -653,9 +654,11 @@ void Redraw::redrawEngineActions(bool bgRedraw) {
 			_engine->_screens->fadeOut(_engine->_screens->_paletteRGBA);
 		}
 		_engine->_screens->clearScreen();
+
 		_engine->_grid->redrawGrid();
-		_projPosScreen.x = _engine->_renderer->_projPos.x;
-		_projPosScreen.y = _engine->_renderer->_projPos.y;
+		const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(-_engine->_grid->_camera);
+		_projPosScreen.x = projPos.x;
+		_projPosScreen.y = projPos.y;
 
 		updateOverlayTypePosition(tmp_projPosX, tmp_projPosY, _projPosScreen.x, _projPosScreen.y);
 		_engine->saveFrontBuffer();
@@ -715,7 +718,7 @@ void Redraw::drawBubble(int32 actorIdx) {
 	ActorStruct *actor = _engine->_scene->getActor(actorIdx);
 
 	// get actor position on screen
-	_engine->_renderer->projectPositionOnScreen(actor->_pos.x - _engine->_grid->_camera.x, actor->_pos.y + actor->_boudingBox.maxs.y - _engine->_grid->_camera.y, actor->_pos.z - _engine->_grid->_camera.z);
+	const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(actor->_pos.x - _engine->_grid->_camera.x, actor->_pos.y + actor->_boudingBox.maxs.y - _engine->_grid->_camera.y, actor->_pos.z - _engine->_grid->_camera.z);
 
 	if (actorIdx != _bubbleActor) {
 		_bubbleSpriteIndex = _bubbleSpriteIndex ^ 1;
@@ -729,11 +732,11 @@ void Redraw::drawBubble(int32 actorIdx) {
 	// calculate sprite position on screen
 	Common::Rect renderRect;
 	if (_bubbleSpriteIndex == SPRITEHQR_DIAG_BUBBLE_RIGHT) {
-		renderRect.left = _engine->_renderer->_projPos.x + 10;
+		renderRect.left = projPos.x + 10;
 	} else {
-		renderRect.left = _engine->_renderer->_projPos.x - 10 - spriteWidth;
+		renderRect.left = projPos.x - 10 - spriteWidth;
 	}
-	renderRect.top = _engine->_renderer->_projPos.y - 20;
+	renderRect.top = projPos.y - 20;
 	renderRect.right = spriteWidth + renderRect.left - 1;
 	renderRect.bottom = spriteHeight + renderRect.top - 1;
 
diff --git a/engines/twine/renderer/redraw.h b/engines/twine/renderer/redraw.h
index 37a0bccfaf..80cfde09b9 100644
--- a/engines/twine/renderer/redraw.h
+++ b/engines/twine/renderer/redraw.h
@@ -56,13 +56,17 @@ struct OverlayListStruct {
 };
 
 struct DrawListStruct {
+	// DrawActorSprites, DrawShadows, DrawExtras
 	int16 posValue = 0; // sorting value
 	uint32 type = 0;
 	uint16 actorIdx = 0;
+
+	// DrawShadows
 	uint16 x = 0;
 	uint16 y = 0;
 	uint16 z = 0;
 	uint16 offset = 0;
+
 	uint16 field_C = 0;
 	uint16 field_E = 0;
 	uint16 field_10 = 0;
diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index e06979f743..c47b394c98 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -86,12 +86,12 @@ void Renderer::projectXYPositionOnScreen(int32 x, int32 y, int32 z) {
 	_projPos.y = 0;
 }
 
-int32 Renderer::projectPositionOnScreen(int32 cX, int32 cY, int32 cZ) {
+IVec3 &Renderer::projectPositionOnScreen(int32 cX, int32 cY, int32 cZ) {
 	if (_isUsingOrthoProjection) {
 		_projPos.x = ((cX - cZ) * 24) / BRICK_SIZE + _orthoProjPos.x;
 		_projPos.y = (((cX + cZ) * 12) - cY * 30) / BRICK_SIZE + _orthoProjPos.y;
 		_projPos.z = cZ - cY - cX;
-		return 1;
+		return _projPos;
 	}
 
 	cX -= _baseRotPos.x;
@@ -102,7 +102,7 @@ int32 Renderer::projectPositionOnScreen(int32 cX, int32 cY, int32 cZ) {
 		_projPos.x = 0;
 		_projPos.y = 0;
 		_projPos.z = 0;
-		return 0;
+		return _projPos;
 	}
 
 	int32 posZ = cZ + _cameraDepthOffset;
@@ -113,7 +113,7 @@ int32 Renderer::projectPositionOnScreen(int32 cX, int32 cY, int32 cZ) {
 	_projPos.x = (cX * _cameraScaleY) / posZ + _orthoProjPos.x;
 	_projPos.y = (-cY * _cameraScaleZ) / posZ + _orthoProjPos.y;
 	_projPos.z = posZ;
-	return -1;
+	return _projPos;
 }
 
 void Renderer::setCameraPosition(int32 x, int32 y, int32 depthOffset, int32 scaleY, int32 scaleZ) {
diff --git a/engines/twine/renderer/renderer.h b/engines/twine/renderer/renderer.h
index 05fba3d281..174360e673 100644
--- a/engines/twine/renderer/renderer.h
+++ b/engines/twine/renderer/renderer.h
@@ -227,11 +227,11 @@ public:
 
 	void renderPolygons(const CmdRenderPolygon &polygon, Vertex *vertices, int vtop, int vbottom);
 
-	inline int32 projectPositionOnScreen(const IVec3& pos) {
+	inline IVec3 &projectPositionOnScreen(const IVec3& pos) {
 		return projectPositionOnScreen(pos.x, pos.y, pos.z);
 	}
 
-	int32 projectPositionOnScreen(int32 cX, int32 cY, int32 cZ);
+	IVec3 &projectPositionOnScreen(int32 cX, int32 cY, int32 cZ);
 
 	inline void projectXYPositionOnScreen(const IVec3& pos) {
 		projectXYPositionOnScreen(pos.x, pos.y, pos.z);
diff --git a/engines/twine/scene/collision.cpp b/engines/twine/scene/collision.cpp
index 65c7479366..4338765d35 100644
--- a/engines/twine/scene/collision.cpp
+++ b/engines/twine/scene/collision.cpp
@@ -467,20 +467,20 @@ int32 Collision::checkExtraCollisionWithActors(ExtraListStruct *extra, int32 act
 	return -1;
 }
 
-bool Collision::checkExtraCollisionWithBricks(int32 x, int32 y, int32 z, int32 oldX, int32 oldY, int32 oldZ) {
-	if (_engine->_grid->getBrickShape(oldX, oldY, oldZ) != ShapeType::kNone) {
+bool Collision::checkExtraCollisionWithBricks(int32 x, int32 y, int32 z, const IVec3 &oldPos) {
+	if (_engine->_grid->getBrickShape(oldPos) != ShapeType::kNone) {
 		return true;
 	}
 
-	const int32 averageX = ABS(x + oldX) / 2;
-	const int32 averageY = ABS(y + oldY) / 2;
-	const int32 averageZ = ABS(z + oldZ) / 2;
+	const int32 averageX = ABS(x + oldPos.x) / 2;
+	const int32 averageY = ABS(y + oldPos.y) / 2;
+	const int32 averageZ = ABS(z + oldPos.z) / 2;
 
 	if (_engine->_grid->getBrickShape(averageX, averageY, averageZ) != ShapeType::kNone) {
 		return true;
 	}
 
-	if (_engine->_grid->getBrickShape(ABS(oldX + averageX) / 2, ABS(oldY + averageY) / 2, ABS(oldZ + averageZ) / 2) != ShapeType::kNone) {
+	if (_engine->_grid->getBrickShape(ABS(oldPos.x + averageX) / 2, ABS(oldPos.y + averageY) / 2, ABS(oldPos.z + averageZ) / 2) != ShapeType::kNone) {
 		return true;
 	}
 
diff --git a/engines/twine/scene/collision.h b/engines/twine/scene/collision.h
index 2c4df037e5..a8a9b6a105 100644
--- a/engines/twine/scene/collision.h
+++ b/engines/twine/scene/collision.h
@@ -95,7 +95,7 @@ public:
 	int32 checkExtraCollisionWithActors(ExtraListStruct *extra, int32 actorIdx);
 
 	/** Check extra collision with bricks */
-	bool checkExtraCollisionWithBricks(int32 x, int32 y, int32 z, int32 oldX, int32 oldY, int32 oldZ);
+	bool checkExtraCollisionWithBricks(int32 x, int32 y, int32 z, const IVec3 &oldPos);
 
 	/**
 	 * Check extra collision with another extra
diff --git a/engines/twine/scene/extra.cpp b/engines/twine/scene/extra.cpp
index 9cb04242d9..be7e60d5f3 100644
--- a/engines/twine/scene/extra.cpp
+++ b/engines/twine/scene/extra.cpp
@@ -662,8 +662,8 @@ void Extra::processExtras() {
 				_engine->_sound->playSample(Samples::ItemFound, 1, _engine->_scene->_sceneHero->pos(), OWN_ACTOR_SCENE_INDEX);
 
 				if (extraKey->info1 > 1) {
-					_engine->_renderer->projectPositionOnScreen(extraKey->pos - _engine->_grid->_camera);
-					_engine->_redraw->addOverlay(OverlayType::koNumber, extraKey->info1, _engine->_renderer->_projPos.x, _engine->_renderer->_projPos.y, COLOR_BLACK, OverlayPosType::koNormal, 2);
+					const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(extraKey->pos - _engine->_grid->_camera);
+					_engine->_redraw->addOverlay(OverlayType::koNumber, extraKey->info1, projPos.x, projPos.y, COLOR_BLACK, OverlayPosType::koNormal, 2);
 				}
 
 				_engine->_redraw->addOverlay(OverlayType::koSprite, SPRITEHQR_KEY, 10, 30, 0, OverlayPosType::koNormal, 2);
@@ -695,8 +695,8 @@ void Extra::processExtras() {
 				_engine->_sound->playSample(Samples::ItemFound, 1, _engine->_scene->_sceneHero->pos(), OWN_ACTOR_SCENE_INDEX);
 
 				if (extraKey->info1 > 1) {
-					_engine->_renderer->projectPositionOnScreen(extraKey->pos - _engine->_grid->_camera);
-					_engine->_redraw->addOverlay(OverlayType::koNumber, extraKey->info1, _engine->_renderer->_projPos.x, _engine->_renderer->_projPos.y, COLOR_BLACK, OverlayPosType::koNormal, 2);
+					const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(extraKey->pos - _engine->_grid->_camera);
+					_engine->_redraw->addOverlay(OverlayType::koNumber, extraKey->info1, projPos.x, projPos.y, COLOR_BLACK, OverlayPosType::koNormal, 2);
 				}
 
 				_engine->_redraw->addOverlay(OverlayType::koSprite, SPRITEHQR_KEY, 10, 30, 0, OverlayPosType::koNormal, 2);
@@ -748,7 +748,7 @@ void Extra::processExtras() {
 		if (extra->type & ExtraType::UNK3) {
 			bool process = false;
 
-			if (_engine->_collision->checkExtraCollisionWithBricks(currentExtraX, currentExtraY, currentExtraZ, extra->pos.x, extra->pos.y, extra->pos.z)) {
+			if (_engine->_collision->checkExtraCollisionWithBricks(currentExtraX, currentExtraY, currentExtraZ, extra->pos)) {
 				// if not touch the ground
 				if (!(extra->type & ExtraType::WAIT_NO_COL)) {
 					process = true;
@@ -815,7 +815,7 @@ void Extra::processExtras() {
 		if (extra->type & ExtraType::STOP_COL) {
 			bool process = false;
 
-			if (_engine->_collision->checkExtraCollisionWithBricks(currentExtraX, currentExtraY, currentExtraZ, extra->pos.x, extra->pos.y, extra->pos.z)) {
+			if (_engine->_collision->checkExtraCollisionWithBricks(currentExtraX, currentExtraY, currentExtraZ, extra->pos)) {
 				// if not touch the ground
 				if (!(extra->type & ExtraType::WAIT_NO_COL)) {
 					process = true;
@@ -840,10 +840,11 @@ void Extra::processExtras() {
 			if (_engine->_collision->checkExtraCollisionWithActors(extra, -1) == 0) {
 				_engine->_sound->playSample(Samples::ItemFound, 1, extra->pos);
 
+				const IVec3 &projPos = _engine->_renderer->_projPos;
 				if (extra->info1 > 1 && !_engine->_input->isActionActive(TwinEActionType::MoveBackward)) {
 					_engine->_renderer->projectPositionOnScreen(extra->pos - _engine->_grid->_camera);
 					const int16 fontColor = COLOR_158;
-					_engine->_redraw->addOverlay(OverlayType::koNumber, extra->info1, _engine->_renderer->_projPos.x, _engine->_renderer->_projPos.y, fontColor, OverlayPosType::koNormal, 2);
+					_engine->_redraw->addOverlay(OverlayType::koNumber, extra->info1, projPos.x, projPos.y, fontColor, OverlayPosType::koNormal, 2);
 				}
 
 				_engine->_redraw->addOverlay(OverlayType::koSprite, extra->info0, 10, 30, 0, OverlayPosType::koNormal, 2);
diff --git a/engines/twine/scene/gamestate.cpp b/engines/twine/scene/gamestate.cpp
index 4233413b2d..d6eb7dc7c4 100644
--- a/engines/twine/scene/gamestate.cpp
+++ b/engines/twine/scene/gamestate.cpp
@@ -331,13 +331,13 @@ void GameState::processFoundItem(InventoryItems item) {
 
 	_engine->_grid->drawOverModelActor(itemX, itemY, itemZ);
 
-	_engine->_renderer->projectPositionOnScreen(bodyX, bodyY, bodyZ);
-	_engine->_renderer->_projPos.y -= 150;
+	IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(bodyX, bodyY, bodyZ);
+	projPos.y -= 150;
 
-	const int32 boxTopLeftX = _engine->_renderer->_projPos.x - 65;
-	const int32 boxTopLeftY = _engine->_renderer->_projPos.y - 65;
-	const int32 boxBottomRightX = _engine->_renderer->_projPos.x + 65;
-	const int32 boxBottomRightY = _engine->_renderer->_projPos.y + 65;
+	const int32 boxTopLeftX = projPos.x - 65;
+	const int32 boxTopLeftY = projPos.y - 65;
+	const int32 boxBottomRightX = projPos.x + 65;
+	const int32 boxBottomRightY = projPos.y + 65;
 	const Common::Rect boxRect(boxTopLeftX, boxTopLeftY, boxBottomRightX, boxBottomRightY);
 	_engine->_sound->playSample(Samples::BigItemFound);
 
diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index 10ec7d1245..dcbb62d101 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -682,8 +682,6 @@ void Grid::redrawGrid() {
 	_camera.y = _newCamera.y * BRICK_HEIGHT;
 	_camera.z = _newCamera.z * BRICK_SIZE;
 
-	_engine->_renderer->projectPositionOnScreen(-_camera.x, -_camera.y, -_camera.z);
-
 	memset(_brickInfoBuffer, 0, _brickInfoBufferSize);
 
 	if (!_engine->_scene->_enableGridTileRendering) {
diff --git a/engines/twine/shared.h b/engines/twine/shared.h
index 3caf15815d..0f5a70e777 100644
--- a/engines/twine/shared.h
+++ b/engines/twine/shared.h
@@ -120,6 +120,10 @@ inline constexpr IVec3 operator-(const IVec3 &lhs, const IVec3 &rhs) {
 	return IVec3{lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z};
 }
 
+inline constexpr IVec3 operator-(const IVec3 &v) {
+	return IVec3{-v.x, -v.y, -v.z};
+}
+
 /**
  * @brief Axis aligned bounding box
  */


Commit: aa073eb5a1012b7d0948d7cecbbc71df9c9a1778
    https://github.com/scummvm/scummvm/commit/aa073eb5a1012b7d0948d7cecbbc71df9c9a1778
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T21:21:57+02:00

Commit Message:
TWINE: use isValidRect()

Changed paths:
    engines/twine/scene/grid.cpp


diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index dcbb62d101..336febd114 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -513,7 +513,7 @@ bool Grid::drawSprite(int32 posX, int32 posY, const SpriteData &ptr, int spriteI
 
 // 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->_clip.left > _engine->_interface->_clip.right || _engine->_interface->_clip.top > _engine->_interface->_clip.bottom) {
+	if (!_engine->_interface->_clip.isValidRect()) {
 		return false;
 	}
 


Commit: aea7c3ff1ac9ccea6315eafaa1f235d883012591
    https://github.com/scummvm/scummvm/commit/aea7c3ff1ac9ccea6315eafaa1f235d883012591
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-08-10T21:21:57+02:00

Commit Message:
TWINE: fixed cliprect handling for extras

the disassembly of lbawin shows that the extra position is used. I'm not
yet sure about this change - but the magicball rendering is working
without the previous hack (the static DrawListStruct)

Changed paths:
    engines/twine/renderer/redraw.cpp


diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index 0466f2e314..106c49fe69 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -461,9 +461,9 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
 	_engine->_interface->setClip(renderRect);
 
 	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;
+		const int32 tmpX = (extra->pos.x + BRICK_HEIGHT) / BRICK_SIZE;
+		const int32 tmpY = extra->pos.y / BRICK_HEIGHT;
+		const int32 tmpZ = (extra->pos.z + BRICK_HEIGHT) / BRICK_SIZE;
 
 		_engine->_grid->drawOverModelActor(tmpX, tmpY, tmpZ);
 		addRedrawArea(_engine->_interface->_clip);
@@ -670,7 +670,7 @@ void Redraw::redrawEngineActions(bool bgRedraw) {
 		blitBackgroundAreas();
 	}
 
-	static DrawListStruct drawList[150];
+	DrawListStruct drawList[150];
 	int32 drawListPos = fillActorDrawingList(drawList, bgRedraw);
 	drawListPos = fillExtraDrawingList(drawList, drawListPos);
 	sortDrawingList(drawList, drawListPos);




More information about the Scummvm-git-logs mailing list