From 386ae2067b5e89ed41811acaa7d685d640218233 Mon Sep 17 00:00:00 2001 From: SNMetamorph <25657591+SNMetamorph@users.noreply.github.com> Date: Fri, 7 May 2021 21:53:15 +0400 Subject: [PATCH] engine: client: another interpolation fix --- engine/client/cl_main.c | 47 +++++++++++++++++++++-------------------- engine/client/client.h | 4 ++-- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 0e475b4d..b6ec739b 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -241,6 +241,11 @@ void CL_SignonReply( void ) } } +float CL_LerpInterval( void ) +{ + return max( cl_interp->value, 1.f / cl_updaterate->value ); +} + /* =============== CL_LerpPoint @@ -291,12 +296,13 @@ static float CL_LerpPoint( void ) if( cl_interp->value > 0.001f ) { // manual lerp value (goldsrc mode) - frac = ( cl.time - cl.mtime[1] ) / cl_interp->value; + float td = max( 0.f, cl.time - cl.mtime[0] ); + frac = td / CL_LerpInterval(); } else if( server_frametime > 0.001f ) { // automatic lerp (classic mode) - frac = ( cl.time - cl.mtime[1] ) / server_frametime; + frac = ( cl.time - cl.mtime[1] ) / server_frametime; } #endif return frac; @@ -339,10 +345,10 @@ Validate interpolation cvars, calc interpolation window */ void CL_ComputeClientInterpolationAmount( usercmd_t *cmd ) { - int min_interp = MIN_EX_INTERP; - int max_interp = MAX_EX_INTERP; - int interpolation_msec; - qboolean forced = false; + const float epsilon = 0.001f; // to avoid float invalid comparision + float min_interp = MIN_EX_INTERP; + float max_interp = MAX_EX_INTERP; + float interpolation_time; if( cl_updaterate->value < MIN_UPDATERATE ) { @@ -357,29 +363,24 @@ void CL_ComputeClientInterpolationAmount( usercmd_t *cmd ) } if( cls.spectator ) - max_interp = 200; + max_interp = 0.2f; - min_interp = 1000.0f / cl_updaterate->value; - min_interp = Q_max( 1, min_interp ); - interpolation_msec = cl_interp->value * 1000.0f; - - if(( interpolation_msec + 1 ) < min_interp ) + min_interp = 1.0f / cl_updaterate->value; + interpolation_time = CL_LerpInterval( ); + + if( (cl_interp->value + epsilon) < min_interp ) { - Con_Printf( "ex_interp forced up to %i msec\n", interpolation_msec ); - interpolation_msec = min_interp; - forced = true; + Con_Printf( "ex_interp forced up to %.1f msec\n", min_interp * 1000.f ); + Cvar_SetValue( "ex_interp", min_interp ); } - else if(( interpolation_msec - 1 ) > max_interp ) + else if( (cl_interp->value - epsilon) > max_interp ) { - Con_Printf( "ex_interp forced down to %i msec\n", interpolation_msec ); - interpolation_msec = max_interp; - forced = true; + Con_Printf( "ex_interp forced down to %.1f msec\n", max_interp * 1000.f ); + Cvar_SetValue( "ex_interp", max_interp ); } - if( forced ) Cvar_SetValue( "ex_interp", (float)interpolation_msec * 0.001f ); - interpolation_msec = bound( min_interp, interpolation_msec, max_interp ); - - cmd->lerp_msec = CL_DriftInterpolationAmount( interpolation_msec ); + interpolation_time = bound( min_interp, interpolation_time, max_interp ); + cmd->lerp_msec = CL_DriftInterpolationAmount( interpolation_time * 1000 ); } /* diff --git a/engine/client/client.h b/engine/client/client.h index 4dcdd6dd..0a239d7f 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -107,8 +107,8 @@ extern int CL_UPDATE_BACKUP; #define MIN_UPDATERATE 10.0f #define MAX_UPDATERATE 102.0f -#define MIN_EX_INTERP 50.0f -#define MAX_EX_INTERP 100.0f +#define MIN_EX_INTERP 0.005f +#define MAX_EX_INTERP 0.1f #define CL_MIN_RESEND_TIME 1.5f // mininum time gap (in seconds) before a subsequent connection request is sent. #define CL_MAX_RESEND_TIME 20.0f // max time. The cvar cl_resend is bounded by these.