From e11da06e69f52f35fad844a72e16b99b45916694 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 25 Feb 2016 00:41:31 +0100 Subject: [PATCH] - 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;