mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 09:11:48 +00:00
Reset view interpolation on level load
This commit is contained in:
parent
7c9e133eb4
commit
d34ec2ef06
3 changed files with 27 additions and 5 deletions
|
@ -33,6 +33,7 @@
|
||||||
#include "r_picformats.h"
|
#include "r_picformats.h"
|
||||||
#include "r_sky.h"
|
#include "r_sky.h"
|
||||||
#include "r_draw.h"
|
#include "r_draw.h"
|
||||||
|
#include "r_fps.h" // R_ResetViewInterpolation in level load
|
||||||
|
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
#include "st_stuff.h"
|
#include "st_stuff.h"
|
||||||
|
@ -4479,6 +4480,11 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate)
|
||||||
|
|
||||||
P_MapEnd(); // tmthing is no longer needed from this point onwards
|
P_MapEnd(); // tmthing is no longer needed from this point onwards
|
||||||
|
|
||||||
|
if (rendermode != render_none)
|
||||||
|
{
|
||||||
|
R_ResetViewInterpolation();
|
||||||
|
}
|
||||||
|
|
||||||
// Took me 3 hours to figure out why my progression kept on getting overwritten with the titlemap...
|
// Took me 3 hours to figure out why my progression kept on getting overwritten with the titlemap...
|
||||||
if (!titlemapinaction)
|
if (!titlemapinaction)
|
||||||
{
|
{
|
||||||
|
|
24
src/r_fps.c
24
src/r_fps.c
|
@ -34,6 +34,7 @@ static viewvars_t sky2view_old;
|
||||||
static viewvars_t sky2view_new;
|
static viewvars_t sky2view_new;
|
||||||
|
|
||||||
static viewvars_t *oldview = &p1view_old;
|
static viewvars_t *oldview = &p1view_old;
|
||||||
|
static BOOL oldview_valid = FALSE;
|
||||||
viewvars_t *newview = &p1view_new;
|
viewvars_t *newview = &p1view_new;
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,18 +88,25 @@ static void R_SetupFreelook(player_t *player, boolean skybox)
|
||||||
|
|
||||||
void R_InterpolateView(fixed_t frac)
|
void R_InterpolateView(fixed_t frac)
|
||||||
{
|
{
|
||||||
|
viewvars_t* prevview = oldview;
|
||||||
boolean skybox = 0;
|
boolean skybox = 0;
|
||||||
if (FIXED_TO_FLOAT(frac) < 0)
|
if (FIXED_TO_FLOAT(frac) < 0)
|
||||||
frac = 0;
|
frac = 0;
|
||||||
if (frac > FRACUNIT)
|
if (frac > FRACUNIT)
|
||||||
frac = FRACUNIT;
|
frac = FRACUNIT;
|
||||||
|
|
||||||
viewx = oldview->x + R_LerpFixed(oldview->x, newview->x, frac);
|
if (oldview_valid == FALSE)
|
||||||
viewy = oldview->y + R_LerpFixed(oldview->y, newview->y, frac);
|
{
|
||||||
viewz = oldview->z + R_LerpFixed(oldview->z, newview->z, frac);
|
// interpolate from newview to newview
|
||||||
|
prevview = newview;
|
||||||
|
}
|
||||||
|
|
||||||
viewangle = oldview->angle + R_LerpAngle(oldview->angle, newview->angle, frac);
|
viewx = prevview->x + R_LerpFixed(prevview->x, newview->x, frac);
|
||||||
aimingangle = oldview->aim + R_LerpAngle(oldview->aim, newview->aim, frac);
|
viewy = prevview->y + R_LerpFixed(prevview->y, newview->y, frac);
|
||||||
|
viewz = prevview->z + R_LerpFixed(prevview->z, newview->z, frac);
|
||||||
|
|
||||||
|
viewangle = prevview->angle + R_LerpAngle(prevview->angle, newview->angle, frac);
|
||||||
|
aimingangle = prevview->aim + R_LerpAngle(prevview->aim, newview->aim, frac);
|
||||||
|
|
||||||
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
||||||
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
||||||
|
@ -123,6 +131,12 @@ void R_UpdateViewInterpolation(void)
|
||||||
p2view_old = p2view_new;
|
p2view_old = p2view_new;
|
||||||
sky1view_old = sky1view_new;
|
sky1view_old = sky1view_new;
|
||||||
sky2view_old = sky2view_new;
|
sky2view_old = sky2view_new;
|
||||||
|
oldview_valid = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void R_ResetViewInterpolation(void)
|
||||||
|
{
|
||||||
|
oldview_valid = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void R_SetViewContext(enum viewcontext_e _viewcontext)
|
void R_SetViewContext(enum viewcontext_e _viewcontext)
|
||||||
|
|
|
@ -48,6 +48,8 @@ extern viewvars_t *newview;
|
||||||
void R_InterpolateView(fixed_t frac);
|
void R_InterpolateView(fixed_t frac);
|
||||||
// Buffer the current new views into the old views. Call once after each real tic.
|
// Buffer the current new views into the old views. Call once after each real tic.
|
||||||
void R_UpdateViewInterpolation(void);
|
void R_UpdateViewInterpolation(void);
|
||||||
|
// Reset the view states (e.g. after level load) so R_InterpolateView doesn't interpolate invalid data
|
||||||
|
void R_ResetViewInterpolation(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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue