From 58d3b04590b47e29561b6ede015a67797391bcf9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 24 Feb 2016 14:49:59 +0100 Subject: [PATCH 1/4] - fixed some places in p_pillar.cpp where sector plane z's were calculated at (0, 0) which could cause overflows if the actual plane is too far away from the origin. - renamed sector_t::soundorg in centerspot, changed the type to a fixedvec2 and removed the CenterSpot #define. Since this thing was used in lots of places that have nothing to do with sound the name made no sense. Having it as a fixed_t array also made it clumsy to use and the CenterSpot #define used a potentially dangerous type cast. --- src/am_map.cpp | 4 ++-- src/fragglescript/t_func.cpp | 9 ++++----- src/p_3dfloors.cpp | 20 ++++++++++---------- src/p_3dfloors.h | 2 -- src/p_floor.cpp | 32 ++++++++++++++++---------------- src/p_lnspec.cpp | 4 ++-- src/p_pillar.cpp | 16 ++++++++-------- src/p_setup.cpp | 10 +++++----- src/r_bsp.cpp | 8 ++++---- src/r_defs.h | 11 ++++++++--- src/s_sound.cpp | 8 ++++---- 11 files changed, 63 insertions(+), 61 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index b0ae28a13..28bd27aff 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -1974,8 +1974,8 @@ void AM_drawSubsectors() } else { - secx = FIXED2DBL(sec->soundorg[0]); - secy = FIXED2DBL(sec->soundorg[1]); + secx = FIXED2DBL(sec->centerspot.x); + secy = FIXED2DBL(sec->centerspot.y); } seczb = floorplane->ZatPoint(secx, secy); seczt = sec->ceilingplane.ZatPoint(secx, secy); diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index e30c76326..677694193 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -1615,7 +1615,7 @@ void FParser::SF_FloorHeight(void) DFloorChanger * f = new DFloorChanger(§ors[i]); if (!f->Move( abs(dest - sectors[i].CenterFloor()), - sectors[i].floorplane.PointToDist (CenterSpot(§ors[i]), dest), + sectors[i].floorplane.PointToDist (sectors[i].centerspot, dest), crush? 10:-1, (dest > sectors[i].CenterFloor()) ? 1 : -1)) { @@ -1699,7 +1699,7 @@ void FParser::SF_MoveFloor(void) // Don't start a second thinker on the same floor if (sec->floordata) continue; - new DMoveFloor(sec,sec->floorplane.PointToDist(CenterSpot(sec),destheight), + new DMoveFloor(sec,sec->floorplane.PointToDist(sec->centerspot,destheight), destheight < sec->CenterFloor() ? -1:1,crush,platspeed); } } @@ -1763,7 +1763,7 @@ void FParser::SF_CeilingHeight(void) DCeilingChanger * c = new DCeilingChanger(§ors[i]); if (!c->Move( abs(dest - sectors[i].CenterCeiling()), - sectors[i].ceilingplane.PointToDist (CenterSpot(§ors[i]), dest), + sectors[i].ceilingplane.PointToDist (sectors[i].centerspot, dest), crush? 10:-1, (dest > sectors[i].CenterCeiling()) ? 1 : -1)) { @@ -1807,8 +1807,7 @@ public: m_Silent = silent; m_Type = DCeiling::ceilLowerByValue; // doesn't really matter as long as it's no special value m_Tag=tag; - vertex_t * spot=CenterSpot(sec); - m_TopHeight=m_BottomHeight=sec->ceilingplane.PointToDist(spot,destheight); + m_TopHeight=m_BottomHeight=sec->ceilingplane.PointToDist(sec->centerspot,destheight); m_Direction=destheight>sec->GetPlaneTexZ(sector_t::ceiling)? 1:-1; // Do not interpolate instant movement ceilings. diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index cec3b1c50..a11705152 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -476,13 +476,13 @@ void P_Recalculate3DFloors(sector_t * sector) while (oldlist.Size()) { pick=oldlist[0]; - fixed_t height=pick->top.plane->ZatPoint(CenterSpot(sector)); + fixed_t height=pick->top.plane->ZatPoint(sector->centerspot); // find highest starting ffloor - intersections are not supported! pickindex=0; for (j=1;jtop.plane->ZatPoint(CenterSpot(sector)); + fixed_t h2=oldlist[j]->top.plane->ZatPoint(sector->centerspot); if (h2>height) { @@ -493,7 +493,7 @@ void P_Recalculate3DFloors(sector_t * sector) } oldlist.Delete(pickindex); - fixed_t pick_bottom=pick->bottom.plane->ZatPoint(CenterSpot(sector)); + fixed_t pick_bottom=pick->bottom.plane->ZatPoint(sector->centerspot); if (pick->flags & FF_THISINSIDE) { @@ -607,7 +607,7 @@ void P_Recalculate3DFloors(sector_t * sector) if ( !(rover->flags & FF_EXISTS) || rover->flags & FF_NOSHADE ) continue; - fixed_t ff_top=rover->top.plane->ZatPoint(CenterSpot(sector)); + fixed_t ff_top=rover->top.plane->ZatPoint(sector->centerspot); if (ff_top < minheight) break; // reached the floor if (ff_top < maxheight) { @@ -622,7 +622,7 @@ void P_Recalculate3DFloors(sector_t * sector) } else { - fixed_t ff_bottom=rover->bottom.plane->ZatPoint(CenterSpot(sector)); + fixed_t ff_bottom=rover->bottom.plane->ZatPoint(sector->centerspot); if (ff_bottomflags&FF_DOUBLESHADOW) { - fixed_t ff_bottom=rover->bottom.plane->ZatPoint(CenterSpot(sector)); + fixed_t ff_bottom=rover->bottom.plane->ZatPoint(sector->centerspot); if(ff_bottom < maxheight && ff_bottom>minheight) { newlight.caster = rover; @@ -736,11 +736,11 @@ lightlist_t * P_GetPlaneLight(sector_t * sector, secplane_t * plane, bool unders unsigned i; TArray &lightlist = sector->e->XFloor.lightlist; - fixed_t planeheight=plane->ZatPoint(CenterSpot(sector)); + fixed_t planeheight=plane->ZatPoint(sector->centerspot); if(underside) planeheight--; for(i = 1; i < lightlist.Size(); i++) - if (lightlist[i].plane.ZatPoint(CenterSpot(sector)) <= planeheight) + if (lightlist[i].plane.ZatPoint(sector->centerspot) <= planeheight) return &lightlist[i - 1]; return &lightlist[lightlist.Size() - 1]; @@ -1000,8 +1000,8 @@ CCMD (dump3df) for (unsigned int i = 0; i < ffloors.Size(); i++) { - fixed_t height=ffloors[i]->top.plane->ZatPoint(CenterSpot(sector)); - fixed_t bheight=ffloors[i]->bottom.plane->ZatPoint(CenterSpot(sector)); + fixed_t height=ffloors[i]->top.plane->ZatPoint(sector->centerspot); + fixed_t bheight=ffloors[i]->bottom.plane->ZatPoint(sector->centerspot); IGNORE_FORMAT_PRE Printf("FFloor %d @ top = %f (model = %d), bottom = %f (model = %d), flags = %B, alpha = %d %s %s\n", diff --git a/src/p_3dfloors.h b/src/p_3dfloors.h index 51761d31b..fcfbb63d0 100644 --- a/src/p_3dfloors.h +++ b/src/p_3dfloors.h @@ -2,8 +2,6 @@ #define __SECTORE_H -#define CenterSpot(sec) (vertex_t*)&(sec)->soundorg[0] - // 3D floor flags. Most are the same as in Legacy but I added some for EDGE's and Vavoom's features as well. typedef enum { diff --git a/src/p_floor.cpp b/src/p_floor.cpp index d91c05170..86a54dc0d 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -343,16 +343,16 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, floor->m_Speed = height; case DFloor::floorLowerByValue: floor->m_Direction = -1; - newheight = sec->floorplane.ZatPoint (sec->soundorg[0], sec->soundorg[1]) - height; - floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->soundorg[0], sec->soundorg[1], newheight); + newheight = sec->CenterFloor() - height; + floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->centerspot, newheight); break; case DFloor::floorRaiseInstant: floor->m_Speed = height; case DFloor::floorRaiseByValue: floor->m_Direction = 1; - newheight = sec->floorplane.ZatPoint (sec->soundorg[0], sec->soundorg[1]) + height; - floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->soundorg[0], sec->soundorg[1], newheight); + newheight = sec->CenterFloor() + height; + floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->centerspot, newheight); break; case DFloor::floorMoveToValue: @@ -412,8 +412,8 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, case DFloor::floorLowerByTexture: floor->m_Direction = -1; - newheight = sec->floorplane.ZatPoint (sec->soundorg[0], sec->soundorg[1]) - sec->FindShortestTextureAround (); - floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->soundorg[0], sec->soundorg[1], newheight); + newheight = sec->CenterFloor() - sec->FindShortestTextureAround (); + floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->centerspot, newheight); break; case DFloor::floorLowerToCeiling: @@ -429,14 +429,14 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, // since the code is identical to what was here. (Oddly // enough, BOOM preserved the code here even though it // also had this function.) - newheight = sec->floorplane.ZatPoint (sec->soundorg[0], sec->soundorg[1]) + sec->FindShortestTextureAround (); - floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->soundorg[0], sec->soundorg[1], newheight); + newheight = sec->CenterFloor() + sec->FindShortestTextureAround (); + floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->centerspot, newheight); break; case DFloor::floorRaiseAndChange: floor->m_Direction = 1; - newheight = sec->floorplane.ZatPoint (sec->soundorg[0], sec->soundorg[1]) + height; - floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->soundorg[0], sec->soundorg[1], newheight); + newheight = sec->CenterFloor() + height; + floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->centerspot, newheight); if (line != NULL) { FTextureID oldpic = sec->GetTexture(sector_t::floor); @@ -619,8 +619,8 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, floor->m_Hexencrush = false; floor->m_Speed = speed; - height = sec->floorplane.ZatPoint (sec->soundorg[0], sec->soundorg[1]) + stairstep; - floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->soundorg[0], sec->soundorg[1], height); + height = sec->CenterFloor() + stairstep; + floor->m_FloorDestDist = sec->floorplane.PointToDist (sec->centerspot, height); texture = sec->GetTexture(sector_t::floor); osecnum = secnum; //jff 3/4/98 preserve loop index @@ -1037,15 +1037,15 @@ bool EV_DoElevator (line_t *line, DElevator::EElevator elevtype, // [RH] elevate up by a specific amount case DElevator::elevateRaise: elevator->m_Direction = 1; - elevator->m_FloorDestDist = sec->floorplane.PointToDist (sec->soundorg[0], sec->soundorg[1], floorheight + height); - elevator->m_CeilingDestDist = sec->ceilingplane.PointToDist (sec->soundorg[0], sec->soundorg[1], ceilingheight + height); + elevator->m_FloorDestDist = sec->floorplane.PointToDist (sec->centerspot, floorheight + height); + elevator->m_CeilingDestDist = sec->ceilingplane.PointToDist (sec->centerspot, ceilingheight + height); break; // [RH] elevate down by a specific amount case DElevator::elevateLower: elevator->m_Direction = -1; - elevator->m_FloorDestDist = sec->floorplane.PointToDist (sec->soundorg[0], sec->soundorg[1], floorheight - height); - elevator->m_CeilingDestDist = sec->ceilingplane.PointToDist (sec->soundorg[0], sec->soundorg[1], ceilingheight - height); + elevator->m_FloorDestDist = sec->floorplane.PointToDist (sec->centerspot, floorheight - height); + elevator->m_CeilingDestDist = sec->ceilingplane.PointToDist (sec->centerspot, ceilingheight - height); break; } } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 1af76d6d9..8a65c31b4 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -3273,8 +3273,8 @@ FUNC(LS_GlassBreak) x = ln->v1->x + ln->dx/2; y = ln->v1->y + ln->dy/2; - x += (ln->frontsector->soundorg[0] - x) / 5; - y += (ln->frontsector->soundorg[1] - y) / 5; + x += (ln->frontsector->centerspot.x - x) / 5; + y += (ln->frontsector->centerspot.y - y) / 5; for (int i = 0; i < 7; ++i) { diff --git a/src/p_pillar.cpp b/src/p_pillar.cpp index b1cae3af9..8ac1759ed 100644 --- a/src/p_pillar.cpp +++ b/src/p_pillar.cpp @@ -144,15 +144,15 @@ DPillar::DPillar (sector_t *sector, EPillar type, fixed_t speed, if (floordist == 0) { newheight = (sector->CenterFloor () + sector->CenterCeiling ()) / 2; - m_FloorTarget = sector->floorplane.PointToDist (sector->soundorg[0], sector->soundorg[1], newheight); - m_CeilingTarget = sector->ceilingplane.PointToDist (sector->soundorg[0], sector->soundorg[1], newheight); + m_FloorTarget = sector->floorplane.PointToDist (sector->centerspot, newheight); + m_CeilingTarget = sector->ceilingplane.PointToDist (sector->centerspot, newheight); floordist = newheight - sector->CenterFloor (); } else { newheight = sector->CenterFloor () + floordist; - m_FloorTarget = sector->floorplane.PointToDist (sector->soundorg[0], sector->soundorg[1], newheight); - m_CeilingTarget = sector->ceilingplane.PointToDist (sector->soundorg[0], sector->soundorg[1], newheight); + m_FloorTarget = sector->floorplane.PointToDist (sector->centerspot, newheight); + m_CeilingTarget = sector->ceilingplane.PointToDist (sector->centerspot, newheight); } ceilingdist = sector->CenterCeiling () - newheight; } @@ -168,8 +168,8 @@ DPillar::DPillar (sector_t *sector, EPillar type, fixed_t speed, } else { - newheight = sector->floorplane.ZatPoint (0, 0) - floordist; - m_FloorTarget = sector->floorplane.PointToDist (0, 0, newheight); + newheight = sector->CenterFloor() - floordist; + m_FloorTarget = sector->floorplane.PointToDist (sector->centerspot, newheight); } if (ceilingdist == 0) { @@ -179,8 +179,8 @@ DPillar::DPillar (sector_t *sector, EPillar type, fixed_t speed, } else { - newheight = sector->ceilingplane.ZatPoint (0, 0) + ceilingdist; - m_CeilingTarget = sector->ceilingplane.PointToDist (0, 0, newheight); + newheight = sector->CenterCeiling() + ceilingdist; + m_CeilingTarget = sector->ceilingplane.PointToDist (sector->centerspot, newheight); } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index b1cb43c25..e5da17126 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -3221,9 +3221,9 @@ static void P_GroupLines (bool buildmap) } } - // set the soundorg to the middle of the bounding box - sector->soundorg[0] = bbox.Right()/2 + bbox.Left()/2; - sector->soundorg[1] = bbox.Top()/2 + bbox.Bottom()/2; + // set the center to the middle of the bounding box + sector->centerspot.x = bbox.Right()/2 + bbox.Left()/2; + sector->centerspot.y = bbox.Top()/2 + bbox.Bottom()/2; // For triangular sectors the above does not calculate good points unless the longest of the triangle's lines is perfectly horizontal and vertical if (sector->linecount == 3) @@ -3245,8 +3245,8 @@ static void P_GroupLines (bool buildmap) if (DMulScale32 (v->y - Triangle[0]->y, dx, Triangle[0]->x - v->x, dy) != 0) { - sector->soundorg[0] = Triangle[0]->x / 3 + Triangle[1]->x / 3 + v->x / 3; - sector->soundorg[1] = Triangle[0]->y / 3 + Triangle[1]->y / 3 + v->y / 3; + sector->centerspot.x = Triangle[0]->x / 3 + Triangle[1]->x / 3 + v->x / 3; + sector->centerspot.y = Triangle[0]->y / 3 + Triangle[1]->y / 3 + v->y / 3; break; } } diff --git a/src/r_bsp.cpp b/src/r_bsp.cpp index a95bd97a0..51e89ac9e 100644 --- a/src/r_bsp.cpp +++ b/src/r_bsp.cpp @@ -1182,9 +1182,9 @@ void R_Subsector (subsector_t *sub) fakeFloor->validcount = validcount; R_3D_NewClip(); } - fakeHeight = fakeFloor->top.plane->ZatPoint(frontsector->soundorg[0], frontsector->soundorg[0]); + fakeHeight = fakeFloor->top.plane->ZatPoint(frontsector->centerspot); if (fakeHeight < viewz && - fakeHeight > frontsector->floorplane.ZatPoint(frontsector->soundorg[0], frontsector->soundorg[1])) + fakeHeight > frontsector->floorplane.ZatPoint(frontsector->centerspot)) { fake3D = FAKE3D_FAKEFLOOR; tempsec = *fakeFloor->model; @@ -1244,9 +1244,9 @@ void R_Subsector (subsector_t *sub) fakeFloor->validcount = validcount; R_3D_NewClip(); } - fakeHeight = fakeFloor->bottom.plane->ZatPoint(frontsector->soundorg[0], frontsector->soundorg[1]); + fakeHeight = fakeFloor->bottom.plane->ZatPoint(frontsector->centerspot); if (fakeHeight > viewz && - fakeHeight < frontsector->ceilingplane.ZatPoint(frontsector->soundorg[0], frontsector->soundorg[1])) + fakeHeight < frontsector->ceilingplane.ZatPoint(frontsector->centerspot)) { fake3D = FAKE3D_FAKECEILING; tempsec = *fakeFloor->model; diff --git a/src/r_defs.h b/src/r_defs.h index ab55201f9..a25179fb1 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -340,6 +340,11 @@ struct secplane_t return -TMulScale16 (a, x, y, b, z, c); } + fixed_t PointToDist(fixedvec2 xy, fixed_t z) const + { + return -TMulScale16(a, xy.x, xy.y, b, z, c); + } + fixed_t PointToDist (const vertex_t *v, fixed_t z) const { return -TMulScale16 (a, v->x, b, v->y, z, c); @@ -825,8 +830,8 @@ struct sector_t } // Member variables - fixed_t CenterFloor () const { return floorplane.ZatPoint (soundorg[0], soundorg[1]); } - fixed_t CenterCeiling () const { return ceilingplane.ZatPoint (soundorg[0], soundorg[1]); } + fixed_t CenterFloor () const { return floorplane.ZatPoint (centerspot); } + fixed_t CenterCeiling () const { return ceilingplane.ZatPoint (centerspot); } // [RH] store floor and ceiling planes instead of heights secplane_t floorplane, ceilingplane; @@ -844,7 +849,7 @@ struct sector_t int sky; FNameNoInit SeqName; // Sound sequence name. Setting seqType non-negative will override this. - fixed_t soundorg[2]; // origin for any sounds played by the sector + fixedvec2 centerspot; // origin for any sounds played by the sector int validcount; // if == validcount, already checked AActor* thinglist; // list of mobjs in sector diff --git a/src/s_sound.cpp b/src/s_sound.cpp index e61a0f701..7db77375d 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -709,8 +709,8 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, } else { - x = sector->soundorg[0]; - z = sector->soundorg[1]; + x = sector->centerspot.x; + z = sector->centerspot.y; chanflags |= CHAN_LISTENERZ; } } @@ -776,8 +776,8 @@ static void CalcSectorSoundOrg(const sector_t *sec, int channum, fixed_t *x, fix } else { - *x = sec->soundorg[0]; - *y = sec->soundorg[1]; + *x = sec->centerspot.x; + *y = sec->centerspot.y; } // Set sound vertical position based on channel. From e11da06e69f52f35fad844a72e16b99b45916694 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 25 Feb 2016 00:41:31 +0100 Subject: [PATCH 2/4] - some preparations for actor interpolation through wall portals. --- src/actor.h | 8 +++----- src/g_level.cpp | 1 + src/g_shared/a_fastprojectile.cpp | 5 +---- src/g_shared/a_movingcamera.cpp | 5 +---- src/g_shared/a_pickups.cpp | 4 +--- src/p_enemy.cpp | 6 +++--- src/p_map.cpp | 4 ---- src/p_maputl.cpp | 3 ++- src/p_mobj.cpp | 18 ++++++----------- src/p_things.cpp | 32 ++++++++++++++++++------------- src/r_defs.h | 10 ++++++++++ src/thingdef/thingdef_codeptr.cpp | 1 - 12 files changed, 47 insertions(+), 50 deletions(-) diff --git a/src/actor.h b/src/actor.h index 15c2ea2ab..8492c81a3 100644 --- a/src/actor.h +++ b/src/actor.h @@ -912,6 +912,8 @@ public: return ret; } + void ClearInterpolation(); + void Move(fixed_t dx, fixed_t dy, fixed_t dz) { SetOrigin(X() + dx, Y() + dy, Z() + dz, true); @@ -1120,6 +1122,7 @@ public: // [RH] Used to interpolate the view to get >35 FPS fixed_t PrevX, PrevY, PrevZ; angle_t PrevAngle; + int PrevPortalGroup; // ThingIDs static void ClearTIDHashes (); @@ -1253,11 +1256,6 @@ public: __pos.y = npos.y; __pos.z = npos.z; } - void SetMovement(fixed_t x, fixed_t y, fixed_t z) - { - // not yet implemented - } - }; class FActorIterator diff --git a/src/g_level.cpp b/src/g_level.cpp index cfdfef9f5..d44d1a97e 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1257,6 +1257,7 @@ void G_FinishTravel () oldpawn->Destroy(); pawndup->Destroy (); pawn->LinkToWorld (); + pawn->ClearInterpolation(); pawn->AddToHash (); pawn->SetState(pawn->SpawnState); pawn->player->SendPitchLimits(); diff --git a/src/g_shared/a_fastprojectile.cpp b/src/g_shared/a_fastprojectile.cpp index ca57ad557..b6085e07c 100644 --- a/src/g_shared/a_fastprojectile.cpp +++ b/src/g_shared/a_fastprojectile.cpp @@ -27,11 +27,8 @@ void AFastProjectile::Tick () fixed_t zfrac; int changexy; - PrevX = X(); - PrevY = Y(); - PrevZ = Z(); + ClearInterpolation(); fixed_t oldz = Z(); - PrevAngle = angle; if (!(flags5 & MF5_NOTIMEFREEZE)) { diff --git a/src/g_shared/a_movingcamera.cpp b/src/g_shared/a_movingcamera.cpp index 87a6e71ec..86f872798 100644 --- a/src/g_shared/a_movingcamera.cpp +++ b/src/g_shared/a_movingcamera.cpp @@ -590,10 +590,7 @@ void AActorMover::Activate (AActor *activator) // Don't let the renderer interpolate between the actor's // old position and its new position. Interpolate (); - tracer->PrevX = tracer->X(); - tracer->PrevY = tracer->Y(); - tracer->PrevZ = tracer->Z(); - tracer->PrevAngle = tracer->angle; + tracer->ClearInterpolation(); } void AActorMover::Deactivate (AActor *activator) diff --git a/src/g_shared/a_pickups.cpp b/src/g_shared/a_pickups.cpp index f66659df9..5f5362ab0 100644 --- a/src/g_shared/a_pickups.cpp +++ b/src/g_shared/a_pickups.cpp @@ -458,9 +458,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_RestoreSpecialPosition) } // Do not interpolate from the position the actor was at when it was // picked up, in case that is different from where it is now. - self->PrevX = self->X(); - self->PrevY = self->Y(); - self->PrevZ = self->Z(); + self->ClearInterpolation(); return 0; } diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 2049d5f22..ed9abdcb9 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -525,9 +525,7 @@ bool P_Move (AActor *actor) // so make it switchable if (nomonsterinterpolation) { - actor->PrevX = actor->X(); - actor->PrevY = actor->Y(); - actor->PrevZ = actor->Z(); + actor->ClearInterpolation(); } if (try_ok && friction > ORIG_FRICTION) @@ -2520,6 +2518,7 @@ void A_DoChase (VMFrameStack *stack, AActor *actor, bool fastchase, FState *mele // CANTLEAVEFLOORPIC handling was completely missing in the non-serpent functions. fixed_t oldX = actor->X(); fixed_t oldY = actor->Y(); + int oldgroup = actor->PrevPortalGroup; FTextureID oldFloor = actor->floorpic; // chase towards player @@ -2537,6 +2536,7 @@ void A_DoChase (VMFrameStack *stack, AActor *actor, bool fastchase, FState *mele { actor->PrevX = oldX; actor->PrevY = oldY; + actor->PrevPortalGroup = oldgroup; } } if (!(flags & CHF_STOPIFBLOCKED)) diff --git a/src/p_map.cpp b/src/p_map.cpp index d68771b22..66b4d39e4 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -508,10 +508,6 @@ bool P_TeleportMove(AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefra R_ResetViewInterpolation(); } - thing->PrevX = x; - thing->PrevY = y; - thing->PrevZ = z; - // If this teleport was caused by a move, P_TryMove() will handle the // sector transition messages better than we can here. if (!(thing->flags6 & MF6_INTRYMOVE)) diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 1f32d6faa..2835896f9 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -416,6 +416,7 @@ bool AActor::FixMapthingPos() // Get the distance we have to move the object away from the wall distance = radius - distance; SetXY(X() + FixedMul(distance, finecosine[finean]), Y() + FixedMul(distance, finesine[finean])); + ClearInterpolation(); success = true; } } @@ -533,9 +534,9 @@ void AActor::SetOrigin (fixed_t ix, fixed_t iy, fixed_t iz, bool moving) { UnlinkFromWorld (); SetXYZ(ix, iy, iz); - if (moving) SetMovement(ix - X(), iy - Y(), iz - Z()); LinkToWorld (); P_FindFloorCeiling(this, FFCF_ONLYSPAWNPOS); + if (!moving) ClearInterpolation(); } //=========================================================================== diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index dafbaffba..51a671369 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -473,10 +473,7 @@ void AActor::Serialize (FArchive &arc) Speed = GetDefault()->Speed; } } - PrevX = X(); - PrevY = Y(); - PrevZ = Z(); - PrevAngle = angle; + ClearInterpolation(); UpdateWaterLevel(Z(), false); } } @@ -3304,6 +3301,7 @@ void AActor::CheckPortalTransition(bool islinked) PrevY += Y() - oldpos.y; PrevZ += Z() - oldpos.z; Sector = P_PointInSector(X(), Y()); + PrevPortalGroup = Sector->PortalGroup; moved = true; } else break; @@ -3322,6 +3320,7 @@ void AActor::CheckPortalTransition(bool islinked) PrevY += Y() - oldpos.y; PrevZ += Z() - oldpos.z; Sector = P_PointInSector(X(), Y()); + PrevPortalGroup = Sector->PortalGroup; moved = true; } else break; @@ -3368,10 +3367,7 @@ void AActor::Tick () // This is necessary to properly interpolate movement outside this function // like from an ActorMover - PrevX = X(); - PrevY = Y(); - PrevZ = Z(); - PrevAngle = angle; + ClearInterpolation(); if (flags5 & MF5_NOINTERACTION) { @@ -3398,7 +3394,6 @@ void AActor::Tick () flags |= MF_NOBLOCKMAP; SetXYZ(Vec3Offset(velx, vely, velz)); CheckPortalTransition(false); - SetMovement(velx, vely, velz); LinkToWorld (); } else @@ -4157,9 +4152,6 @@ AActor *AActor::StaticSpawn (PClassActor *type, fixed_t ix, fixed_t iy, fixed_t actor->Conversation = NULL; } - actor->PrevX = ix; - actor->PrevY = iy; - actor->PrevZ = iz; actor->SetXYZ(ix, iy, iz); actor->picnum.SetInvalid(); actor->health = actor->SpawnHealth(); @@ -4195,6 +4187,7 @@ AActor *AActor::StaticSpawn (PClassActor *type, fixed_t ix, fixed_t iy, fixed_t // set subsector and/or block links actor->LinkToWorld (SpawningMapThing); + actor->ClearInterpolation(); actor->dropoffz = // killough 11/98: for tracking dropoffs actor->floorz = actor->Sector->floorplane.ZatPoint (ix, iy); @@ -5822,6 +5815,7 @@ bool P_CheckMissileSpawn (AActor* th, fixed_t maxdist) return false; } } + th->ClearInterpolation(); return true; } diff --git a/src/p_things.cpp b/src/p_things.cpp index 1c8a4a46d..f12083bc4 100644 --- a/src/p_things.cpp +++ b/src/p_things.cpp @@ -130,7 +130,7 @@ bool P_MoveThing(AActor *source, fixed_t x, fixed_t y, fixed_t z, bool fog) oldy = source->Y(); oldz = source->Z(); - source->SetOrigin (x, y, z, false); + source->SetOrigin (x, y, z, true); if (P_TestMobjLocation (source)) { if (fog) @@ -138,9 +138,7 @@ bool P_MoveThing(AActor *source, fixed_t x, fixed_t y, fixed_t z, bool fog) P_SpawnTeleportFog(source, x, y, z, false, true); P_SpawnTeleportFog(source, oldx, oldy, oldz, true, true); } - source->PrevX = x; - source->PrevY = y; - source->PrevZ = z; + source->ClearInterpolation(); if (source == players[consoleplayer].camera) { R_ResetViewInterpolation(); @@ -149,7 +147,7 @@ bool P_MoveThing(AActor *source, fixed_t x, fixed_t y, fixed_t z, bool fog) } else { - source->SetOrigin (oldx, oldy, oldz, false); + source->SetOrigin (oldx, oldy, oldz, true); return false; } } @@ -695,6 +693,8 @@ int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs, } fixedvec3 old = caller->Pos(); + int oldpgroup = caller->Sector->PortalGroup; + zofs += FixedMul(reference->height, heightoffset); @@ -744,12 +744,12 @@ int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs, { if (flags & WARPF_TOFLOOR) { - caller->SetOrigin(xofs + FixedMul(rad, finecosine[fineangle]), yofs + FixedMul(rad, finesine[fineangle]), zofs); + caller->SetOrigin(xofs + FixedMul(rad, finecosine[fineangle]), yofs + FixedMul(rad, finesine[fineangle]), zofs, true); caller->SetZ(caller->floorz + zofs); } else { - caller->SetOrigin(xofs + FixedMul(rad, finecosine[fineangle]), yofs + FixedMul(rad, finesine[fineangle]), zofs); + caller->SetOrigin(xofs + FixedMul(rad, finecosine[fineangle]), yofs + FixedMul(rad, finesine[fineangle]), zofs, true); } } @@ -782,23 +782,29 @@ int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs, caller->velz = 0; } + // this is no fun with line portals if (flags & WARPF_WARPINTERPOLATION) { - caller->PrevX += caller->X() - old.x; - caller->PrevY += caller->Y() - old.y; - caller->PrevZ += caller->Z() - old.z; + // This just translates the movement but doesn't change the vector + fixedvec3 displacedold = old + Displacements(oldpgroup, caller->Sector->PortalGroup); + caller->PrevX += caller->X() - displacedold.x; + caller->PrevY += caller->Y() - displacedold.y; + caller->PrevZ += caller->Z() - displacedold.z; + caller->PrevPortalGroup = caller->Sector->PortalGroup; } else if (flags & WARPF_COPYINTERPOLATION) { + // Map both positions of the reference actor to the current portal group + fixedvec3 displacedold = old + Displacements(reference->PrevPortalGroup, caller->Sector->PortalGroup); + fixedvec3 displacedref = old + Displacements(reference->Sector->PortalGroup, caller->Sector->PortalGroup); caller->PrevX = caller->X() + reference->PrevX - reference->X(); caller->PrevY = caller->Y() + reference->PrevY - reference->Y(); caller->PrevZ = caller->Z() + reference->PrevZ - reference->Z(); + caller->PrevPortalGroup = caller->Sector->PortalGroup; } else if (!(flags & WARPF_INTERPOLATE)) { - caller->PrevX = caller->X(); - caller->PrevY = caller->Y(); - caller->PrevZ = caller->Z(); + caller->ClearInterpolation(); } if ((flags & WARPF_BOB) && (reference->flags2 & MF2_FLOATBOB)) { diff --git a/src/r_defs.h b/src/r_defs.h index a25179fb1..78c61ec90 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -1278,4 +1278,14 @@ inline fixedvec3 PosRelative(const fixedvec3 &pos, line_t *line, sector_t *refse return pos + Displacements(refsec->PortalGroup, line->frontsector->PortalGroup); } +inline void AActor::ClearInterpolation() +{ + PrevX = X(); + PrevY = Y(); + PrevZ = Z(); + PrevAngle = angle; + PrevPortalGroup = Sector->PortalGroup; +} + + #endif diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp index 2cf05778b..e03d674c7 100644 --- a/src/thingdef/thingdef_codeptr.cpp +++ b/src/thingdef/thingdef_codeptr.cpp @@ -4983,7 +4983,6 @@ void A_Weave(AActor *self, int xyspeed, int zspeed, fixed_t xydist, fixed_t zdis newX -= self->X(); newY -= self->Y(); self->SetXY(self->Vec2Offset(newX, newY)); - self->SetMovement(newX, newY, 0); self->LinkToWorld (); } self->WeaveIndexXY = weaveXY; From 5b99691fd48918657b8463c93e3d1812724de1c1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 25 Feb 2016 01:09:01 +0100 Subject: [PATCH 3/4] - updated xlat/eternity.txt --- wadsrc/static/xlat/eternity.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/wadsrc/static/xlat/eternity.txt b/wadsrc/static/xlat/eternity.txt index 04d5febff..a95028d28 100644 --- a/wadsrc/static/xlat/eternity.txt +++ b/wadsrc/static/xlat/eternity.txt @@ -207,3 +207,10 @@ enum 416 = 0, Floor_LowerToHighest(0) 420 = 0, ACS_ExecuteWithResult(0) 421 = 0, Thing_ChangeTID(0) +422 = 0, Thing_Raise(0) +423 = 0, Thing_Stop(0) +424 = 0, ThrustThing(0) +425 = 0, ThrustThingZ(0) +426 = 0, DamageThing(0) +427 = 0, Thing_Damage(0) +428 = 0, Thing_Destroy(0) From 208ad14badd70779cb4e5f9cf73fddbef8b134d1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 25 Feb 2016 01:24:09 +0100 Subject: [PATCH 4/4] - this wasn't saved when I committed the interpolation stuff. --- src/p_things.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/p_things.cpp b/src/p_things.cpp index f12083bc4..357fdcef6 100644 --- a/src/p_things.cpp +++ b/src/p_things.cpp @@ -797,9 +797,9 @@ int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs, // Map both positions of the reference actor to the current portal group fixedvec3 displacedold = old + Displacements(reference->PrevPortalGroup, caller->Sector->PortalGroup); fixedvec3 displacedref = old + Displacements(reference->Sector->PortalGroup, caller->Sector->PortalGroup); - caller->PrevX = caller->X() + reference->PrevX - reference->X(); - caller->PrevY = caller->Y() + reference->PrevY - reference->Y(); - caller->PrevZ = caller->Z() + reference->PrevZ - reference->Z(); + caller->PrevX = caller->X() + displacedold.x - displacedref.x; + caller->PrevY = caller->Y() + displacedold.y - displacedref.y; + caller->PrevZ = caller->Z() + displacedold.z - displacedref.z; caller->PrevPortalGroup = caller->Sector->PortalGroup; } else if (!(flags & WARPF_INTERPOLATE))