[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