mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-22 10:52:23 +00:00
Timestamp function for Lua
This commit is contained in:
parent
9a5bb59801
commit
270c7701b4
3 changed files with 17 additions and 2 deletions
|
@ -50,7 +50,7 @@ tic_t I_GetTime(void);
|
|||
*/
|
||||
precise_t I_GetPreciseTime(void);
|
||||
|
||||
/** \brief Returns the difference between precise times as microseconds.
|
||||
/** \brief Converts a precise_t to microseconds and casts it to a 32 bit integer.
|
||||
*/
|
||||
int I_PreciseToMicros(precise_t);
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include "m_misc.h" // M_MapNumber
|
||||
#include "b_bot.h" // B_UpdateBotleader
|
||||
#include "d_clisrv.h" // CL_RemovePlayer
|
||||
#include "i_system.h" // I_GetPreciseTime, I_PreciseToMicros
|
||||
|
||||
#include "lua_script.h"
|
||||
#include "lua_libs.h"
|
||||
|
@ -3876,6 +3877,12 @@ static int lib_gTicsToMilliseconds(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int lib_iGetTimestamp(lua_State *L)
|
||||
{
|
||||
lua_pushinteger(L, I_PreciseToMicros(I_GetPreciseTime()));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static luaL_Reg lib[] = {
|
||||
{"print", lib_print},
|
||||
{"chatprint", lib_chatprint},
|
||||
|
@ -4150,6 +4157,8 @@ static luaL_Reg lib[] = {
|
|||
{"G_TicsToCentiseconds",lib_gTicsToCentiseconds},
|
||||
{"G_TicsToMilliseconds",lib_gTicsToMilliseconds},
|
||||
|
||||
{"I_GetTimestamp",lib_iGetTimestamp},
|
||||
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
|
|
@ -2163,7 +2163,13 @@ precise_t I_GetPreciseTime(void)
|
|||
|
||||
int I_PreciseToMicros(precise_t d)
|
||||
{
|
||||
return (int)(d / (timer_frequency / 1000000.0));
|
||||
// d is going to be converted into a double. So remove the highest bits
|
||||
// to avoid loss of precision in the lower bits, for the (probably rare) case
|
||||
// that the higher bits are actually used.
|
||||
d &= ((precise_t)1 << 53) - 1; // The mantissa of a double can handle 53 bits at most.
|
||||
// The resulting double from the calculation is converted first to UINT64 to avoid overflow,
|
||||
// which is undefined behaviour when converting floating point values to integers.
|
||||
return (int)(UINT64)(d / (timer_frequency / 1000000.0));
|
||||
}
|
||||
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue