[Scummvm-git-logs] scummvm master -> f1df317abc7ba470bff092d8dd18be599d49b2dd
mgerhardy
noreply at scummvm.org
Sat Jan 21 14:23:06 UTC 2023
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
fa2cdce750 TWINE: getting closer to the original source release
f1df317abc TWINE: fixed bug #13871 (rendering error with opened door)
Commit: fa2cdce750505271023fe456b7ca009c2a379448
https://github.com/scummvm/scummvm/commit/fa2cdce750505271023fe456b7ca009c2a379448
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2023-01-21T15:23:00+01:00
Commit Message:
TWINE: getting closer to the original source release
Changed paths:
engines/twine/debugger/debug_scene.cpp
engines/twine/holomap.cpp
engines/twine/renderer/redraw.cpp
engines/twine/renderer/renderer.cpp
engines/twine/renderer/renderer.h
engines/twine/scene/extra.cpp
engines/twine/scene/extra.h
engines/twine/scene/gamestate.cpp
engines/twine/scene/grid.cpp
engines/twine/shared.h
engines/twine/twine.cpp
engines/twine/twine.h
diff --git a/engines/twine/debugger/debug_scene.cpp b/engines/twine/debugger/debug_scene.cpp
index 2967e65b144..19428f16358 100644
--- a/engines/twine/debugger/debug_scene.cpp
+++ b/engines/twine/debugger/debug_scene.cpp
@@ -41,7 +41,7 @@ void DebugScene::drawClip(const Common::Rect &rect) {
}
void DebugScene::projectBoundingBoxPoints(IVec3 *pPoint3d, IVec3 *pPoint3dProjected) {
- *pPoint3dProjected = _engine->_renderer->projectPositionOnScreen(*pPoint3d);
+ *pPoint3dProjected = _engine->_renderer->projectPoint(*pPoint3d);
}
bool DebugScene::checkZoneType(ZoneType type) const {
diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 2795dd2ddeb..3c0fdd56281 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -215,14 +215,14 @@ void Holomap::computeGlobeProj() {
_holomapSort[holomapSortArrayIdx].projectedPosIdx = _projectedSurfaceIndex;
++holomapSortArrayIdx;
}
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(destPos);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(destPos);
_projectedSurfacePositions[_projectedSurfaceIndex].x1 = projPos.x;
_projectedSurfacePositions[_projectedSurfaceIndex].y1 = projPos.y;
++_projectedSurfaceIndex;
}
IVec3 *vec = &_holomapSurface[holomapSurfaceArrayIdx++];
const IVec3 &destPos = _engine->_renderer->worldRotatePoint(*vec);
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(destPos);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(destPos);
_projectedSurfacePositions[_projectedSurfaceIndex].x1 = projPos.x;
_projectedSurfacePositions[_projectedSurfaceIndex].y1 = projPos.y;
++_projectedSurfaceIndex;
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index 24989f52932..8d5504092bc 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -210,7 +210,7 @@ int32 Redraw::fillActorDrawingList(DrawListStruct *drawList, bool flagflip) {
// no redraw required
if (actor->_staticFlags.bIsBackgrounded && !flagflip) {
// get actor position on screen
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(actor->posObj() - _engine->_grid->_worldCube);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(actor->posObj() - _engine->_grid->_worldCube);
// check if actor is visible on screen, otherwise don't display it
if (projPos.x > VIEW_X0 && projPos.x < VIEW_X1(_engine) && projPos.y > VIEW_Y0 && projPos.y < VIEW_Y1(_engine)) {
actor->_dynamicFlags.bIsDrawn = 1;
@@ -222,7 +222,7 @@ int32 Redraw::fillActorDrawingList(DrawListStruct *drawList, bool flagflip) {
continue;
}
// get actor position on screen
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(actor->posObj() - _engine->_grid->_worldCube);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(actor->posObj() - _engine->_grid->_worldCube);
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 > VIEW_X0 && projPos.x < VIEW_X1(_engine) && projPos.y > VIEW_Y0 && projPos.y < VIEW_Y1(_engine))) {
@@ -299,7 +299,7 @@ int32 Redraw::fillExtraDrawingList(DrawListStruct *drawList, int32 drawListPos)
}
}
}
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(extra->pos - _engine->_grid->_worldCube);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(extra->pos - _engine->_grid->_worldCube);
if (projPos.x > VIEW_X0 && projPos.x < VIEW_X1(_engine) && projPos.y > VIEW_Y0 && projPos.y < VIEW_Y1(_engine)) {
const int16 tmpVal = extra->pos.x - _engine->_grid->_worldCube.x + extra->pos.z - _engine->_grid->_worldCube.z;
@@ -327,7 +327,7 @@ int32 Redraw::fillExtraDrawingList(DrawListStruct *drawList, int32 drawListPos)
void Redraw::processDrawListShadows(const DrawListStruct &drawCmd) {
// get actor position on screen
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(drawCmd.x - _engine->_grid->_worldCube.x, drawCmd.y - _engine->_grid->_worldCube.y, drawCmd.z - _engine->_grid->_worldCube.z);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(drawCmd.x - _engine->_grid->_worldCube.x, drawCmd.y - _engine->_grid->_worldCube.y, drawCmd.z - _engine->_grid->_worldCube.z);
int32 spriteWidth = _engine->_resources->_spriteShadowPtr.surface(drawCmd.offset).w;
int32 spriteHeight = _engine->_resources->_spriteShadowPtr.surface(drawCmd.offset).h;
@@ -408,7 +408,7 @@ void Redraw::processDrawListActorSprites(const DrawListStruct &drawCmd, bool bgR
const uint8 *spritePtr = _engine->_resources->_spriteTable[actor->_body];
// get actor position on screen
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(actor->posObj() - _engine->_grid->_worldCube);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(actor->posObj() - _engine->_grid->_worldCube);
const int32 spriteWidth = spriteData.surface().w;
const int32 spriteHeight = spriteData.surface().h;
@@ -465,11 +465,11 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
int32 extraIdx = drawCmd.actorIdx;
ExtraListStruct *extra = &_engine->_extra->_extraList[extraIdx];
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(extra->pos - _engine->_grid->_worldCube);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(extra->pos - _engine->_grid->_worldCube);
Common::Rect renderRect;
if (extra->sprite & EXTRA_SPECIAL_MASK) {
- _engine->_extra->drawExtraSpecial(extraIdx, projPos.x, projPos.y, renderRect);
+ _engine->_extra->affSpecial(extraIdx, projPos.x, projPos.y, renderRect);
} else {
const SpriteData &spritePtr = _engine->_resources->_spriteData[extra->sprite];
const int32 spriteWidth = spritePtr.surface().w;
@@ -649,7 +649,7 @@ void Redraw::renderOverlays() {
case OverlayPosType::koFollowActor: {
ActorStruct *actor2 = _engine->_scene->getActor(overlay->info1);
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(actor2->_pos.x - _engine->_grid->_worldCube.x, actor2->_pos.y + actor2->_boundingBox.maxs.y - _engine->_grid->_worldCube.y, actor2->_pos.z - _engine->_grid->_worldCube.z);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(actor2->_pos.x - _engine->_grid->_worldCube.x, actor2->_pos.y + actor2->_boundingBox.maxs.y - _engine->_grid->_worldCube.y, actor2->_pos.z - _engine->_grid->_worldCube.z);
overlay->x = projPos.x;
overlay->y = projPos.y;
@@ -819,7 +819,7 @@ void Redraw::redrawEngineActions(bool bgRedraw) { // AffScene
_engine->_screens->clearScreen();
_engine->_grid->redrawGrid();
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(-_engine->_grid->_worldCube);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(-_engine->_grid->_worldCube);
_projPosScreen.x = projPos.x;
_projPosScreen.y = projPos.y;
@@ -881,7 +881,7 @@ void Redraw::drawBubble(int32 actorIdx) {
ActorStruct *actor = _engine->_scene->getActor(actorIdx);
// get actor position on screen
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(actor->_pos.x - _engine->_grid->_worldCube.x, actor->_pos.y + actor->_boundingBox.maxs.y - _engine->_grid->_worldCube.y, actor->_pos.z - _engine->_grid->_worldCube.z);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(actor->_pos.x - _engine->_grid->_worldCube.x, actor->_pos.y + actor->_boundingBox.maxs.y - _engine->_grid->_worldCube.y, actor->_pos.z - _engine->_grid->_worldCube.z);
if (actorIdx != _bubbleActor) {
_bubbleSpriteIndex = _bubbleSpriteIndex ^ 1;
diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 5a6a27551f0..2876a82047c 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -69,19 +69,24 @@ void Renderer::init(int32 w, int32 h) {
_tabx1 = _tabCoulD;
}
-IVec3 &Renderer::projectPositionOnScreen(int32 cX, int32 cY, int32 cZ) { // ProjettePoint
+void Renderer::projIso(IVec3 &pos, int32 x, int32 y, int32 z) {
+ pos.x = (int16)((((x - z) * 24) / ISO_SCALE) + _projectionCenter.x);
+ pos.y = (int16)(((((x + z) * 12) - (y * 30)) / ISO_SCALE) + _projectionCenter.y);
+ pos.z = 0;
+}
+
+IVec3 Renderer::projectPoint(int32 cX, int32 cY, int32 cZ) { // ProjettePoint
+ IVec3 pos;
if (_isUsingIsoProjection) {
- _projPos.x = ((cX - cZ) * 24) / ISO_SCALE + _projectionCenter.x;
- _projPos.y = (((cX + cZ) * 12) - cY * 30) / ISO_SCALE + _projectionCenter.y;
- _projPos.z = cZ - cY - cX;
- return _projPos;
+ projIso(pos, cX, cY, cZ);
+ return pos;
}
if (_cameraRot.z - cZ < 0) {
- _projPos.x = 0;
- _projPos.y = 0;
- _projPos.z = 0;
- return _projPos;
+ pos.x = 0;
+ pos.y = 0;
+ pos.z = 0;
+ return pos;
}
cX -= _cameraRot.x;
@@ -93,10 +98,10 @@ IVec3 &Renderer::projectPositionOnScreen(int32 cX, int32 cY, int32 cZ) { // Proj
posZ = 0x7FFF;
}
- _projPos.x = (cX * _lFactorX) / posZ + _projectionCenter.x;
- _projPos.y = (-cY * _lFactorY) / posZ + _projectionCenter.y;
- _projPos.z = posZ;
- return _projPos;
+ pos.x = (cX * _lFactorX) / posZ + _projectionCenter.x;
+ pos.y = (-cY * _lFactorY) / posZ + _projectionCenter.y;
+ pos.z = posZ;
+ return pos;
}
void Renderer::setProjection(int32 x, int32 y, int32 kfact, int32 lfactx, int32 lfacty) {
@@ -1575,13 +1580,12 @@ void Renderer::animModel(ModelData *modelData, const BodyData &bodyData, RenderC
const I16Vec3 *pointPtr = &modelData->computedPoints[0];
I16Vec3 *pointPtrDest = &modelData->flattenPoints[0];
- if (_isUsingIsoProjection) { // use standard projection
+ if (_isUsingIsoProjection) {
do {
const int32 coX = pointPtr->x + renderPos.x;
const int32 coY = pointPtr->y + renderPos.y;
const int32 coZ = -(pointPtr->z + renderPos.z);
- // TODO: use projectPositionOnScreen()
pointPtrDest->x = (coX + coZ) * 24 / ISO_SCALE + _projectionCenter.x;
pointPtrDest->y = (((coX - coZ) * 12) - coY * 30) / ISO_SCALE + _projectionCenter.y;
pointPtrDest->z = coZ - coX - coY;
@@ -1605,61 +1609,39 @@ void Renderer::animModel(ModelData *modelData, const BodyData &bodyData, RenderC
} while (--numOfPrimitives);
} else {
do {
- int32 coX = pointPtr->x + renderPos.x;
- int32 coY = pointPtr->y + renderPos.y;
- int32 coZ = -(pointPtr->z + renderPos.z);
-
- coZ += _kFactor;
-
+ int32 coZ = _kFactor - (pointPtr->z + renderPos.z);
if (coZ <= 0) {
coZ = 0x7FFFFFFF;
}
- // X projection
- {
- coX = _projectionCenter.x + ((coX * _lFactorX) / coZ);
-
- if (coX > 0xFFFF) {
- coX = 0x7FFF;
- }
-
- pointPtrDest->x = coX;
-
- if (pointPtrDest->x < modelRect.left) {
- modelRect.left = pointPtrDest->x;
- }
-
- if (pointPtrDest->x > modelRect.right) {
- modelRect.right = pointPtrDest->x;
- }
+ int32 coX = (((pointPtr->x + renderPos.x) * _lFactorX) / coZ) + _projectionCenter.x;
+ if (coX > 0xFFFF) {
+ coX = 0x7FFF;
}
-
- // Y projection
- {
- coY = _projectionCenter.y + ((-coY * _lFactorY) / coZ);
-
- if (coY > 0xFFFF) {
- coY = 0x7FFF;
- }
-
- pointPtrDest->y = coY;
-
- if (pointPtrDest->y < modelRect.top) {
- modelRect.top = pointPtrDest->y;
- }
- if (pointPtrDest->y > modelRect.bottom) {
- modelRect.bottom = pointPtrDest->y;
- }
+ pointPtrDest->x = coX;
+ if (pointPtrDest->x < modelRect.left) {
+ modelRect.left = pointPtrDest->x;
+ }
+ if (pointPtrDest->x > modelRect.right) {
+ modelRect.right = pointPtrDest->x;
}
- // Z projection
- {
- if (coZ > 0xFFFF) {
- coZ = 0x7FFF;
- }
+ int32 coY = _projectionCenter.y - (((pointPtr->y + renderPos.y) * _lFactorY) / coZ);
+ if (coY > 0xFFFF) {
+ coY = 0x7FFF;
+ }
+ pointPtrDest->y = coY;
+ if (pointPtrDest->y < modelRect.top) {
+ modelRect.top = pointPtrDest->y;
+ }
+ if (pointPtrDest->y > modelRect.bottom) {
+ modelRect.bottom = pointPtrDest->y;
+ }
- pointPtrDest->z = coZ;
+ if (coZ > 0xFFFF) {
+ coZ = 0x7FFF;
}
+ pointPtrDest->z = coZ;
pointPtr++;
pointPtrDest++;
diff --git a/engines/twine/renderer/renderer.h b/engines/twine/renderer/renderer.h
index 98d06058203..9b251078d2f 100644
--- a/engines/twine/renderer/renderer.h
+++ b/engines/twine/renderer/renderer.h
@@ -151,6 +151,7 @@ private:
ModelData _modelData;
+ // AnimNuage
void animModel(ModelData *modelData, const BodyData &bodyData, RenderCommand *renderCmds, const IVec3 &angleVec, const IVec3 &renderPos, Common::Rect &modelRect);
bool computeSphere(int32 x, int32 y, int32 radius, int &vtop, int &vbottom);
bool renderObjectIso(const BodyData &bodyData, RenderCommand **renderCmds, ModelData *modelData, Common::Rect &modelRect); // RenderObjetIso
@@ -231,8 +232,6 @@ public:
void init(int32 w, int32 h);
- IVec3 _projPos;
-
void setCameraRotation(int32 x, int32 y, int32 z);
IVec3 getHolomapRotation(const int32 angleX, const int32 angleY, const int32 angleZ) const;
@@ -244,11 +243,13 @@ public:
void fillVertices(int16 vtop, int16 vbottom, uint8 renderType, uint16 color);
void renderPolygons(const CmdRenderPolygon &polygon, ComputedVertex *vertices, int vtop, int vbottom);
- inline IVec3 &projectPositionOnScreen(const IVec3& pos) { // ProjettePoint
- return projectPositionOnScreen(pos.x, pos.y, pos.z);
+ inline IVec3 projectPoint(const IVec3& pos) { // ProjettePoint
+ return projectPoint(pos.x, pos.y, pos.z);
}
- IVec3 &projectPositionOnScreen(int32 cX, int32 cY, int32 cZ);
+ void projIso(IVec3 &pos, int32 x, int32 y, int32 z);
+
+ IVec3 projectPoint(int32 cX, int32 cY, int32 cZ);
void setFollowCamera(int32 transPosX, int32 transPosY, int32 transPosZ, int32 cameraAlpha, int32 cameraBeta, int32 cameraGamma, int32 cameraZoom);
void setPosCamera(int32 x, int32 y, int32 z);
diff --git a/engines/twine/scene/extra.cpp b/engines/twine/scene/extra.cpp
index d6a840ef0d3..974a5fb94a3 100644
--- a/engines/twine/scene/extra.cpp
+++ b/engines/twine/scene/extra.cpp
@@ -394,106 +394,64 @@ 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, Common::Rect &renderRect) {
+void Extra::aff2DShape(const ExtraShape &shapeTable, int32 x, int32 y, int32 color, int32 angle, int32 zoom, Common::Rect &renderRect) {
int shapeDataIndex = 0;
- int16 shapeX = shapeTable.data[shapeDataIndex].x * size / 16;
- int16 shapeZ = shapeTable.data[shapeDataIndex].z * size / 16;
+ int16 shapeX = shapeTable.data[shapeDataIndex].x * zoom / 16;
+ int16 shapeZ = shapeTable.data[shapeDataIndex].z * zoom / 16;
++shapeDataIndex;
- renderRect.left = 0x7D00; // SCENE_SIZE_MAX
- renderRect.right = -0x7D00;
- renderRect.top = 0x7D00;
- renderRect.bottom = -0x7D00;
+ _engine->clearScreenMinMax(renderRect);
IVec3 destPos = _engine->_movements->rotate(shapeX, shapeZ, angle);
const int32 computedX = destPos.x + x;
const int32 computedY = destPos.z + y;
- if (computedX < renderRect.left) {
- renderRect.left = computedX;
- }
-
- if (computedX > renderRect.right) {
- renderRect.right = computedX;
- }
-
- if (computedY < renderRect.top) {
- renderRect.top = computedY;
- }
-
- if (computedY > renderRect.bottom) {
- renderRect.bottom = computedY;
- }
+ _engine->adjustScreenMax(renderRect, computedX, computedY);
int32 currentX = computedX;
int32 currentY = computedY;
for (int32 numEntries = 1; numEntries < shapeTable.n; ++numEntries) {
- shapeX = shapeTable.data[shapeDataIndex].x * size / 16;
- shapeZ = shapeTable.data[shapeDataIndex].z * size / 16;
+ shapeX = shapeTable.data[shapeDataIndex].x * zoom / 16;
+ shapeZ = shapeTable.data[shapeDataIndex].z * zoom / 16;
++shapeDataIndex;
const int32 oldComputedX = currentX;
const int32 oldComputedY = currentY;
- _engine->_renderer->_projPos.x = currentX;
- _engine->_renderer->_projPos.y = currentY;
-
destPos = _engine->_movements->rotate(shapeX, shapeZ, angle);
currentX = destPos.x + x;
currentY = destPos.z + y;
- if (currentX < renderRect.left) {
- renderRect.left = currentX;
- }
-
- if (currentX > renderRect.right) {
- renderRect.right = currentX;
- }
-
- if (currentY < renderRect.top) {
- renderRect.top = currentY;
- }
-
- if (currentY > renderRect.bottom) {
- renderRect.bottom = currentY;
- }
-
- _engine->_renderer->_projPos.x = currentX;
- _engine->_renderer->_projPos.y = currentY;
-
+ _engine->adjustScreenMax(renderRect, currentX, currentY);
_engine->_interface->drawLine(oldComputedX, oldComputedY, currentX, currentY, color);
-
- currentX = _engine->_renderer->_projPos.x;
- currentY = _engine->_renderer->_projPos.y;
}
-
- _engine->_renderer->_projPos.x = currentX;
- _engine->_renderer->_projPos.y = currentY;
_engine->_interface->drawLine(currentX, currentY, computedX, computedY, color);
}
-void Extra::drawExtraSpecial(int32 extraIdx, int32 x, int32 y, Common::Rect &renderRect) {
+void Extra::affSpecial(int32 extraIdx, int32 x, int32 y, Common::Rect &renderRect) {
ExtraListStruct *extra = &_extraList[extraIdx];
ExtraSpecialType specialType = (ExtraSpecialType)(extra->sprite & (EXTRA_SPECIAL_MASK - 1));
switch (specialType) {
case ExtraSpecialType::kHitStars:
- drawSpecialShape(hitStarsShape, x, y, COLOR_WHITE, (_engine->_lbaTime * 32) & LBAAngles::ANGLE_270, 4, renderRect);
+ aff2DShape(hitStarsShape, x, y, COLOR_WHITE, (_engine->_lbaTime * 32) & LBAAngles::ANGLE_270, 4, renderRect);
break;
case ExtraSpecialType::kExplodeCloud: {
- int32 cloudTime = 1 + _engine->_lbaTime - extra->spawnTime;
+ int32 zoom = 1 + _engine->_lbaTime - extra->spawnTime;
- if (cloudTime > 32) {
- cloudTime = 32;
+ if (zoom > 32) {
+ zoom = 32;
}
- drawSpecialShape(explodeCloudShape, x, y, COLOR_WHITE, LBAAngles::ANGLE_0, cloudTime, renderRect);
+ aff2DShape(explodeCloudShape, x, y, COLOR_WHITE, LBAAngles::ANGLE_0, zoom, renderRect);
break;
}
+ case ExtraSpecialType::kFountain:
+ break;
}
}
@@ -656,7 +614,7 @@ void Extra::gereExtras() {
_engine->_sound->playSample(Samples::ItemFound, 1, _engine->_scene->_sceneHero->posObj(), OWN_ACTOR_SCENE_INDEX);
if (extraKey->info1 > 1) {
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(extraKey->pos - _engine->_grid->_worldCube);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(extraKey->pos - _engine->_grid->_worldCube);
_engine->_redraw->addOverlay(OverlayType::koNumber, extraKey->info1, projPos.x, projPos.y, COLOR_BLACK, OverlayPosType::koNormal, 2);
}
@@ -689,7 +647,7 @@ void Extra::gereExtras() {
_engine->_sound->playSample(Samples::ItemFound, 1, _engine->_scene->_sceneHero->posObj(), OWN_ACTOR_SCENE_INDEX);
if (extraKey->info1 > 1) {
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(extraKey->pos - _engine->_grid->_worldCube);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(extraKey->pos - _engine->_grid->_worldCube);
_engine->_redraw->addOverlay(OverlayType::koNumber, extraKey->info1, projPos.x, projPos.y, COLOR_BLACK, OverlayPosType::koNormal, 2);
}
@@ -837,7 +795,7 @@ void Extra::gereExtras() {
_engine->_sound->playSample(Samples::ItemFound, 1, extra->pos);
if (extra->info1 > 1) {
- const IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(extra->pos - _engine->_grid->_worldCube);
+ const IVec3 &projPos = _engine->_renderer->projectPoint(extra->pos - _engine->_grid->_worldCube);
const int16 fontColor = COLOR_158;
_engine->_redraw->addOverlay(OverlayType::koNumber, extra->info1, projPos.x, projPos.y, fontColor, OverlayPosType::koNormal, 2);
}
diff --git a/engines/twine/scene/extra.h b/engines/twine/scene/extra.h
index 6f1bd69da73..6068307b2ec 100644
--- a/engines/twine/scene/extra.h
+++ b/engines/twine/scene/extra.h
@@ -92,7 +92,7 @@ private:
void bounceExtra(ExtraListStruct *extra, int32 x, int32 y, int32 z);
int32 searchBonusKey() const;
int32 extraSearchKey(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, Common::Rect &renderRect);
+ void aff2DShape(const ExtraShape &shapeTable, int32 x, int32 y, int32 color, int32 angle, int32 zoom, Common::Rect &renderRect);
public:
Extra(TwinEEngine *engine);
@@ -126,7 +126,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, Common::Rect &renderRect);
+ void affSpecial(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 4fed1e787c3..f4b1c976e86 100644
--- a/engines/twine/scene/gamestate.cpp
+++ b/engines/twine/scene/gamestate.cpp
@@ -46,6 +46,8 @@
#include "twine/text.h"
#include "twine/twine.h"
+#define SIZE_FOUND_OBJ 130
+
namespace TwinE {
GameState::GameState(TwinEEngine *engine) : _engine(engine) {
@@ -335,13 +337,13 @@ void GameState::doFoundObj(InventoryItems item) {
_engine->_grid->drawOverBrick(itemX, itemY, itemZ);
- IVec3 &projPos = _engine->_renderer->projectPositionOnScreen(bodyPos);
+ IVec3 projPos = _engine->_renderer->projectPoint(bodyPos);
projPos.y -= 150;
- 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 int32 boxTopLeftX = projPos.x - (SIZE_FOUND_OBJ / 2);
+ const int32 boxTopLeftY = projPos.y - (SIZE_FOUND_OBJ / 2);
+ const int32 boxBottomRightX = projPos.x + (SIZE_FOUND_OBJ / 2);
+ const int32 boxBottomRightY = projPos.y + (SIZE_FOUND_OBJ / 2);
const Common::Rect boxRect(boxTopLeftX, boxTopLeftY, boxBottomRightX, boxBottomRightY);
_engine->_sound->playSample(Samples::BigItemFound);
@@ -381,7 +383,7 @@ void GameState::doFoundObj(InventoryItems item) {
itemAngle += LBAAngles::ANGLE_2;
- _engine->_renderer->draw3dObject(_engine->_renderer->_projPos.x, _engine->_renderer->_projPos.y, _engine->_resources->_inventoryTable[item], itemAngle, 10000);
+ _engine->_renderer->draw3dObject(projPos.x, projPos.y, _engine->_resources->_inventoryTable[item], itemAngle, 10000);
_engine->_menu->drawRectBorders(boxRect);
_engine->_redraw->addRedrawArea(boxRect);
diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index 73e62f604d6..7c3356bdc87 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -846,11 +846,11 @@ void Grid::centerScreenOnActor() {
}
ActorStruct *actor = _engine->_scene->getActor(_engine->_scene->_currentlyFollowedActor);
- _engine->_renderer->projectPositionOnScreen(actor->_pos.x - (_newCamera.x * SIZE_BRICK_XZ),
+ const IVec3 projPos = _engine->_renderer->projectPoint(actor->_pos.x - (_newCamera.x * SIZE_BRICK_XZ),
actor->_pos.y - (_newCamera.y * SIZE_BRICK_Y),
actor->_pos.z - (_newCamera.z * SIZE_BRICK_XZ));
// TODO: these border values should get scaled for higher 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) {
+ if (projPos.x < 80 || projPos.x >= _engine->width() - 60 || projPos.y < 80 || projPos.y >= _engine->height() - 50) {
_newCamera.x = ((actor->_pos.x + SIZE_BRICK_Y) / SIZE_BRICK_XZ) + (((actor->_pos.x + SIZE_BRICK_Y) / SIZE_BRICK_XZ) - _newCamera.x) / 2;
_newCamera.y = actor->_pos.y / SIZE_BRICK_Y;
_newCamera.z = ((actor->_pos.z + SIZE_BRICK_Y) / SIZE_BRICK_XZ) + (((actor->_pos.z + SIZE_BRICK_Y) / SIZE_BRICK_XZ) - _newCamera.z) / 2;
diff --git a/engines/twine/shared.h b/engines/twine/shared.h
index 41dd811c033..8e50781391e 100644
--- a/engines/twine/shared.h
+++ b/engines/twine/shared.h
@@ -342,7 +342,8 @@ enum class BodyType {
enum class ExtraSpecialType {
kHitStars = 0,
- kExplodeCloud = 1
+ kExplodeCloud = 1,
+ kFountain = 2
};
enum class ZoneType {
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index af0ca46aaa3..8accc3897d9 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -532,6 +532,31 @@ void TwinEEngine::queueMovie(const char *filename) {
_queuedFlaMovie = filename;
}
+void TwinEEngine::adjustScreenMax(Common::Rect &rect, int16 x, int16 y) {
+ if (x < rect.left) {
+ rect.left = x;
+ }
+
+ if (x > rect.right) {
+ rect.right = x;
+ }
+
+ if (y < rect.top) {
+ rect.top = y;
+ }
+
+ if (y > rect.bottom) {
+ rect.bottom = y;
+ }
+}
+
+void TwinEEngine::clearScreenMinMax(Common::Rect &rect) {
+ rect.left = 0x7D00; // SCENE_SIZE_MAX
+ rect.right = -0x7D00;
+ rect.top = 0x7D00;
+ rect.bottom = -0x7D00;
+}
+
void TwinEEngine::playIntro() {
_input->enableKeyMap(cutsceneKeyMapId);
// Display company logo
@@ -1004,7 +1029,7 @@ bool TwinEEngine::runGameEngine() { // mainLoopInteration
if (!_actor->_cropBottomScreen) {
_animations->initAnim(AnimationTypes::kDrawn, AnimType::kAnimationSet, AnimationTypes::kStanding, OWN_ACTOR_SCENE_INDEX);
}
- const IVec3 &projPos = _renderer->projectPositionOnScreen(actor->posObj() - _grid->_worldCube);
+ const IVec3 &projPos = _renderer->projectPoint(actor->posObj() - _grid->_worldCube);
actor->_controlMode = ControlMode::kNoMove;
actor->setLife(-1);
_actor->_cropBottomScreen = projPos.y;
diff --git a/engines/twine/twine.h b/engines/twine/twine.h
index 7f0c87ea59d..230176a0c53 100644
--- a/engines/twine/twine.h
+++ b/engines/twine/twine.h
@@ -328,6 +328,9 @@ public:
void queueMovie(const char *filename);
+ void clearScreenMinMax(Common::Rect &rect);
+ void adjustScreenMax(Common::Rect &rect, int16 x, int16 y);
+
/**
* @return A random value between [0-max)
*/
Commit: f1df317abc7ba470bff092d8dd18be599d49b2dd
https://github.com/scummvm/scummvm/commit/f1df317abc7ba470bff092d8dd18be599d49b2dd
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2023-01-21T15:23:00+01:00
Commit Message:
TWINE: fixed bug #13871 (rendering error with opened door)
https://bugs.scummvm.org/ticket/13871
the z level correction was done, but the sorting did not take the corrected
depth values into account
Changed paths:
engines/twine/renderer/redraw.cpp
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index 8d5504092bc..3fc0f7546e1 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -836,10 +836,10 @@ void Redraw::redrawEngineActions(bool bgRedraw) { // AffScene
DrawListStruct drawList[NUM_MAX_ACTORS + EXTRA_MAX_ENTRIES]; // ListTri[MAX_OBJECTS + MAX_EXTRAS]
int32 drawListPos = fillActorDrawingList(drawList, bgRedraw);
drawListPos = fillExtraDrawingList(drawList, drawListPos);
- sortDrawingList(drawList, drawListPos);
_currNumOfRedrawBox = 0;
correctZLevels(drawList, drawListPos);
+ sortDrawingList(drawList, drawListPos);
processDrawList(drawList, drawListPos, bgRedraw);
if (_engine->_cfgfile.Debug) {
More information about the Scummvm-git-logs
mailing list