From 88207e18f9a23046fb1cce03f3ee693902dbd7ff Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 22 Dec 2019 01:16:57 -0600 Subject: [PATCH] Ensure viewsector is accurate to viewx/viewy This fixes a potential crash in OpenGL when changing between levels. --- src/r_fps.c | 39 ++++++++++++++------------------------- src/r_fps.h | 5 ----- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/src/r_fps.c b/src/r_fps.c index 519288bab..ce30fd48e 100644 --- a/src/r_fps.c +++ b/src/r_fps.c @@ -39,6 +39,16 @@ viewvars_t *newview = &p1view_new; enum viewcontext_e viewcontext = VIEWCONTEXT_PLAYER1; +static fixed_t R_LerpFixed(fixed_t from, fixed_t to, fixed_t frac) +{ + return FixedMul(frac, to - from); +} + +static angle_t R_LerpAngle(angle_t from, angle_t to, fixed_t frac) +{ + return FixedMul(frac, to - from); +} + // recalc necessary stuff for mouseaiming // slopes are already calculated for the full possible view (which is 4*viewheight). // 18/08/18: (No it's actually 16*viewheight, thanks Jimita for finding this out) @@ -80,6 +90,8 @@ void R_InterpolateView(fixed_t frac) boolean skybox = 0; if (FIXED_TO_FLOAT(frac) < 0) frac = 0; + if (frac > FRACUNIT) + frac = FRACUNIT; viewx = oldview->x + R_LerpFixed(oldview->x, newview->x, frac); viewy = oldview->y + R_LerpFixed(oldview->y, newview->y, frac); @@ -93,16 +105,8 @@ void R_InterpolateView(fixed_t frac) // this is gonna create some interesting visual errors for long distance teleports... // might want to recalculate the view sector every frame instead... - if (frac >= FRACUNIT) - { - viewplayer = newview->player; - viewsector = newview->sector; - } - else - { - viewplayer = oldview->player; - viewsector = oldview->sector; - } + viewplayer = newview->player; + viewsector = R_PointInSubsector(viewx, viewy)->sector; // well, this ain't pretty if (newview == &sky1view_new || newview == &sky2view_new) @@ -152,18 +156,3 @@ void R_SetViewContext(enum viewcontext_e _viewcontext) break; } } - -fixed_t R_LerpFixed(fixed_t from, fixed_t to, fixed_t frac) -{ - return FixedMul(frac, to - from); -} - -INT32 R_LerpInt32(INT32 from, INT32 to, fixed_t frac) -{ - return FixedInt(FixedMul(frac, (to*FRACUNIT) - (from*FRACUNIT))); -} - -angle_t R_LerpAngle(angle_t from, angle_t to, fixed_t frac) -{ - return FixedMul(frac, to - from); -} diff --git a/src/r_fps.h b/src/r_fps.h index f9ee6f0de..6e3ff3adb 100644 --- a/src/r_fps.h +++ b/src/r_fps.h @@ -51,9 +51,4 @@ void R_UpdateViewInterpolation(void); // Set the current view context (the viewvars pointed to by newview) void R_SetViewContext(enum viewcontext_e _viewcontext); -fixed_t R_LerpFixed(fixed_t from, fixed_t to, fixed_t frac); -INT32 R_LerpInt32(INT32 from, INT32 to, fixed_t frac); -UINT32 R_LerpUInt32(UINT32 from, UINT32 to, fixed_t frac); -angle_t R_LerpAngle(angle_t from, angle_t to, fixed_t frac); - #endif