mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-14 00:40:52 +00:00
84 lines
2.2 KiB
C
84 lines
2.2 KiB
C
// SONIC ROBO BLAST 2
|
|
//-----------------------------------------------------------------------------
|
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
|
// Copyright (C) 1999-2023 by Sonic Team Junior.
|
|
//
|
|
// This program is free software distributed under the
|
|
// terms of the GNU General Public License, version 2.
|
|
// See the 'LICENSE' file for more details.
|
|
//-----------------------------------------------------------------------------
|
|
/// \file i_time.c
|
|
/// \brief Timing for the system layer.
|
|
|
|
#include "i_time.h"
|
|
|
|
#include <math.h>
|
|
|
|
#include "command.h"
|
|
#include "doomtype.h"
|
|
#include "netcode/d_netcmd.h"
|
|
#include "m_fixed.h"
|
|
#include "i_system.h"
|
|
|
|
timestate_t g_time;
|
|
|
|
static CV_PossibleValue_t timescale_cons_t[] = {{FRACUNIT/20, "MIN"}, {20*FRACUNIT, "MAX"}, {0, NULL}};
|
|
consvar_t cv_timescale = CVAR_INIT ("timescale", "1.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, timescale_cons_t, NULL);
|
|
|
|
static precise_t enterprecise, oldenterprecise;
|
|
static fixed_t entertic, oldentertics;
|
|
static double tictimer;
|
|
|
|
tic_t I_GetTime(void)
|
|
{
|
|
return g_time.time;
|
|
}
|
|
|
|
void I_InitializeTime(void)
|
|
{
|
|
CV_RegisterVar(&cv_timescale);
|
|
|
|
// I_StartupTimer is preserved for potential subsystems that need to setup
|
|
// timing information for I_GetPreciseTime and sleeping
|
|
I_StartupTimer();
|
|
|
|
g_time.time = 0;
|
|
g_time.timefrac = 0;
|
|
|
|
enterprecise = I_GetPreciseTime();
|
|
oldenterprecise = enterprecise;
|
|
entertic = 0;
|
|
oldentertics = 0;
|
|
tictimer = 0.0;
|
|
}
|
|
|
|
void I_UpdateTime(fixed_t timescale)
|
|
{
|
|
double ticratescaled;
|
|
double elapsedseconds;
|
|
tic_t realtics;
|
|
|
|
// get real tics
|
|
ticratescaled = (double)TICRATE * FIXED_TO_FLOAT(timescale);
|
|
|
|
enterprecise = I_GetPreciseTime();
|
|
elapsedseconds = (double)(enterprecise - oldenterprecise) / I_GetPrecisePrecision();
|
|
tictimer += elapsedseconds;
|
|
while (tictimer > 1.0/ticratescaled)
|
|
{
|
|
entertic += 1;
|
|
tictimer -= 1.0/ticratescaled;
|
|
}
|
|
realtics = entertic - oldentertics;
|
|
oldentertics = entertic;
|
|
oldenterprecise = enterprecise;
|
|
|
|
// Update global time state
|
|
g_time.time += realtics;
|
|
{
|
|
double fractional, integral;
|
|
fractional = modf(tictimer * ticratescaled, &integral);
|
|
g_time.timefrac = FLOAT_TO_FIXED(fractional);
|
|
}
|
|
}
|