From 219acbb9cc0480a6eea26711df9cd9a260b2b9b5 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Wed, 27 Aug 2025 21:18:23 +0200 Subject: [PATCH] Rework rendertimefrac and gate it behind a function Fixes intermission background shifting when toggling fullscreen (yup) and fixes audio caption text losing interp when paused --- src/d_clisrv.c | 2 +- src/d_main.cpp | 29 +++--------- src/f_finale.c | 13 +++--- src/hardware/hw_main.c | 76 +++++--------------------------- src/hardware/hw_md2.c | 11 +---- src/hardware/r_opengl/r_opengl.c | 4 +- src/k_hud.c | 4 +- src/lua_hudlib_drawlist.c | 2 +- src/r_fps.c | 37 ++++++++++------ src/r_fps.h | 10 ++++- src/r_main.cpp | 14 +----- src/r_main.h | 9 ---- src/r_things.cpp | 63 +++----------------------- src/screen.c | 2 +- src/st_stuff.c | 4 +- src/v_video.c | 7 ++- src/y_inter.c | 5 ++- 17 files changed, 80 insertions(+), 212 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 5cee6c816..f4203fc7d 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2006,7 +2006,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic // Needs to be updated here for M_DrawEggaChannel renderdeltatics = FRACUNIT; - rendertimefrac = FRACUNIT; + R_SetTimeFrac(FRACUNIT); memset(deviceResponding, false, sizeof (deviceResponding)); diff --git a/src/d_main.cpp b/src/d_main.cpp index 813126e4d..979796d20 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -282,7 +282,7 @@ boolean D_RenderLevel(void) if (automapactive || dedicated || !cv_renderview.value || !levelloaded) return false; - R_ApplyLevelInterpolators(R_UsingFrameInterpolation() ? rendertimefrac : FRACUNIT); + R_ApplyLevelInterpolators(R_GetTimeFrac(RTF_LEVEL)); viewwindowy = 0; viewwindowx = 0; @@ -446,7 +446,7 @@ static void D_Display(void) for (i = 0; i <= r_splitscreen; ++i) { R_SetViewContext(static_cast(VIEWCONTEXT_PLAYER1 + i)); - R_InterpolateViewRollAngle(rendertimefrac); + R_InterpolateViewRollAngle(R_GetTimeFrac(RTF_LEVEL)); R_CheckViewMorph(i); } } @@ -882,7 +882,7 @@ void D_WipeLoop(wipelooptype_t type, UINT8 wipetype, boolean drawMenu) renderisnewtic = false; // draw loop - rendertimefrac = g_time.timefrac; + R_SetTimeFrac(g_time.timefrac); renderdeltatics = FLOAT_TO_FIXED(delta); #ifndef NOWIPE @@ -1016,7 +1016,7 @@ void D_SRB2Loop(void) debugload--; #endif - interp = R_UsingFrameInterpolation() && !dedicated; + interp = !dedicated && (R_GetFramerateCap() != TICRATE || cv_timescale.value < FRACUNIT); doDisplay = false; #ifdef HW3SOUND @@ -1080,29 +1080,12 @@ void D_SRB2Loop(void) I_UpdateTime(cv_timescale.value); - if (!(paused || P_AutoPause()) && !lagging) - { - rendertimefrac = g_time.timefrac; - } - else - { - rendertimefrac = FRACUNIT; - } - - if (!lagging) - { - rendertimefrac_unpaused = g_time.timefrac; - } - else - { - rendertimefrac_unpaused = FRACUNIT; - } + R_SetTimeFrac(lagging ? FRACUNIT : g_time.timefrac); } else { renderdeltatics = realtics * FRACUNIT; - rendertimefrac = FRACUNIT; - rendertimefrac_unpaused = FRACUNIT; + R_SetTimeFrac(FRACUNIT); } I_UpdateTime(cv_timescale.value); diff --git a/src/f_finale.c b/src/f_finale.c index 5f65da876..812302824 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -39,6 +39,7 @@ #include "p_setup.h" #include "st_stuff.h" // hud hiding #include "fastcmp.h" +#include "r_fps.h" // R_GetTimeFrac #include "lua_hud.h" #include "lua_hook.h" @@ -238,8 +239,8 @@ static void F_TitleBGScroll(INT32 scrollspeed) w = (vid.width / vid.dupx)<width)*16))<width)<width)*16))<width)*16))<width)<width)*16))<> FRACBITS, 1)+2; // one tile on both sides of center tiley = max(FixedCeil(FixedDiv(vid.height, ph)) >> FRACBITS, 1)+2; - fracmenuanimtimer = (menuanimtimer * FRACUNIT) - (FRACUNIT - rendertimefrac); + fracmenuanimtimer = (menuanimtimer * FRACUNIT) - (FRACUNIT - R_GetTimeFrac(RTF_MENU)); xscrolltimer = ((fracmenuanimtimer*scrollxspeed)/16 + patwidth*xneg*FRACUNIT) % (patwidth * FRACUNIT); yscrolltimer = ((fracmenuanimtimer*scrollyspeed)/16 + patheight*yneg*FRACUNIT) % (patheight * FRACUNIT); @@ -1427,7 +1428,7 @@ void F_TitleScreenDrawer(void) if (finalecount >= 20) V_DrawSmallScaledPatch(84, 87, 0, ttkart); else if (finalecount >= 10) - V_DrawSciencePatch((84<sprxoff; @@ -3262,27 +3255,13 @@ static void HWR_RotateSpritePolyToAim(gl_vissprite_t *spr, FOutVector *wallVerts interpmobjstate_t interp = {0}; // do interpolation - if (R_UsingFrameInterpolation() && !paused) + if (spr->precip) { - if (spr->precip) - { - R_InterpolatePrecipMobjState((precipmobj_t *)spr->mobj, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(spr->mobj, rendertimefrac, &interp); - } + R_InterpolatePrecipMobjState((precipmobj_t *)spr->mobj, R_GetTimeFrac(RTF_LEVEL), &interp); } else { - if (spr->precip) - { - R_InterpolatePrecipMobjState((precipmobj_t *)spr->mobj, FRACUNIT, &interp); - } - else - { - R_InterpolateMobjState(spr->mobj, FRACUNIT, &interp); - } + R_InterpolateMobjState(spr->mobj, R_GetTimeFrac(RTF_LEVEL), &interp); } float basey = FIXED_TO_FLOAT(interp.z); @@ -4741,14 +4720,7 @@ static void HWR_ProjectSprite(mobj_t *thing) if (!thing) return; - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(thing, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(thing, FRACUNIT, &interp); - } + R_InterpolateMobjState(thing, R_GetTimeFrac(RTF_LEVEL), &interp); dispoffset = thing->dispoffset; @@ -4946,14 +4918,7 @@ static void HWR_ProjectSprite(mobj_t *thing) fixed_t groundz; fixed_t floordiff; - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(caster, rendertimefrac, &casterinterp); - } - else - { - R_InterpolateMobjState(caster, FRACUNIT, &casterinterp); - } + R_InterpolateMobjState(caster, R_GetTimeFrac(RTF_LEVEL), &casterinterp); groundz = R_GetShadowZ(thing, NULL); floordiff = abs(((thing->eflags & MFE_VERTICALFLIP) ? caster->height : 0) + casterinterp.z - groundz); @@ -5052,14 +5017,7 @@ static void HWR_ProjectSprite(mobj_t *thing) if (! R_ThingVisible(thing->tracer)) return; - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(thing->tracer, rendertimefrac, &tracer_interp); - } - else - { - R_InterpolateMobjState(thing->tracer, FRACUNIT, &tracer_interp); - } + R_InterpolateMobjState(thing->tracer, R_GetTimeFrac(RTF_LEVEL), &tracer_interp); // calculate tz for tracer, same way it is calculated for this sprite // transform the origin point @@ -5202,14 +5160,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) } // do interpolation - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolatePrecipMobjState(thing, rendertimefrac, &interp); - } - else - { - R_InterpolatePrecipMobjState(thing, FRACUNIT, &interp); - } + R_InterpolatePrecipMobjState(thing, R_GetTimeFrac(RTF_LEVEL), &interp); this_scale = FIXED_TO_FLOAT(interp.scale); @@ -5323,14 +5274,7 @@ static void HWR_ProjectBoundingBox(mobj_t *thing) if (!R_ThingBoundingBoxVisible(thing)) return; - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(thing, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(thing, FRACUNIT, &interp); - } + R_InterpolateMobjState(thing, R_GetTimeFrac(RTF_LEVEL), &interp); // transform the origin point tr_x = FIXED_TO_FLOAT(interp.x) - gl_viewx; @@ -6445,7 +6389,7 @@ void HWR_DoPostProcessor(player_t *player) { // 10 by 10 grid. 2 coordinates (xy) float v[SCREENVERTS][SCREENVERTS][2]; - float disStart = (leveltime-1) + FIXED_TO_FLOAT(rendertimefrac); + float disStart = (leveltime-1) + FIXED_TO_FLOAT(R_GetTimeFrac(RTF_LEVEL)); UINT8 x, y; INT32 WAVELENGTH; diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index ed5ecb7b8..91c6c9d27 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1426,14 +1426,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) interpmobjstate_t interp; modeltype_t modeltype = MODELTYPE_SPRITE; - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(spr->mobj, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(spr->mobj, FRACUNIT, &interp); - } + R_InterpolateMobjState(spr->mobj, R_GetTimeFrac(RTF_LEVEL), &interp); // sprite offset interp.x += spr->mobj->sprxoff; @@ -1611,7 +1604,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) #ifdef USE_MODEL_NEXTFRAME // Interpolate the model interpolation. (lol) - tics -= FixedToFloat(rendertimefrac); + tics -= FixedToFloat(R_GetTimeFrac(RTF_LEVEL)); #define INTERPOLERATION_LIMIT TICRATE/4 if ( diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 52c5070f1..144cf00c2 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -21,7 +21,7 @@ #include #include -#include "../../r_local.h" // For rendertimefrac, used for the leveltime shader uniform +#include "../../r_fps.h" // For R_GetTimeFrac, used for the leveltime shader uniform #include "r_opengl.h" #include "r_vbo.h" @@ -1053,7 +1053,7 @@ EXPORT void HWRAPI(SetShaderInfo) (hwdshaderinfo_t info, INT32 value) switch (info) { case HWD_SHADERINFO_LEVELTIME: - shader_leveltime = (((float)(value-1)) + FIXED_TO_FLOAT(rendertimefrac)) / TICRATE; + shader_leveltime = (((float)(value-1)) + FIXED_TO_FLOAT(R_GetTimeFrac(RTF_LEVEL))) / TICRATE; break; case HWD_SHADERINFO_LIGHT_X: shader_light_x = FixedToFloat(value); diff --git a/src/k_hud.c b/src/k_hud.c index 9c7bb67f0..10efcb213 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -1422,7 +1422,7 @@ static void K_drawKartItem(void) if (cv_fancyroulette.value && stplyr->itemroulette && !stplyr->deadtimer) { - fixed_t frac = R_GetHudUncap(); + fixed_t frac = R_GetTimeFrac(RTF_LEVEL); UINT8 fancystep = (offset ? 6 : 10); fixed_t fancyoffset = (stplyr->itemroulette % 3)-1; @@ -4130,7 +4130,7 @@ static void K_drawBattleFullscreen(void) // fill in the fractional bits if (cardanim && cardanim != 164*FRACUNIT) { - INT32 frac = R_GetHudUncap() * ((164 - stplyr->karthud[khud_cardanimation])/8 + 1); + INT32 frac = R_GetTimeFrac(RTF_LEVEL) * ((164 - stplyr->karthud[khud_cardanimation])/8 + 1); if (stplyr->exiting) cardanim += frac; else diff --git a/src/lua_hudlib_drawlist.c b/src/lua_hudlib_drawlist.c index 6b66a3d91..3cac9b64c 100644 --- a/src/lua_hudlib_drawlist.c +++ b/src/lua_hudlib_drawlist.c @@ -595,7 +595,7 @@ void LUA_HUD_DrawList(huddrawlist_h list) { size_t i; size_t j = 0; - fixed_t frac = R_UsingFrameInterpolation() ? rendertimefrac : FRACUNIT; + fixed_t frac = R_GetTimeFrac(RTF_INTER); fixed_t lerpx = 0, lerpy = 0; drawitem_t *latchitem = NULL; drawitem_t *oldlatchitem = NULL; diff --git a/src/r_fps.c b/src/r_fps.c index 563356788..742921cca 100644 --- a/src/r_fps.c +++ b/src/r_fps.c @@ -29,6 +29,9 @@ #include "hardware/hw_main.h" #endif +// The fraction of a tic being drawn (for interpolation between two tics) +static fixed_t rendertimefrac; + static CV_PossibleValue_t fpscap_cons_t[] = { #ifdef DEVELOP // Lower values are actually pretty useful for debugging interp problems! @@ -67,9 +70,25 @@ UINT32 R_GetFramerateCap(void) return cv_fpscap.value; } -boolean R_UsingFrameInterpolation(void) +// this wacky function exists now because rendertimefrac is stopped outside levels +// just for the sake of the intermission background... +fixed_t R_GetTimeFrac(timefrac_e level) { - return (R_GetFramerateCap() != TICRATE || cv_timescale.value < FRACUNIT); + // level interp. pauses if level isn't ticking + if (level <= RTF_LEVEL && !G_GamestateUsesLevel()) + return FRACUNIT; + + // intermission interp. keeps interp even if level isn't ticking, but pauses if game is paused + if (level <= RTF_INTER && (paused || P_AutoPause())) + return FRACUNIT; + + // menu interp. interpolates no matter what + return rendertimefrac; +} + +void R_SetTimeFrac(fixed_t frac) +{ + rendertimefrac = frac; } static viewvars_t pview_old[MAXSPLITSCREENPLAYERS]; @@ -252,22 +271,12 @@ void R_SetViewContext(enum viewcontext_e _viewcontext) fixed_t R_InterpolateFixed(fixed_t from, fixed_t to) { - if (!R_UsingFrameInterpolation()) - { - return to; - } - - return (R_LerpFixed(from, to, rendertimefrac)); + return R_LerpFixed(from, to, R_GetTimeFrac(RTF_LEVEL)); } angle_t R_InterpolateAngle(angle_t from, angle_t to) { - if (!R_UsingFrameInterpolation()) - { - return to; - } - - return (R_LerpAngle(from, to, rendertimefrac)); + return R_LerpAngle(from, to, R_GetTimeFrac(RTF_LEVEL)); } void R_InterpolateMobjState(mobj_t *mobj, fixed_t frac, interpmobjstate_t *out) diff --git a/src/r_fps.h b/src/r_fps.h index d632680ee..5c58993af 100644 --- a/src/r_fps.h +++ b/src/r_fps.h @@ -25,8 +25,16 @@ extern "C" { extern consvar_t cv_fpscap; +typedef enum +{ + RTF_LEVEL, + RTF_INTER, + RTF_MENU, +} timefrac_e; + UINT32 R_GetFramerateCap(void); -boolean R_UsingFrameInterpolation(void); +fixed_t R_GetTimeFrac(timefrac_e level); +void R_SetTimeFrac(fixed_t frac); enum viewcontext_e { diff --git a/src/r_main.cpp b/src/r_main.cpp index a9c35dbd8..941da9553 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -78,8 +78,6 @@ mobj_t *r_viewmobj; int r_splitscreen; -fixed_t rendertimefrac; -fixed_t rendertimefrac_unpaused; fixed_t renderdeltatics; boolean renderisnewtic; @@ -377,16 +375,6 @@ angle_t R_PointToAngle2(fixed_t pviewx, fixed_t pviewy, fixed_t x, fixed_t y) 0; } -INT32 R_GetHudUncap(void) -{ - return rendertimefrac & FRACMASK; -} - -INT32 R_GetMenuUncap(void) -{ - return rendertimefrac_unpaused & FRACMASK; -} - // // R_ScaleFromGlobalAngle // Returns the texture mapping scale for the current line (horizontal span) @@ -1223,7 +1211,7 @@ R_SetupCommonFrame else newview->sector = R_PointInSubsector(newview->x, newview->y)->sector; - R_InterpolateView(rendertimefrac_unpaused); + R_InterpolateView(R_GetTimeFrac(RTF_LEVEL)); } static void R_SetupAimingFrame(int s) diff --git a/src/r_main.h b/src/r_main.h index 416524c1b..c9fd110a7 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -37,10 +37,6 @@ extern fixed_t fovtan[MAXSPLITSCREENPLAYERS]; extern size_t validcount, linecount, loopcount, framecount; -// The fraction of a tic being drawn (for interpolation between two tics) -extern fixed_t rendertimefrac; -// Same as rendertimefrac but not suspended when the game is paused -extern fixed_t rendertimefrac_unpaused; // Evaluated delta tics for this frame (how many tics since the last frame) extern fixed_t renderdeltatics; // The current render is a new logical tic @@ -215,11 +211,6 @@ void R_RenderPlayerView(void); // add commands related to engine, at game startup void R_RegisterEngineStuff(void); -// return multiplier for HUD uncap -INT32 R_GetHudUncap(void); -// same as above but keeps interpolation during pause -INT32 R_GetMenuUncap(void); - #ifdef __cplusplus } // extern "C" #endif diff --git a/src/r_things.cpp b/src/r_things.cpp index 77ced92f9..eb7d311c0 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -1353,14 +1353,7 @@ fixed_t R_GetShadowZ( // for frame interpolation interpmobjstate_t interp = {0}; - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(thing, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(thing, FRACUNIT, &interp); - } + R_InterpolateMobjState(thing, R_GetTimeFrac(RTF_LEVEL), &interp); halfHeight = interp.z + (thing->height >> 1); floorz = P_GetFloorZ(thing, interp.subsector->sector, interp.x, interp.y, NULL); @@ -1428,14 +1421,7 @@ static void R_SkewShadowSprite( // for frame interpolation interpmobjstate_t interp = {0}; - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(thing, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(thing, FRACUNIT, &interp); - } + R_InterpolateMobjState(thing, R_GetTimeFrac(RTF_LEVEL), &interp); sloperelang = (R_PointToAngle(interp.x, interp.y) - groundslope->xydirection) >> ANGLETOFINESHIFT; @@ -1470,14 +1456,7 @@ static void R_ProjectDropShadow( if (abs(groundz-viewz)/tz > 4) return; // Prevent stretchy shadows and possible crashes - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(thing, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(thing, FRACUNIT, &interp); - } + R_InterpolateMobjState(thing, R_GetTimeFrac(RTF_LEVEL), &interp); if (shadowpatch == NULL) { @@ -1584,14 +1563,7 @@ static void R_ProjectBoundingBox(mobj_t *thing, vissprite_t *vis) } // do interpolation - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(thing, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(thing, FRACUNIT, &interp); - } + R_InterpolateMobjState(thing, R_GetTimeFrac(RTF_LEVEL), &interp); // 1--3 // | | @@ -1781,14 +1753,7 @@ static void R_ProjectSprite(mobj_t *thing) } // do interpolation - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(interptarg, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(interptarg, FRACUNIT, &interp); - } + R_InterpolateMobjState(interptarg, R_GetTimeFrac(RTF_LEVEL), &interp); this_scale = interp.scale; @@ -2128,14 +2093,7 @@ static void R_ProjectSprite(mobj_t *thing) thing = thing->tracer; - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(thing, rendertimefrac, &tracer_interp); - } - else - { - R_InterpolateMobjState(thing, FRACUNIT, &tracer_interp); - } + R_InterpolateMobjState(thing, R_GetTimeFrac(RTF_LEVEL), &tracer_interp); // sprite offset tracer_interp.x += thing->sprxoff; @@ -2540,14 +2498,7 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) } // do interpolation - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolatePrecipMobjState(thing, rendertimefrac, &interp); - } - else - { - R_InterpolatePrecipMobjState(thing, FRACUNIT, &interp); - } + R_InterpolatePrecipMobjState(thing, R_GetTimeFrac(RTF_LEVEL), &interp); this_scale = interp.scale; diff --git a/src/screen.c b/src/screen.c index 441f0d821..5f492b6e3 100644 --- a/src/screen.c +++ b/src/screen.c @@ -651,7 +651,7 @@ void SCR_ClosedCaptions(void) if (closedcaptions[i].b) // If the caption hasn't reached its final destination... { y -= closedcaptions[i].b * 4 * FRACUNIT; // ...move it per tic... - y += (rendertimefrac % FRACUNIT) * 4; // ...and interpolate it per frame + y += (R_GetTimeFrac(RTF_MENU)) * 4; // ...and interpolate it per frame // We have to modulo it by FRACUNIT, so that it won't be a tic ahead with interpolation disabled // Unlike everything else, captions are (intentionally) interpolated from T to T+1 instead of T-1 to T } diff --git a/src/st_stuff.c b/src/st_stuff.c index 5ed98ff60..d3617b233 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -673,7 +673,7 @@ void ST_drawTitleCard(void) // uh... "fill in the bits" of sub, or something... no idea what I came up with // VERY janky, but doesn't require m_easing - INT32 frac = (FixedMul(R_GetHudUncap(), FixedDiv(dupcalc, BASEVIDWIDTH)) >> (count + 4))/13; // these two magic numbers seem to do the trick + INT32 frac = (FixedMul(R_GetTimeFrac(RTF_LEVEL), FixedDiv(dupcalc, BASEVIDWIDTH)) >> (count + 4))/13; // these two magic numbers seem to do the trick sub = dupcalc; while (count-- > 0) @@ -959,7 +959,7 @@ void ST_Drawer(void) stplyr = &players[displayplayers[i]]; stplyrnum = i; R_SetViewContext(VIEWCONTEXT_PLAYER1 + i); - R_InterpolateView(rendertimefrac); // to assist with object tracking + R_InterpolateView(R_GetTimeFrac(RTF_LEVEL)); // to assist with object tracking ST_overlayDrawer(); } diff --git a/src/v_video.c b/src/v_video.c index 969042068..bc8c4fe76 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -1850,9 +1850,8 @@ void V_DrawVhsEffect(boolean rewind) if (rewind) V_DrawVhsEffect(false); // experimentation - fixed_t frac = R_UsingFrameInterpolation() ? renderdeltatics : FRACUNIT; - upbary -= frac * (vid.dupy * (rewind ? 3 : 1.8f)); - downbary += frac * (vid.dupy * (rewind ? 2 : 1)); + upbary -= renderdeltatics * (vid.dupy * (rewind ? 3 : 1.8f)); + downbary += renderdeltatics * (vid.dupy * (rewind ? 2 : 1)); if (upbary < -barsize*FRACUNIT) upbary = vid.height< vid.height<>FRACBITS) / (8 * vid.dupx); + x -= ((((count<>FRACBITS) / (8 * vid.dupx); else if (count == 8) goto skiptallydrawer; else if (count < 16) - x += (((((16 - count)<>FRACBITS) / (8 * vid.dupx); + x += (((((16 - count)<>FRACBITS) / (8 * vid.dupx); } if (intertype == int_race || intertype == int_battle || intertype == int_battletime)