diff --git a/src/d_clisrv.c b/src/d_clisrv.c index ac8bba608288063b7b34dff533f9d2ef0e9c84e2..2972502a7b7b273003ec3efda9a7ee5bf1296893 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5206,8 +5206,10 @@ static void SV_Maketic(void) maketic++; } -void TryRunTics(tic_t realtics) +boolean TryRunTics(tic_t realtics) { + boolean ticking; + // the machine has lagged but it is not so bad if (realtics > TICRATE/7) // FIXME: consistency failure!! { @@ -5251,10 +5253,14 @@ void TryRunTics(tic_t realtics) } #endif + ticking = neededtic > gametic; + if (player_joining) - return; + { + return false; + } - if (neededtic > gametic) + if (ticking) { if (advancedemo) { @@ -5290,6 +5296,8 @@ void TryRunTics(tic_t realtics) break; } } + + return ticking; } /* diff --git a/src/d_clisrv.h b/src/d_clisrv.h index bf3f0b64f5126eca92510a07686e10afbd07cba7..c75f7f0bf4007cbfbd3859c1517303cd06c2d7dd 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -430,7 +430,7 @@ boolean Playing(void); void D_QuitNetGame(void); //? How many ticks to run? -void TryRunTics(tic_t realtic); +boolean TryRunTics(tic_t realtic); // extra data for lmps // these functions scare me. they contain magic. diff --git a/src/d_main.c b/src/d_main.c index 963439d663398b33ad2f5984e549fc545439feb5..1559133208c606f1d6664e1a43f345739fd12db9 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -697,6 +697,7 @@ void D_SRB2Loop(void) { tic_t oldentertics = 0, entertic = 0, realtics = 0, rendertimeout = INFTICS; static lumpnum_t gstartuplumpnum; + boolean ticked; if (dedicated) server = true; @@ -783,11 +784,20 @@ void D_SRB2Loop(void) realtics = 1; // process tics (but maybe not if realtic == 0) - TryRunTics(realtics); + ticked = TryRunTics(realtics); - if (cv_frameinterpolation.value == 1) + if (cv_frameinterpolation.value == 1 && !(paused || P_AutoPause())) { - fixed_t entertimefrac = I_GetTimeFrac(); + static float tictime; + float entertime = I_GetTimeFrac(); + + fixed_t entertimefrac; + + if (ticked) + tictime = entertime; + + entertimefrac = FLOAT_TO_FIXED(entertime - tictime); + // renderdeltatics is a bit awkard to evaluate, since the system time interface is whole tic-based renderdeltatics = realtics * FRACUNIT; if (entertimefrac > rendertimefrac) diff --git a/src/i_system.h b/src/i_system.h index 0cdc7db855688c919816a907e718a5bc81e15b2c..93bb34a2155ab06df407e3d336ec69c99b2971d5 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -46,9 +46,9 @@ UINT32 I_GetFreeMem(UINT32 *total); */ tic_t I_GetTime(void); -/** \brief Get the current time as a fraction of a tic since the last tic. +/** \brief Get the current time in tics including fractions. */ -fixed_t I_GetTimeFrac(void); +float I_GetTimeFrac(void); /** \brief Returns precise time value for performance measurement. */ diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 2d99f5c1fcbecb8dc15225dbbec935fd5a71cd1d..bf2e42cfd83a00a8822a710628081c4d609d9e7f 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2160,11 +2160,10 @@ tic_t I_GetTime(void) return (tic_t) floor(elapsed_tics); } -fixed_t I_GetTimeFrac(void) +float I_GetTimeFrac(void) { UpdateElapsedTics(); - - return FLOAT_TO_FIXED((float) (elapsed_tics - floor(elapsed_tics))); + return elapsed_tics; } precise_t I_GetPreciseTime(void)