From 32c6baf2fc73976b787478c78284effd39285210 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 2 Mar 2023 17:25:46 -0500 Subject: [PATCH] Fix + improve podium camera movement - Record starting position properly for easing - Uses linear easing now (everything else ended up looking bad with multiple waypoints, would to calculate splines if you wanted to ease that) - arg4 is now how long the camera spends between each waypoint --- src/p_mobj.c | 33 +++++++++++++++++++-------------- src/p_spec.c | 15 +++++++++++++++ 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 66b7011cc..aa9ff6974 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9493,24 +9493,23 @@ static boolean P_MobjRegularThink(mobj_t *mobj) { mobj->momx = mobj->momy = mobj->momz = 0; + if (mobj->movefactor <= 0) + { + mobj->movefactor = FRACUNIT / TICRATE; // default speed + } + if (mobj->tracer != NULL && P_MobjWasRemoved(mobj->tracer) == false) { - fixed_t dist = P_AproxDistance( - P_AproxDistance( - mobj->tracer->x - mobj->x, - mobj->tracer->y - mobj->y - ), - mobj->tracer->z - mobj->z - ); + mobj->movecount += mobj->movefactor; - mobj->angle = Easing_OutSine(FRACUNIT/8, mobj->angle, mobj->tracer->angle); - mobj->pitch = Easing_OutSine(FRACUNIT/8, mobj->pitch, mobj->tracer->pitch); - - if (dist > mobj->radius) + if (mobj->movecount < FRACUNIT) { - fixed_t newX = Easing_OutSine(FRACUNIT/8, mobj->x, mobj->tracer->x); - fixed_t newY = Easing_OutSine(FRACUNIT/8, mobj->y, mobj->tracer->y); - fixed_t newZ = Easing_OutSine(FRACUNIT/8, mobj->z, mobj->tracer->z); + fixed_t newX = Easing_Linear(mobj->movecount, mobj->extravalue1, mobj->tracer->x); + fixed_t newY = Easing_Linear(mobj->movecount, mobj->extravalue2, mobj->tracer->y); + fixed_t newZ = Easing_Linear(mobj->movecount, mobj->cusval, mobj->tracer->z); + + mobj->angle = Easing_Linear(mobj->movecount, mobj->movedir, mobj->tracer->angle); + mobj->pitch = Easing_Linear(mobj->movecount, mobj->lastlook, mobj->tracer->pitch); mobj->momx = newX - mobj->x; mobj->momy = newY - mobj->y; @@ -9519,6 +9518,12 @@ static boolean P_MobjRegularThink(mobj_t *mobj) else { P_SetTarget(&mobj->tracer, P_GetNextTubeWaypoint(mobj->tracer, false)); + mobj->movecount = 0; // time + mobj->movedir = mobj->angle; // start angle + mobj->lastlook = mobj->pitch; // start pitch + mobj->extravalue1 = mobj->x; // start x + mobj->extravalue2 = mobj->y; // start y + mobj->cusval = mobj->z; // start z } } diff --git a/src/p_spec.c b/src/p_spec.c index 74397cd8f..ebe0ad37f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3105,6 +3105,21 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha &newViewMobj->tracer, P_GetFirstTubeWaypoint(args[3] - 1) ); + newViewMobj->movecount = 0; // time + newViewMobj->movedir = newViewMobj->angle; // start angle + newViewMobj->lastlook = newViewMobj->pitch; // start pitch + newViewMobj->extravalue1 = newViewMobj->x; // start x + newViewMobj->extravalue2 = newViewMobj->y; // start y + newViewMobj->cusval = newViewMobj->z; // start z + + if (args[4] > 0) + { + newViewMobj->movefactor = FRACUNIT / args[4]; + } + else + { + newViewMobj->movefactor = FRACUNIT / TICRATE; // default speed + } } else {