- TranslateSector cleanup.

This commit is contained in:
Christoph Oelckers 2022-09-29 13:39:06 +02:00
parent c6e8f0bcdb
commit 2afea7c477

View file

@ -828,29 +828,17 @@ void PathSound(sectortype* pSector, int nSound)
void TranslateSector(sectortype* pSector, double wave1, double wave2, const DVector2& pivot, const DVector2& pt1, DAngle ang1, const DVector2& pt2, DAngle ang2, bool bAllWalls) void TranslateSector(sectortype* pSector, double wave1, double wave2, const DVector2& pivot, const DVector2& pt1, DAngle ang1, const DVector2& pt2, DAngle ang2, bool bAllWalls)
{ {
int a4 = int(pivot.X * worldtoint); auto pt_w1 = interpolatedvalue(pt1, pt2, wave1);
int a5 = int(pivot.Y * worldtoint); auto pt_w2 = interpolatedvalue(pt1, pt2, wave2);
int a6 = int(pt1.X * worldtoint); // the angles here may not be normalized before interpolation. Some setups contain multiple rotations!
int a7 = int(pt1.Y * worldtoint); DAngle ptang_w1 = DAngle::fromDeg(interpolatedvalue(ang1.Degrees(), ang2.Degrees(), wave1));
int a8 = ang1.Buildang(); DAngle ptang_w2 = DAngle::fromDeg(interpolatedvalue(ang1.Degrees(), ang2.Degrees(), wave2));
int a9 = int(pt2.X * worldtoint);
int a10 = int(pt2.Y * worldtoint);
int a11 = ang2.Buildang();
XSECTOR* pXSector = &pSector->xs(); XSECTOR* pXSector = &pSector->xs();
int v20 = interpolatedvalue(a6, a9, wave1);
int vc = interpolatedvalue(a6, a9, wave2);
int v24 = interpolatedvalue(a7, a10, wave1);
int v8 = interpolatedvalue(a7, a10, wave2);
int v44 = interpolatedvalue(a8, a11, wave1);
int ang = interpolatedvalue(a8, a11, wave2);
int v14 = ang - v44;
DVector2 offset = { (vc - a4) * inttoworld, (v8 - a5) * inttoworld }; DVector2 offset = pt_w2 - pivot;
DVector2 aoffset = { (vc) * inttoworld, (v8) * inttoworld }; DVector2 position = pt_w2 - pt_w1;
DVector2 position = { (vc - v20) * inttoworld, (v8 - v24) * inttoworld }; auto angleofs = ptang_w2 - ptang_w1;
auto angle = DAngle::fromBuild(ang);
auto angleofs = DAngle::fromBuild(v14);
auto rotatewall = [=](walltype* wal, DAngle angle, const DVector2& offset) auto rotatewall = [=](walltype* wal, DAngle angle, const DVector2& offset)
{ {
@ -870,7 +858,7 @@ void TranslateSector(sectortype* pSector, double wave1, double wave2, const DVec
{ {
for (auto& wal : wallsofsector(pSector)) for (auto& wal : wallsofsector(pSector))
{ {
rotatewall(&wal, angle, offset); rotatewall(&wal, ptang_w2, offset);
} }
} }
else else
@ -880,21 +868,21 @@ void TranslateSector(sectortype* pSector, double wave1, double wave2, const DVec
auto p2Wall = wal.point2Wall(); auto p2Wall = wal.point2Wall();
if (wal.cstat & CSTAT_WALL_MOVE_FORWARD) if (wal.cstat & CSTAT_WALL_MOVE_FORWARD)
{ {
rotatewall(&wal, angle, offset); rotatewall(&wal, ptang_w2, offset);
if ((p2Wall->cstat & CSTAT_WALL_MOVE_MASK) == 0) if ((p2Wall->cstat & CSTAT_WALL_MOVE_MASK) == 0)
{ {
rotatewall(p2Wall, angle, offset); rotatewall(p2Wall, ptang_w2, offset);
} }
continue; continue;
} }
if (wal.cstat & CSTAT_WALL_MOVE_BACKWARD) if (wal.cstat & CSTAT_WALL_MOVE_BACKWARD)
{ {
rotatewall(&wal, -angle, -offset); rotatewall(&wal, -ptang_w2, -offset);
if ((p2Wall->cstat & CSTAT_WALL_MOVE_MASK) == 0) if ((p2Wall->cstat & CSTAT_WALL_MOVE_MASK) == 0)
{ {
rotatewall(p2Wall, -angle, -offset); rotatewall(p2Wall, -ptang_w2, -offset);
} }
continue; continue;
} }
@ -918,9 +906,9 @@ void TranslateSector(sectortype* pSector, double wave1, double wave2, const DVec
if (actor->spr.cstat & CSTAT_SPRITE_MOVE_FORWARD) if (actor->spr.cstat & CSTAT_SPRITE_MOVE_FORWARD)
{ {
auto spot = rotatepoint(pivot, actor->basePoint, angle); auto spot = rotatepoint(pivot, actor->basePoint, ptang_w2);
viewBackupSpriteLoc(actor); viewBackupSpriteLoc(actor);
actor->spr.pos.XY() = spot + aoffset - pivot; actor->spr.pos.XY() = spot + pt_w2 - pivot;
actor->spr.angle += angleofs; actor->spr.angle += angleofs;
} }
else if (actor->spr.cstat & CSTAT_SPRITE_MOVE_REVERSE) else if (actor->spr.cstat & CSTAT_SPRITE_MOVE_REVERSE)
@ -928,9 +916,9 @@ void TranslateSector(sectortype* pSector, double wave1, double wave2, const DVec
// fix Y arg in RotatePoint for reverse (green) moving sprites. (Original Blood bug?) // fix Y arg in RotatePoint for reverse (green) moving sprites. (Original Blood bug?)
DVector2 pivotDy(pivot.X, gModernMap ? pivot.Y : pivot.X); DVector2 pivotDy(pivot.X, gModernMap ? pivot.Y : pivot.X);
auto spot = rotatepoint(pivotDy, actor->basePoint, angle); auto spot = rotatepoint(pivotDy, actor->basePoint, ptang_w2);
viewBackupSpriteLoc(actor); viewBackupSpriteLoc(actor);
actor->spr.pos.XY() = spot - aoffset + pivot; actor->spr.pos.XY() = spot - pt_w2 + pivot;
actor->spr.angle += angleofs; actor->spr.angle += angleofs;
} }
else if (pXSector->Drag) else if (pXSector->Drag)
@ -943,8 +931,7 @@ void TranslateSector(sectortype* pSector, double wave1, double wave2, const DVec
viewBackupSpriteLoc(actor); viewBackupSpriteLoc(actor);
if (angleofs != nullAngle) if (angleofs != nullAngle)
{ {
DVector2 mypivot(v20 * inttoworld, v24 * inttoworld); actor->spr.pos.XY() = rotatepoint(pt_w1, actor->spr.pos.XY(), angleofs);
actor->spr.pos.XY() = rotatepoint(mypivot, actor->spr.pos.XY(), angleofs);
} }
actor->spr.angle += angleofs; actor->spr.angle += angleofs;
actor->spr.pos += position; actor->spr.pos += position;
@ -968,16 +955,16 @@ void TranslateSector(sectortype* pSector, double wave1, double wave2, const DVec
if (ac->spr.cstat & CSTAT_SPRITE_MOVE_FORWARD) if (ac->spr.cstat & CSTAT_SPRITE_MOVE_FORWARD)
{ {
auto spot = rotatepoint(pivot, ac->basePoint, angle); auto spot = rotatepoint(pivot, ac->basePoint, ptang_w2);
viewBackupSpriteLoc(ac); viewBackupSpriteLoc(ac);
ac->spr.pos.XY() = spot + aoffset - pivot; ac->spr.pos.XY() = spot + pt_w2 - pivot;
ac->spr.angle += angleofs; ac->spr.angle += angleofs;
} }
else if (ac->spr.cstat & CSTAT_SPRITE_MOVE_REVERSE) else if (ac->spr.cstat & CSTAT_SPRITE_MOVE_REVERSE)
{ {
auto spot = rotatepoint(pivot, ac->basePoint, angle); auto spot = rotatepoint(pivot, ac->basePoint, ptang_w2);
viewBackupSpriteLoc(ac); viewBackupSpriteLoc(ac);
ac->spr.pos.XY() = spot - aoffset + pivot; ac->spr.pos.XY() = spot - pt_w2 + pivot;
ac->spr.angle += angleofs; ac->spr.angle += angleofs;
} }
} }