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
This commit is contained in:
GenericHeroGuy 2025-08-27 21:18:23 +02:00
parent 423a9ee8a6
commit 219acbb9cc
17 changed files with 80 additions and 212 deletions

View file

@ -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));

View file

@ -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_e>(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);

View file

@ -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)<<FRACBITS;
// The scroll offset MUST be clamped before shifting by FRACBITS, or else it'll overflow in about 3 minutes
animtimer = ((((finalecount * scrollspeed) % (SHORT(pat->width)*16))<<FRACBITS) + (rendertimefrac * scrollspeed))/16;
anim2 = (SHORT(pat2->width)<<FRACBITS) - ((((finalecount * scrollspeed) % (SHORT(pat2->width)*16))<<FRACBITS) + (rendertimefrac * scrollspeed))/16;
animtimer = ((((finalecount * scrollspeed) % (SHORT(pat->width)*16))<<FRACBITS) + (R_GetTimeFrac(RTF_MENU) * scrollspeed))/16;
anim2 = (SHORT(pat2->width)<<FRACBITS) - ((((finalecount * scrollspeed) % (SHORT(pat2->width)*16))<<FRACBITS) + (R_GetTimeFrac(RTF_MENU) * scrollspeed))/16;
// SRB2Kart: F_DrawPatchCol is over-engineered; recoded to be less shitty and error-prone
if (rendermode != render_none)
@ -1220,7 +1221,7 @@ void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname)
tilex = max(FixedCeil(FixedDiv(vid.width, pw)) >> 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<<FRACBITS) - 18*(((20 - finalecount)<<FRACBITS) - R_GetMenuUncap()), 87<<FRACBITS, 0, ttkart, FRACUNIT/2);
V_DrawSciencePatch((84<<FRACBITS) - 18*(((20 - finalecount)<<FRACBITS) - R_GetTimeFrac(RTF_MENU)), 87<<FRACBITS, 0, ttkart, FRACUNIT/2);
}
else if (finalecount < 52)
{
@ -1443,8 +1444,8 @@ void F_TitleScreenDrawer(void)
F_TitleBGScroll(5);
V_DrawSciencePatch(0, -40*FixedDiv(((finalecount % 70)<<FRACBITS) + R_GetMenuUncap(), 70<<FRACBITS), V_SNAPTOTOP|V_SNAPTOLEFT, ttcheckers, FRACUNIT);
V_DrawSciencePatch(280<<FRACBITS, -(40<<FRACBITS) + 40*FixedDiv(((finalecount % 70)<<FRACBITS) + R_GetMenuUncap(), 70<<FRACBITS), V_SNAPTOTOP|V_SNAPTORIGHT, ttcheckers, FRACUNIT);
V_DrawSciencePatch(0, -40*FixedDiv(((finalecount % 70)<<FRACBITS) + R_GetTimeFrac(RTF_MENU), 70<<FRACBITS), V_SNAPTOTOP|V_SNAPTOLEFT, ttcheckers, FRACUNIT);
V_DrawSciencePatch(280<<FRACBITS, -(40<<FRACBITS) + 40*FixedDiv(((finalecount % 70)<<FRACBITS) + R_GetTimeFrac(RTF_MENU), 70<<FRACBITS), V_SNAPTOTOP|V_SNAPTORIGHT, ttcheckers, FRACUNIT);
if (transval)
V_DrawFadeScreen(0, 10 - transval);

View file

@ -3136,14 +3136,7 @@ static void HWR_DrawDropShadow(mobj_t *thing, fixed_t scale)
// uncapped/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);
// sprite offset
interp.x += thing->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;

View file

@ -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 (

View file

@ -21,7 +21,7 @@
#include <stdarg.h>
#include <math.h>
#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);

View file

@ -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

View file

@ -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;

View file

@ -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)

View file

@ -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
{

View file

@ -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)

View file

@ -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

View file

@ -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;

View file

@ -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
}

View file

@ -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();
}

View file

@ -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<<FRACBITS;
if (downbary > vid.height<<FRACBITS) downbary = -barsize*FRACUNIT;
@ -3588,7 +3587,7 @@ void V_DoPostProcessor(INT32 view, INT32 param)
{
INT32 y;
// Set disStart to a range from 0 to FINEANGLE, incrementing by 128 per tic
angle_t disStart = (((leveltime-1)*128) + (rendertimefrac / (FRACUNIT/128))) & FINEMASK;
angle_t disStart = (((leveltime-1)*128) + (R_GetTimeFrac(RTF_LEVEL) / (FRACUNIT/128))) & FINEMASK;
INT32 newpix;
INT32 sine;
//UINT8 *transme = R_GetTranslucencyTable(tr_trans50);

View file

@ -47,6 +47,7 @@
#include "k_pwrlv.h"
#include "console.h" // cons_menuhighlight
#include "k_grandprix.h"
#include "r_fps.h" // R_GetTimeFrac
#ifdef HWRENDER
#include "hardware/hw_main.h"
@ -445,11 +446,11 @@ void Y_IntermissionDrawer(void)
INT32 count = (intertic - sorttic);
if (count < 8)
x -= ((((count<<FRACBITS) + R_GetHudUncap()) * vid.width)>>FRACBITS) / (8 * vid.dupx);
x -= ((((count<<FRACBITS) + R_GetTimeFrac(RTF_INTER)) * vid.width)>>FRACBITS) / (8 * vid.dupx);
else if (count == 8)
goto skiptallydrawer;
else if (count < 16)
x += (((((16 - count)<<FRACBITS) - R_GetHudUncap()) * vid.width)>>FRACBITS) / (8 * vid.dupx);
x += (((((16 - count)<<FRACBITS) - R_GetTimeFrac(RTF_INTER)) * vid.width)>>FRACBITS) / (8 * vid.dupx);
}
if (intertype == int_race || intertype == int_battle || intertype == int_battletime)