mirror of
https://github.com/ZDoom/Raze.git
synced 2024-11-15 17:01:28 +00:00
- Duke: Fix interpolation for SE_20_STRETCH_BRIDGE
, such as curtains in E1L1/2/3.
* I'm not sure if there's a better way to handle this, but I had to do the nested `twoSided()` checks to ensure all walls of E1L3's curtains in the execution chair viewing room interpolated as expected.
This commit is contained in:
parent
b3943a0c04
commit
05a05c6406
1 changed files with 36 additions and 27 deletions
|
@ -718,38 +718,47 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors)
|
|||
|
||||
case SE_20_STRETCH_BRIDGE:
|
||||
{
|
||||
walltype* closewall = nullptr;
|
||||
|
||||
//find the two most clostest wall x's and y's
|
||||
double maxdist = 0x7fffffff;
|
||||
|
||||
for (auto& wal : wallsofsector(sectp))
|
||||
for (unsigned i = 0; i < 2; i++)
|
||||
{
|
||||
double dist = (actor->spr.pos.XY() - wal.pos).LengthSquared();
|
||||
if (dist < maxdist)
|
||||
walltype* closewall = nullptr;
|
||||
double maxdist = 0x7fffffff;
|
||||
|
||||
for (auto& wal : wallsofsector(sectp))
|
||||
{
|
||||
maxdist = dist;
|
||||
closewall = &wal;
|
||||
double dist = (actor->spr.pos.XY() - wal.pos).LengthSquared();
|
||||
if (dist < maxdist && &wal != actor->temp_walls[0])
|
||||
{
|
||||
maxdist = dist;
|
||||
closewall = &wal;
|
||||
}
|
||||
}
|
||||
|
||||
actor->temp_walls[i] = closewall;
|
||||
|
||||
StartInterpolation(actor->temp_walls[i], Interp_Wall_X);
|
||||
StartInterpolation(actor->temp_walls[i], Interp_Wall_Y);
|
||||
|
||||
if (actor->temp_walls[i]->twoSided())
|
||||
{
|
||||
auto nwal = actor->temp_walls[i]->nextWall();
|
||||
StartInterpolation(nwal, Interp_Wall_X);
|
||||
StartInterpolation(nwal, Interp_Wall_Y);
|
||||
nwal = nwal->point2Wall();
|
||||
StartInterpolation(nwal, Interp_Wall_X);
|
||||
StartInterpolation(nwal, Interp_Wall_Y);
|
||||
|
||||
if (nwal->twoSided())
|
||||
{
|
||||
nwal = nwal->nextWall();
|
||||
StartInterpolation(nwal, Interp_Wall_X);
|
||||
StartInterpolation(nwal, Interp_Wall_Y);
|
||||
nwal = nwal->point2Wall();
|
||||
StartInterpolation(nwal, Interp_Wall_X);
|
||||
StartInterpolation(nwal, Interp_Wall_Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
actor->temp_walls[0] = closewall;
|
||||
|
||||
maxdist = 0x7fffffff;
|
||||
|
||||
for (auto& wal : wallsofsector(sectp))
|
||||
{
|
||||
double dist = (actor->spr.pos.XY() - wal.pos).LengthSquared();
|
||||
if (dist < maxdist && &wal != actor->temp_walls[0])
|
||||
{
|
||||
maxdist = dist;
|
||||
closewall = &wal;
|
||||
}
|
||||
}
|
||||
|
||||
actor->temp_walls[1] = closewall;
|
||||
StartInterpolation(sectp, Interp_Sect_FloorPanX);
|
||||
StartInterpolation(sectp, Interp_Sect_FloorPanY);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue