Add functions to handle interpolation

Much less code duplication
This commit is contained in:
Sally Coolatta 2021-12-24 11:30:19 -05:00
parent 86991112b1
commit ce01b494f4
6 changed files with 123 additions and 222 deletions

View file

@ -40,9 +40,12 @@
#include "../r_things.h" // R_GetShadowZ #include "../r_things.h" // R_GetShadowZ
#include "../d_main.h" #include "../d_main.h"
#include "../p_slopes.h" #include "../p_slopes.h"
#include "../k_kart.h" // HITLAGJITTERS
#include "hw_md2.h" #include "hw_md2.h"
// SRB2Kart
#include "../k_kart.h" // HITLAGJITTERS
#include "../r_fps.h"
#ifdef NEWCLIP #ifdef NEWCLIP
#include "hw_clip.h" #include "hw_clip.h"
#endif #endif
@ -3641,17 +3644,9 @@ static void HWR_DrawDropShadow(mobj_t *thing, fixed_t scale)
fixed_t slopez; fixed_t slopez;
pslope_t *groundslope; pslope_t *groundslope;
fixed_t interpx = thing->x; fixed_t interpx = R_InterpolateFixed(thing->old_x, thing->x);
fixed_t interpy = thing->y; fixed_t interpy = R_InterpolateFixed(thing->old_y, thing->y);
fixed_t interpz = thing->z; fixed_t interpz = R_InterpolateFixed(thing->old_z, thing->z);
// do interpolation
if (cv_frameinterpolation.value == 1)
{
interpx = thing->old_x + FixedMul(rendertimefrac, thing->x - thing->old_x);
interpy = thing->old_y + FixedMul(rendertimefrac, thing->y - thing->old_y);
interpz = thing->old_z + FixedMul(rendertimefrac, thing->z - thing->old_z);
}
// hitlag vibrating (todo: interp somehow?) // hitlag vibrating (todo: interp somehow?)
if (thing->hitlag > 0 && (thing->eflags & MFE_DAMAGEHITLAG)) if (thing->hitlag > 0 && (thing->eflags & MFE_DAMAGEHITLAG))
@ -5084,25 +5079,18 @@ static void HWR_ProjectSprite(mobj_t *thing)
dispoffset = thing->info->dispoffset; dispoffset = thing->info->dispoffset;
interpx = thing->x; interpx = R_InterpolateFixed(thing->old_x, thing->x);
interpy = thing->y; interpy = R_InterpolateFixed(thing->old_y, thing->y);
interpz = thing->z; interpz = R_InterpolateFixed(thing->old_z, thing->z);
interpangle = (thing->player ? thing->player->drawangle : thing->angle); interpangle = ANGLE_MAX;
if (cv_frameinterpolation.value == 1) if (thing->player)
{ {
interpx = thing->old_x + FixedMul(rendertimefrac, thing->x - thing->old_x); interpangle = R_InterpolateAngle(thing->player->old_drawangle, thing->player->drawangle);
interpy = thing->old_y + FixedMul(rendertimefrac, thing->y - thing->old_y); }
interpz = thing->old_z + FixedMul(rendertimefrac, thing->z - thing->old_z); else
{
if (thing->player) interpangle = R_InterpolateAngle(thing->old_angle, thing->angle);
{
interpangle = thing->player->old_drawangle + FixedMul(rendertimefrac, thing->player->drawangle - thing->player->old_drawangle);
}
else
{
interpangle = thing->old_angle + FixedMul(rendertimefrac, thing->angle - thing->old_angle);
}
} }
// hitlag vibrating (todo: interp somehow?) // hitlag vibrating (todo: interp somehow?)
@ -5526,17 +5514,9 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
if (!thing) if (!thing)
return; return;
interpx = thing->x; interpx = R_InterpolateFixed(thing->old_x, thing->x);
interpy = thing->y; interpy = R_InterpolateFixed(thing->old_y, thing->y);
interpz = thing->z; interpz = R_InterpolateFixed(thing->old_z, thing->z);
// do interpolation
if (cv_frameinterpolation.value == 1)
{
interpx = thing->old_x + FixedMul(rendertimefrac, thing->x - thing->old_x);
interpy = thing->old_y + FixedMul(rendertimefrac, thing->y - thing->old_y);
interpz = thing->old_z + FixedMul(rendertimefrac, thing->z - thing->old_z);
}
// transform the origin point // transform the origin point
tr_x = FIXED_TO_FLOAT(interpx) - gl_viewx; tr_x = FIXED_TO_FLOAT(interpx) - gl_viewx;

View file

@ -46,6 +46,7 @@
// SRB2Kart // SRB2Kart
#include "../k_color.h" #include "../k_color.h"
#include "../k_kart.h" // HITLAGJITTERS #include "../k_kart.h" // HITLAGJITTERS
#include "../r_fps.h"
#ifdef HAVE_PNG #ifdef HAVE_PNG
@ -1368,17 +1369,9 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
INT32 mod; INT32 mod;
float finalscale; float finalscale;
fixed_t interpx = spr->mobj->x; fixed_t interpx = R_InterpolateFixed(spr->mobj->old_x, spr->mobj->x);
fixed_t interpy = spr->mobj->y; fixed_t interpy = R_InterpolateFixed(spr->mobj->old_y, spr->mobj->y);
fixed_t interpz = spr->mobj->z; fixed_t interpz = R_InterpolateFixed(spr->mobj->old_z, spr->mobj->z);
// do interpolation
if (cv_frameinterpolation.value == 1)
{
interpx = spr->mobj->old_x + FixedMul(rendertimefrac, spr->mobj->x - spr->mobj->old_x);
interpy = spr->mobj->old_y + FixedMul(rendertimefrac, spr->mobj->y - spr->mobj->old_y);
interpz = spr->mobj->old_z + FixedMul(rendertimefrac, spr->mobj->z - spr->mobj->old_z);
}
// hitlag vibrating // hitlag vibrating
if (spr->mobj->hitlag > 0 && (spr->mobj->eflags & MFE_DAMAGEHITLAG)) if (spr->mobj->hitlag > 0 && (spr->mobj->eflags & MFE_DAMAGEHITLAG))
@ -1636,10 +1629,16 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
if (sprframe->rotate || papersprite) if (sprframe->rotate || papersprite)
{ {
fixed_t anglef = AngleFixed(spr->mobj->angle); fixed_t anglef = INT32_MAX;
if (spr->mobj->player) if (spr->mobj->player)
anglef = AngleFixed(spr->mobj->player->drawangle); {
anglef = AngleFixed(R_InterpolateAngle(spr->mobj->player->old_drawangle, spr->mobj->player->drawangle));
}
else
{
anglef = AngleFixed(R_InterpolateAngle(spr->mobj->old_angle, spr->mobj->angle));
}
p.angley = FIXED_TO_FLOAT(anglef); p.angley = FIXED_TO_FLOAT(anglef);
} }
@ -1671,8 +1670,8 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
} }
} }
p.anglez = FIXED_TO_FLOAT(AngleFixed(spr->mobj->pitch)); p.anglez = FIXED_TO_FLOAT(AngleFixed(R_InterpolateAngle(spr->mobj->old_pitch, spr->mobj->pitch)));
p.anglex = FIXED_TO_FLOAT(AngleFixed(spr->mobj->roll)); p.anglex = FIXED_TO_FLOAT(AngleFixed(R_InterpolateAngle(spr->mobj->old_roll, spr->mobj->roll)));
// SRB2CBTODO: MD2 scaling support // SRB2CBTODO: MD2 scaling support
finalscale *= FIXED_TO_FLOAT(spr->mobj->scale); finalscale *= FIXED_TO_FLOAT(spr->mobj->scale);

View file

@ -31,6 +31,7 @@
#include "r_main.h" #include "r_main.h"
#include "s_sound.h" #include "s_sound.h"
#include "r_things.h" #include "r_things.h"
#include "r_fps.h"
#define NUMPOSNUMS 10 #define NUMPOSNUMS 10
#define NUMPOSFRAMES 7 // White, three blues, three reds #define NUMPOSFRAMES 7 // White, three blues, three reds
@ -835,48 +836,26 @@ void K_ObjectTracking(trackingResult_t *result, vector3_t *point, UINT8 cameraNu
return; return;
} }
// TODO: needs da interp // TODO: parts need interp
if (cam->chase == true && !player->spectator) if (cam->chase == true && !player->spectator)
{ {
// Use the camera's properties. // Use the camera's properties.
viewpointX = cam->x; viewpointX = R_InterpolateFixed(cam->old_x, cam->x);
viewpointY = cam->y; viewpointY = R_InterpolateFixed(cam->old_y, cam->y);
viewpointZ = cam->z - point->z; viewpointZ = R_InterpolateFixed(cam->old_z, cam->z) - point->z;
viewpointAngle = (INT32)cam->angle; viewpointAngle = (INT32)R_InterpolateAngle(cam->old_angle, cam->angle);
viewpointAiming = (INT32)cam->aiming; viewpointAiming = (INT32)R_InterpolateAngle(cam->old_aiming, cam->aiming);
viewpointRoll = (INT32)player->viewrollangle; viewpointRoll = (INT32)R_InterpolateAngle(player->old_viewrollangle, player->viewrollangle);
if (cv_frameinterpolation.value == 1)
{
viewpointX = cam->old_x + FixedMul(rendertimefrac, cam->x - cam->old_x);
viewpointY = cam->old_y + FixedMul(rendertimefrac, cam->y - cam->old_y);
viewpointZ = (cam->old_z + FixedMul(rendertimefrac, cam->z - cam->old_z)) - point->z;
viewpointAngle = (INT32)(cam->old_angle + FixedMul(rendertimefrac, cam->angle - cam->old_angle));
viewpointAiming = (INT32)(cam->old_aiming + FixedMul(rendertimefrac, cam->aiming - cam->old_aiming));
viewpointRoll = (INT32)(player->old_viewrollangle + FixedMul(rendertimefrac, player->viewrollangle - player->old_viewrollangle));
}
} }
else else
{ {
// Use player properties. // Use player properties.
viewpointX = player->mo->x; viewpointX = R_InterpolateFixed(player->mo->old_x, player->mo->x);
viewpointY = player->mo->y; viewpointY = R_InterpolateFixed(player->mo->old_y, player->mo->y);
viewpointZ = player->viewz - point->z; viewpointZ = R_InterpolateFixed(player->mo->old_z, player->mo->z) - point->z; //player->old_viewz
viewpointAngle = (INT32)player->mo->angle; viewpointAngle = (INT32)R_InterpolateAngle(player->mo->old_angle, player->mo->angle);
viewpointAiming = (INT32)player->aiming; viewpointAiming = (INT32)player->aiming;
viewpointRoll = (INT32)player->viewrollangle; viewpointRoll = (INT32)R_InterpolateAngle(player->old_viewrollangle, player->viewrollangle);
if (cv_frameinterpolation.value == 1)
{
viewpointX = player->mo->old_x + FixedMul(rendertimefrac, player->mo->x - player->mo->old_x);
viewpointY = player->mo->old_y + FixedMul(rendertimefrac, player->mo->y - player->mo->old_y);
viewpointZ = (player->mo->old_z + FixedMul(rendertimefrac, player->viewz - player->mo->old_z)) - point->z; //player->old_viewz
viewpointAngle = (INT32)(player->mo->old_angle + FixedMul(rendertimefrac, player->mo->angle - player->mo->old_angle));
//viewpointAiming = (INT32)(player->mo->old_aiming + FixedMul(rendertimefrac, player->mo->aiming - player->mo->old_aiming));
viewpointRoll = (INT32)(player->old_viewrollangle + FixedMul(rendertimefrac, player->viewrollangle - player->old_viewrollangle));
}
} }
viewpointAngle += (INT32)angleOffset; viewpointAngle += (INT32)angleOffset;
@ -2631,24 +2610,13 @@ static void K_drawKartPlayerCheck(void)
continue; continue;
} }
v.x = checkplayer->mo->x; v.x = R_InterpolateFixed(checkplayer->mo->old_x, checkplayer->mo->x);
v.y = checkplayer->mo->y; v.y = R_InterpolateFixed(checkplayer->mo->old_y, checkplayer->mo->y);
v.z = checkplayer->mo->z; v.z = R_InterpolateFixed(checkplayer->mo->old_z, checkplayer->mo->z);
pPos.x = stplyr->mo->x; pPos.x = R_InterpolateFixed(stplyr->mo->old_x, stplyr->mo->x);
pPos.y = stplyr->mo->y; pPos.y = R_InterpolateFixed(stplyr->mo->old_y, stplyr->mo->y);
pPos.z = stplyr->mo->z; pPos.z = R_InterpolateFixed(stplyr->mo->old_z, stplyr->mo->z);
if (cv_frameinterpolation.value == 1)
{
v.x = checkplayer->mo->old_x + FixedMul(rendertimefrac, checkplayer->mo->x - checkplayer->mo->old_x);
v.y = checkplayer->mo->old_y + FixedMul(rendertimefrac, checkplayer->mo->y - checkplayer->mo->old_y);
v.z = checkplayer->mo->old_z + FixedMul(rendertimefrac, checkplayer->mo->z - checkplayer->mo->old_z);
pPos.x = stplyr->mo->old_x + FixedMul(rendertimefrac, stplyr->mo->x - stplyr->mo->old_x);
pPos.y = stplyr->mo->old_y + FixedMul(rendertimefrac, stplyr->mo->y - stplyr->mo->old_y);
pPos.z = stplyr->mo->old_z + FixedMul(rendertimefrac, stplyr->mo->z - stplyr->mo->old_z);
}
distance = R_PointToDist2(pPos.x, pPos.y, v.x, v.y); distance = R_PointToDist2(pPos.x, pPos.y, v.x, v.y);
@ -2834,29 +2802,15 @@ static void K_drawKartNameTags(void)
if (thiscam->chase == true) if (thiscam->chase == true)
{ {
c.x = thiscam->x; c.x = R_InterpolateFixed(thiscam->old_x, thiscam->x);
c.y = thiscam->y; c.y = R_InterpolateFixed(thiscam->old_y, thiscam->y);
c.z = thiscam->z; c.z = R_InterpolateFixed(thiscam->old_z, thiscam->z);
if (cv_frameinterpolation.value == 1)
{
c.x = thiscam->old_x + FixedMul(rendertimefrac, thiscam->x - thiscam->old_x);
c.y = thiscam->old_y + FixedMul(rendertimefrac, thiscam->y - thiscam->old_y);
c.z = thiscam->old_z + FixedMul(rendertimefrac, thiscam->z - thiscam->old_z);
}
} }
else else
{ {
c.x = stplyr->mo->x; c.x = R_InterpolateFixed(stplyr->mo->old_x, stplyr->mo->x);
c.y = stplyr->mo->y; c.y = R_InterpolateFixed(stplyr->mo->old_y, stplyr->mo->y);
c.z = stplyr->mo->z; c.z = R_InterpolateFixed(stplyr->mo->old_z, stplyr->mo->z);
if (cv_frameinterpolation.value == 1)
{
c.x = stplyr->mo->old_x + FixedMul(rendertimefrac, stplyr->mo->x - stplyr->mo->old_x);
c.y = stplyr->mo->old_y + FixedMul(rendertimefrac, stplyr->mo->y - stplyr->mo->old_y);
c.z = stplyr->mo->old_z + FixedMul(rendertimefrac, stplyr->mo->z - stplyr->mo->old_z);
}
} }
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
@ -2895,16 +2849,9 @@ static void K_drawKartNameTags(void)
continue; continue;
} }
v.x = ntplayer->mo->x; v.x = R_InterpolateFixed(ntplayer->mo->old_x, ntplayer->mo->x);
v.y = ntplayer->mo->y; v.y = R_InterpolateFixed(ntplayer->mo->old_x, ntplayer->mo->x);
v.z = ntplayer->mo->z; v.z = R_InterpolateFixed(ntplayer->mo->old_x, ntplayer->mo->x);
if (cv_frameinterpolation.value == 1)
{
v.x = ntplayer->mo->old_x + FixedMul(rendertimefrac, ntplayer->mo->x - ntplayer->mo->old_x);
v.y = ntplayer->mo->old_y + FixedMul(rendertimefrac, ntplayer->mo->y - ntplayer->mo->old_y);
v.z = ntplayer->mo->old_z + FixedMul(rendertimefrac, ntplayer->mo->z - ntplayer->mo->old_z);
}
if (!(ntplayer->mo->eflags & MFE_VERTICALFLIP)) if (!(ntplayer->mo->eflags & MFE_VERTICALFLIP))
{ {
@ -2959,16 +2906,9 @@ static void K_drawKartNameTags(void)
SINT8 localindicator = -1; SINT8 localindicator = -1;
vector3_t v; vector3_t v;
v.x = ntplayer->mo->x; v.x = R_InterpolateFixed(ntplayer->mo->old_x, ntplayer->mo->x);
v.y = ntplayer->mo->y; v.y = R_InterpolateFixed(ntplayer->mo->old_y, ntplayer->mo->y);
v.z = ntplayer->mo->z; v.z = R_InterpolateFixed(ntplayer->mo->old_z, ntplayer->mo->z);
if (cv_frameinterpolation.value == 1)
{
v.x = ntplayer->mo->old_x + FixedMul(rendertimefrac, ntplayer->mo->x - ntplayer->mo->old_x);
v.y = ntplayer->mo->old_y + FixedMul(rendertimefrac, ntplayer->mo->y - ntplayer->mo->old_y);
v.z = ntplayer->mo->old_z + FixedMul(rendertimefrac, ntplayer->mo->z - ntplayer->mo->old_z);
}
v.z += (ntplayer->mo->height / 2); v.z += (ntplayer->mo->height / 2);
@ -3208,14 +3148,8 @@ static void K_drawKartMinimap(void)
else else
colormap = NULL; colormap = NULL;
interpx = g->mo->x; interpx = R_InterpolateFixed(g->mo->old_x, g->mo->x);
interpy = g->mo->y; interpy = R_InterpolateFixed(g->mo->old_y, g->mo->y);
if (cv_frameinterpolation.value == 1)
{
interpx = g->mo->old_x + FixedMul(rendertimefrac, g->mo->x - g->mo->old_x);
interpy = g->mo->old_y + FixedMul(rendertimefrac, g->mo->y - g->mo->old_y);
}
K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, faceprefix[skin][FACE_MINIMAP], colormap, AutomapPic); K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, faceprefix[skin][FACE_MINIMAP], colormap, AutomapPic);
g = g->next; g = g->next;
@ -3273,14 +3207,8 @@ static void K_drawKartMinimap(void)
else else
colormap = NULL; colormap = NULL;
interpx = players[i].mo->x; interpx = R_InterpolateFixed(players[i].mo->old_x, players[i].mo->x);
interpy = players[i].mo->y; interpy = R_InterpolateFixed(players[i].mo->old_y, players[i].mo->y);
if (cv_frameinterpolation.value == 1)
{
interpx = players[i].mo->old_x + FixedMul(rendertimefrac, players[i].mo->x - players[i].mo->old_x);
interpy = players[i].mo->old_y + FixedMul(rendertimefrac, players[i].mo->y - players[i].mo->old_y);
}
K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, faceprefix[skin][FACE_MINIMAP], colormap, AutomapPic); K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, faceprefix[skin][FACE_MINIMAP], colormap, AutomapPic);
// Target reticule // Target reticule
@ -3308,14 +3236,8 @@ static void K_drawKartMinimap(void)
colormap = R_GetTranslationColormap(TC_RAINBOW, mobj->color, GTC_CACHE); colormap = R_GetTranslationColormap(TC_RAINBOW, mobj->color, GTC_CACHE);
} }
interpx = mobj->x; interpx = R_InterpolateFixed(mobj->old_x, mobj->x);
interpy = mobj->y; interpy = R_InterpolateFixed(mobj->old_y, mobj->y);
if (cv_frameinterpolation.value == 1)
{
interpx = mobj->old_x + FixedMul(rendertimefrac, mobj->x - mobj->old_x);
interpy = mobj->old_y + FixedMul(rendertimefrac, mobj->y - mobj->old_y);
}
K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, kp_spbminimap, colormap, AutomapPic); K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, kp_spbminimap, colormap, AutomapPic);
} }
@ -3345,14 +3267,8 @@ static void K_drawKartMinimap(void)
else else
colormap = NULL; colormap = NULL;
interpx = players[localplayers[i]].mo->x; interpx = R_InterpolateFixed(players[localplayers[i]].mo->old_x, players[localplayers[i]].mo->x);
interpy = players[localplayers[i]].mo->y; interpy = R_InterpolateFixed(players[localplayers[i]].mo->old_y, players[localplayers[i]].mo->y);
if (cv_frameinterpolation.value == 1)
{
interpx = players[localplayers[i]].mo->old_x + FixedMul(rendertimefrac, players[localplayers[i]].mo->x - players[localplayers[i]].mo->old_x);
interpy = players[localplayers[i]].mo->old_y + FixedMul(rendertimefrac, players[localplayers[i]].mo->y - players[localplayers[i]].mo->old_y);
}
K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, faceprefix[skin][FACE_MINIMAP], colormap, AutomapPic); K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, faceprefix[skin][FACE_MINIMAP], colormap, AutomapPic);
@ -3631,7 +3547,7 @@ static void K_drawKartFinish(void)
x = ((TICRATE - stplyr->karthud[khud_cardanimation])*(xval > x ? xval : x))/TICRATE; x = ((TICRATE - stplyr->karthud[khud_cardanimation])*(xval > x ? xval : x))/TICRATE;
ox = ((TICRATE - (stplyr->karthud[khud_cardanimation] - 1))*(xval > x ? xval : x))/TICRATE; ox = ((TICRATE - (stplyr->karthud[khud_cardanimation] - 1))*(xval > x ? xval : x))/TICRATE;
interpx = ox + FixedMul(rendertimefrac, x - ox); interpx = R_InterpolateFixed(ox, x);
if (r_splitscreen && stplyr == &players[displayplayers[1]]) if (r_splitscreen && stplyr == &players[displayplayers[1]])
interpx = -interpx; interpx = -interpx;
@ -4039,11 +3955,11 @@ static void K_drawLapStartAnim(void)
newval = (BASEVIDWIDTH/2 + (32 * max(0, t - 76))) * FRACUNIT; newval = (BASEVIDWIDTH/2 + (32 * max(0, t - 76))) * FRACUNIT;
oldval = (BASEVIDWIDTH/2 + (32 * max(0, tOld - 76))) * FRACUNIT; oldval = (BASEVIDWIDTH/2 + (32 * max(0, tOld - 76))) * FRACUNIT;
interpx = oldval + FixedMul(rendertimefrac, newval - oldval); interpx = R_InterpolateFixed(oldval, newval);
newval = (48 - (32 * max(0, progress - 76))) * FRACUNIT; newval = (48 - (32 * max(0, progress - 76))) * FRACUNIT;
oldval = (48 - (32 * max(0, progressOld - 76))) * FRACUNIT; oldval = (48 - (32 * max(0, progressOld - 76))) * FRACUNIT;
interpy = oldval + FixedMul(rendertimefrac, newval - oldval); interpy = R_InterpolateFixed(oldval, newval);
V_DrawFixedPatch( V_DrawFixedPatch(
interpx, interpy, interpx, interpy,
@ -4054,7 +3970,7 @@ static void K_drawLapStartAnim(void)
{ {
newval = (4 - abs((signed)((leveltime % 8) - 4))) * FRACUNIT; newval = (4 - abs((signed)((leveltime % 8) - 4))) * FRACUNIT;
oldval = (4 - abs((signed)((leveltimeOld % 8) - 4))) * FRACUNIT; oldval = (4 - abs((signed)((leveltimeOld % 8) - 4))) * FRACUNIT;
interpy += oldval + FixedMul(rendertimefrac, newval - oldval); interpy += R_InterpolateFixed(oldval, newval);
V_DrawFixedPatch( V_DrawFixedPatch(
interpx, interpy, interpx, interpy,
@ -4066,7 +3982,7 @@ static void K_drawLapStartAnim(void)
{ {
newval = (62 - (32 * max(0, progress - 76))) * FRACUNIT; newval = (62 - (32 * max(0, progress - 76))) * FRACUNIT;
oldval = (62 - (32 * max(0, progressOld - 76))) * FRACUNIT; oldval = (62 - (32 * max(0, progressOld - 76))) * FRACUNIT;
interpx = oldval + FixedMul(rendertimefrac, newval - oldval); interpx = R_InterpolateFixed(oldval, newval);
V_DrawFixedPatch( V_DrawFixedPatch(
interpx, // 27 interpx, // 27
@ -4078,7 +3994,7 @@ static void K_drawLapStartAnim(void)
{ {
newval = (188 + (32 * max(0, progress - 76))) * FRACUNIT; newval = (188 + (32 * max(0, progress - 76))) * FRACUNIT;
oldval = (188 + (32 * max(0, progressOld - 76))) * FRACUNIT; oldval = (188 + (32 * max(0, progressOld - 76))) * FRACUNIT;
interpx = oldval + FixedMul(rendertimefrac, newval - oldval); interpx = R_InterpolateFixed(oldval, newval);
V_DrawFixedPatch( V_DrawFixedPatch(
interpx, // 194 interpx, // 194
@ -4091,7 +4007,7 @@ static void K_drawLapStartAnim(void)
{ {
newval = (82 - (32 * max(0, progress - 76))) * FRACUNIT; newval = (82 - (32 * max(0, progress - 76))) * FRACUNIT;
oldval = (82 - (32 * max(0, progressOld - 76))) * FRACUNIT; oldval = (82 - (32 * max(0, progressOld - 76))) * FRACUNIT;
interpx = oldval + FixedMul(rendertimefrac, newval - oldval); interpx = R_InterpolateFixed(oldval, newval);
V_DrawFixedPatch( V_DrawFixedPatch(
interpx, // 61 interpx, // 61
@ -4103,7 +4019,7 @@ static void K_drawLapStartAnim(void)
{ {
newval = (188 + (32 * max(0, progress - 76))) * FRACUNIT; newval = (188 + (32 * max(0, progress - 76))) * FRACUNIT;
oldval = (188 + (32 * max(0, progressOld - 76))) * FRACUNIT; oldval = (188 + (32 * max(0, progressOld - 76))) * FRACUNIT;
interpx = oldval + FixedMul(rendertimefrac, newval - oldval); interpx = R_InterpolateFixed(oldval, newval);
V_DrawFixedPatch( V_DrawFixedPatch(
interpx, // 194 interpx, // 194
@ -4115,7 +4031,7 @@ static void K_drawLapStartAnim(void)
{ {
newval = (208 + (32 * max(0, progress - 76))) * FRACUNIT; newval = (208 + (32 * max(0, progress - 76))) * FRACUNIT;
oldval = (208 + (32 * max(0, progressOld - 76))) * FRACUNIT; oldval = (208 + (32 * max(0, progressOld - 76))) * FRACUNIT;
interpx = oldval + FixedMul(rendertimefrac, newval - oldval); interpx = R_InterpolateFixed(oldval, newval);
V_DrawFixedPatch( V_DrawFixedPatch(
interpx, // 221 interpx, // 221

View file

@ -32,7 +32,6 @@ static viewvars_t skyview_new[MAXSPLITSCREENPLAYERS];
static viewvars_t *oldview = &pview_old[0]; static viewvars_t *oldview = &pview_old[0];
viewvars_t *newview = &pview_new[0]; viewvars_t *newview = &pview_new[0];
enum viewcontext_e viewcontext = VIEWCONTEXT_PLAYER1; enum viewcontext_e viewcontext = VIEWCONTEXT_PLAYER1;
static fixed_t R_LerpFixed(fixed_t from, fixed_t to, fixed_t frac) static fixed_t R_LerpFixed(fixed_t from, fixed_t to, fixed_t frac)
@ -147,3 +146,23 @@ void R_SetViewContext(enum viewcontext_e _viewcontext)
break; break;
} }
} }
fixed_t R_InterpolateFixed(fixed_t from, fixed_t to)
{
if (cv_frameinterpolation.value == 0)
{
return to;
}
return (from + R_LerpFixed(from, to, rendertimefrac));
}
angle_t R_InterpolateAngle(angle_t from, angle_t to)
{
if (cv_frameinterpolation.value == 0)
{
return to;
}
return (from + R_LerpAngle(from, to, rendertimefrac));
}

View file

@ -56,4 +56,7 @@ void R_UpdateViewInterpolation(void);
// Set the current view context (the viewvars pointed to by newview) // Set the current view context (the viewvars pointed to by newview)
void R_SetViewContext(enum viewcontext_e _viewcontext); void R_SetViewContext(enum viewcontext_e _viewcontext);
fixed_t R_InterpolateFixed(fixed_t from, fixed_t to);
angle_t R_InterpolateAngle(angle_t from, angle_t to);
#endif #endif

View file

@ -46,6 +46,7 @@
// SRB2kart // SRB2kart
#include "k_color.h" #include "k_color.h"
#include "k_kart.h" // HITLAGJITTERS #include "k_kart.h" // HITLAGJITTERS
#include "r_fps.h"
#define MINZ (FRACUNIT*4) #define MINZ (FRACUNIT*4)
#define BASEYCENTER (BASEVIDHEIGHT/2) #define BASEYCENTER (BASEVIDHEIGHT/2)
@ -1468,26 +1469,18 @@ static void R_ProjectSprite(mobj_t *thing)
#endif #endif
// uncapped/interpolation // uncapped/interpolation
fixed_t interpx = thing->x; fixed_t interpx = R_InterpolateFixed(thing->old_x, thing->x);
fixed_t interpy = thing->y; fixed_t interpy = R_InterpolateFixed(thing->old_y, thing->y);
fixed_t interpz = thing->z; fixed_t interpz = R_InterpolateFixed(thing->old_z, thing->z);
angle_t interpangle = (thing->player ? thing->player->drawangle : thing->angle); angle_t interpangle = ANGLE_MAX;
// do interpolation if (thing->player)
if (cv_frameinterpolation.value == 1)
{ {
interpx = thing->old_x + FixedMul(rendertimefrac, thing->x - thing->old_x); interpangle = R_InterpolateAngle(thing->player->old_drawangle, thing->player->drawangle);
interpy = thing->old_y + FixedMul(rendertimefrac, thing->y - thing->old_y); }
interpz = thing->old_z + FixedMul(rendertimefrac, thing->z - thing->old_z); else
{
if (thing->player) interpangle = R_InterpolateAngle(thing->old_angle, thing->angle);
{
interpangle = thing->player->old_drawangle + FixedMul(rendertimefrac, thing->player->drawangle - thing->player->old_drawangle);
}
else
{
interpangle = thing->old_angle + FixedMul(rendertimefrac, thing->angle - thing->old_angle);
}
} }
// hitlag vibrating (todo: interp somehow?) // hitlag vibrating (todo: interp somehow?)
@ -1815,11 +1808,10 @@ static void R_ProjectSprite(mobj_t *thing)
fixed_t linkscale; fixed_t linkscale;
thing = thing->tracer; thing = thing->tracer;
if (cv_frameinterpolation.value == 1)
{ interpx = R_InterpolateFixed(thing->old_x, thing->x);
interpx = thing->old_x + FixedMul(thing->x - thing->old_x, rendertimefrac); interpy = R_InterpolateFixed(thing->old_y, thing->y);
interpy = thing->old_y + FixedMul(thing->y - thing->old_y, rendertimefrac); interpz = R_InterpolateFixed(thing->old_z, thing->z);
}
// hitlag vibrating (todo: interp somehow?) // hitlag vibrating (todo: interp somehow?)
if (thing->hitlag > 0 && (thing->eflags & MFE_DAMAGEHITLAG)) if (thing->hitlag > 0 && (thing->eflags & MFE_DAMAGEHITLAG))
@ -2158,17 +2150,9 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing)
fixed_t gz, gzt; fixed_t gz, gzt;
// uncapped/interpolation // uncapped/interpolation
fixed_t interpx = thing->x; fixed_t interpx = R_InterpolateFixed(thing->old_x, thing->x);
fixed_t interpy = thing->y; fixed_t interpy = R_InterpolateFixed(thing->old_y, thing->y);
fixed_t interpz = thing->z; fixed_t interpz = R_InterpolateFixed(thing->old_z, thing->z);
// do interpolation
if (cv_frameinterpolation.value == 1)
{
interpx = thing->old_x + FixedMul(rendertimefrac, thing->x - thing->old_x);
interpy = thing->old_y + FixedMul(rendertimefrac, thing->y - thing->old_y);
interpz = thing->old_z + FixedMul(rendertimefrac, thing->z - thing->old_z);
}
// transform the origin point // transform the origin point
tr_x = interpx - viewx; tr_x = interpx - viewx;