mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-11 15:21:51 +00:00
This commit is contained in:
commit
4e45ea2300
19 changed files with 107 additions and 123 deletions
|
@ -1617,8 +1617,16 @@ void C_ArchiveCVars (FConfigFile *f, uint32 filter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXTERN_CVAR(Bool, sv_cheats);
|
||||||
|
|
||||||
void FBaseCVar::CmdSet (const char *newval)
|
void FBaseCVar::CmdSet (const char *newval)
|
||||||
{
|
{
|
||||||
|
if ((GetFlags() & CVAR_CHEAT) && !sv_cheats)
|
||||||
|
{
|
||||||
|
Printf("sv_cheats must be true to set this console variable.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
UCVarValue val;
|
UCVarValue val;
|
||||||
|
|
||||||
// Casting away the const is safe in this case.
|
// Casting away the const is safe in this case.
|
||||||
|
|
|
@ -63,6 +63,7 @@ enum
|
||||||
CVAR_NOSAVE = 4096, // when used with CVAR_SERVERINFO, do not save var to savegame
|
CVAR_NOSAVE = 4096, // when used with CVAR_SERVERINFO, do not save var to savegame
|
||||||
CVAR_MOD = 8192, // cvar was defined by a mod
|
CVAR_MOD = 8192, // cvar was defined by a mod
|
||||||
CVAR_IGNORE = 16384,// do not send cvar across the network/inaccesible from ACS (dummy mod cvar)
|
CVAR_IGNORE = 16384,// do not send cvar across the network/inaccesible from ACS (dummy mod cvar)
|
||||||
|
CVAR_CHEAT = 32768,// can be set only when sv_cheats is enabled
|
||||||
};
|
};
|
||||||
|
|
||||||
union UCVarValue
|
union UCVarValue
|
||||||
|
|
|
@ -1395,6 +1395,10 @@ void ParseCVarInfo()
|
||||||
{
|
{
|
||||||
cvarflags &= ~CVAR_ARCHIVE;
|
cvarflags &= ~CVAR_ARCHIVE;
|
||||||
}
|
}
|
||||||
|
else if (stricmp(sc.String, "cheat") == 0)
|
||||||
|
{
|
||||||
|
cvarflags |= CVAR_CHEAT;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sc.ScriptError("Unknown cvar attribute '%s'", sc.String);
|
sc.ScriptError("Unknown cvar attribute '%s'", sc.String);
|
||||||
|
@ -2704,6 +2708,7 @@ void D_DoomMain (void)
|
||||||
S_Shutdown(); // free all channels and delete playlist
|
S_Shutdown(); // free all channels and delete playlist
|
||||||
C_ClearAliases(); // CCMDs won't be reinitialized so these need to be deleted here
|
C_ClearAliases(); // CCMDs won't be reinitialized so these need to be deleted here
|
||||||
DestroyCVarsFlagged(CVAR_MOD); // Delete any cvar left by mods
|
DestroyCVarsFlagged(CVAR_MOD); // Delete any cvar left by mods
|
||||||
|
FS_Close(); // destroy the global FraggleScript.
|
||||||
|
|
||||||
GC::FullGC(); // clean up before taking down the object list.
|
GC::FullGC(); // clean up before taking down the object list.
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,7 @@ FNamespaceManager Namespaces;
|
||||||
|
|
||||||
FTypeTable TypeTable;
|
FTypeTable TypeTable;
|
||||||
TArray<PClass *> PClass::AllClasses;
|
TArray<PClass *> PClass::AllClasses;
|
||||||
|
TArray<VMFunction**> PClass::FunctionPtrList;
|
||||||
bool PClass::bShutdown;
|
bool PClass::bShutdown;
|
||||||
bool PClass::bVMOperational;
|
bool PClass::bVMOperational;
|
||||||
|
|
||||||
|
@ -2840,6 +2841,12 @@ void PClass::StaticShutdown ()
|
||||||
TArray<size_t *> uniqueFPs(64);
|
TArray<size_t *> uniqueFPs(64);
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
|
// delete all variables containing pointers to script functions.
|
||||||
|
for (auto p : FunctionPtrList)
|
||||||
|
{
|
||||||
|
*p = nullptr;
|
||||||
|
}
|
||||||
|
FunctionPtrList.Clear();
|
||||||
|
|
||||||
// Make a full garbage collection here so that all destroyed but uncollected higher level objects that still exist can be properly taken down.
|
// Make a full garbage collection here so that all destroyed but uncollected higher level objects that still exist can be properly taken down.
|
||||||
GC::FullGC();
|
GC::FullGC();
|
||||||
|
@ -3547,6 +3554,16 @@ VMFunction *PClass::FindFunction(FName clsname, FName funcname)
|
||||||
return func->Variants[0].Implementation;
|
return func->Variants[0].Implementation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PClass::FindFunction(VMFunction **pptr, FName clsname, FName funcname)
|
||||||
|
{
|
||||||
|
auto cls = PClass::FindActor(clsname);
|
||||||
|
if (!cls) return;
|
||||||
|
auto func = dyn_cast<PFunction>(cls->Symbols.FindSymbol(funcname, true));
|
||||||
|
if (!func) return;
|
||||||
|
*pptr = func->Variants[0].Implementation;
|
||||||
|
FunctionPtrList.Push(pptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* FTypeTable **************************************************************/
|
/* FTypeTable **************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -848,9 +848,11 @@ public:
|
||||||
static PClassActor *FindActor(ENamedName name) { return FindActor(FName(name)); }
|
static PClassActor *FindActor(ENamedName name) { return FindActor(FName(name)); }
|
||||||
static PClassActor *FindActor(FName name);
|
static PClassActor *FindActor(FName name);
|
||||||
static VMFunction *FindFunction(FName cls, FName func);
|
static VMFunction *FindFunction(FName cls, FName func);
|
||||||
|
static void FindFunction(VMFunction **pptr, FName cls, FName func);
|
||||||
PClass *FindClassTentative(FName name);
|
PClass *FindClassTentative(FName name);
|
||||||
|
|
||||||
static TArray<PClass *> AllClasses;
|
static TArray<PClass *> AllClasses;
|
||||||
|
static TArray<VMFunction**> FunctionPtrList;
|
||||||
|
|
||||||
static bool bShutdown;
|
static bool bShutdown;
|
||||||
static bool bVMOperational;
|
static bool bVMOperational;
|
||||||
|
|
|
@ -522,7 +522,7 @@ DEFINE_ACTION_FUNCTION(AInventory, DoRespawn)
|
||||||
bool AInventory::CallTryPickup(AActor *toucher, AActor **toucher_return)
|
bool AInventory::CallTryPickup(AActor *toucher, AActor **toucher_return)
|
||||||
{
|
{
|
||||||
static VMFunction *func = nullptr;
|
static VMFunction *func = nullptr;
|
||||||
if (func == nullptr) func = PClass::FindFunction(NAME_Inventory, NAME_CallTryPickup);
|
if (func == nullptr) PClass::FindFunction(&func, NAME_Inventory, NAME_CallTryPickup);
|
||||||
VMValue params[2] = { (DObject*)this, toucher };
|
VMValue params[2] = { (DObject*)this, toucher };
|
||||||
VMReturn ret[2];
|
VMReturn ret[2];
|
||||||
int res;
|
int res;
|
||||||
|
|
|
@ -1437,7 +1437,7 @@ class CommandDrawNumber : public CommandDrawString
|
||||||
{
|
{
|
||||||
// num = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem) / TICRATE + 1;
|
// num = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem) / TICRATE + 1;
|
||||||
static VMFunction *func = nullptr;
|
static VMFunction *func = nullptr;
|
||||||
if (func == nullptr) func = PClass::FindFunction(NAME_PlayerPawn, "GetEffectTicsForItem");
|
if (func == nullptr) PClass::FindFunction(&func, NAME_PlayerPawn, "GetEffectTicsForItem");
|
||||||
VMValue params[] = { statusBar->CPlayer->mo, inventoryItem };
|
VMValue params[] = { statusBar->CPlayer->mo, inventoryItem };
|
||||||
int retv;
|
int retv;
|
||||||
VMReturn ret(&retv);
|
VMReturn ret(&retv);
|
||||||
|
@ -2830,7 +2830,7 @@ class CommandDrawBar : public SBarInfoCommand
|
||||||
// [value, max] = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem);
|
// [value, max] = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem);
|
||||||
// value++; max++;
|
// value++; max++;
|
||||||
static VMFunction *func = nullptr;
|
static VMFunction *func = nullptr;
|
||||||
if (func == nullptr) func = PClass::FindFunction(NAME_PlayerPawn, "GetEffectTicsForItem");
|
if (func == nullptr) PClass::FindFunction(&func, NAME_PlayerPawn, "GetEffectTicsForItem");
|
||||||
VMValue params[] = { statusBar->CPlayer->mo, data.inventoryItem };
|
VMValue params[] = { statusBar->CPlayer->mo, data.inventoryItem };
|
||||||
VMReturn ret[2];
|
VMReturn ret[2];
|
||||||
int ival;
|
int ival;
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
|
|
||||||
#define USE_WINDOWS_DWORD
|
#define USE_WINDOWS_DWORD
|
||||||
|
#elif defined __APPLE__
|
||||||
|
#include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
|
@ -114,6 +116,15 @@ void gl_CalculateCPUSpeed ()
|
||||||
gl_SecondsPerCycle = 1.0 / CyclesPerSecond;
|
gl_SecondsPerCycle = 1.0 / CyclesPerSecond;
|
||||||
gl_MillisecPerCycle = 1000.0 / CyclesPerSecond;
|
gl_MillisecPerCycle = 1000.0 / CyclesPerSecond;
|
||||||
}
|
}
|
||||||
|
#elif defined __APPLE__
|
||||||
|
long long frequency;
|
||||||
|
size_t size = sizeof frequency;
|
||||||
|
|
||||||
|
if (0 == sysctlbyname("machdep.tsc.frequency", &frequency, &size, nullptr, 0) && 0 != frequency)
|
||||||
|
{
|
||||||
|
gl_SecondsPerCycle = 1.0 / frequency;
|
||||||
|
gl_MillisecPerCycle = 1000.0 / frequency;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,11 @@
|
||||||
|
|
||||||
extern bool gl_benching;
|
extern bool gl_benching;
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
|
|
||||||
extern double gl_SecondsPerCycle;
|
extern double gl_SecondsPerCycle;
|
||||||
extern double gl_MillisecPerCycle;
|
extern double gl_MillisecPerCycle;
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
|
||||||
__forceinline long long GetClockCycle ()
|
__forceinline long long GetClockCycle ()
|
||||||
{
|
{
|
||||||
#if _M_X64
|
#if _M_X64
|
||||||
|
@ -21,10 +21,14 @@ __forceinline long long GetClockCycle ()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__GNUG__) && defined(__i386__)
|
#elif defined __APPLE__ && (defined __i386__ || defined __x86_64__)
|
||||||
|
|
||||||
extern double gl_SecondsPerCycle;
|
inline long long GetClockCycle()
|
||||||
extern double gl_MillisecPerCycle;
|
{
|
||||||
|
return __builtin_ia32_rdtsc();
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(__GNUG__) && defined(__i386__)
|
||||||
|
|
||||||
inline long long GetClockCycle()
|
inline long long GetClockCycle()
|
||||||
{
|
{
|
||||||
|
@ -42,21 +46,12 @@ inline long long GetClockCycle()
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
extern double gl_SecondsPerCycle;
|
|
||||||
extern double gl_MillisecPerCycle;
|
|
||||||
|
|
||||||
inline long long GetClockCycle ()
|
inline long long GetClockCycle ()
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (__APPLE__)
|
|
||||||
|
|
||||||
typedef cycle_t glcycle_t;
|
|
||||||
|
|
||||||
#else // !__APPLE__
|
|
||||||
|
|
||||||
class glcycle_t
|
class glcycle_t
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -100,8 +95,6 @@ private:
|
||||||
long long Counter;
|
long long Counter;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __APPLE__
|
|
||||||
|
|
||||||
extern glcycle_t RenderWall,SetupWall,ClipWall;
|
extern glcycle_t RenderWall,SetupWall,ClipWall;
|
||||||
extern glcycle_t RenderFlat,SetupFlat;
|
extern glcycle_t RenderFlat,SetupFlat;
|
||||||
extern glcycle_t RenderSprite,SetupSprite;
|
extern glcycle_t RenderSprite,SetupSprite;
|
||||||
|
|
|
@ -478,7 +478,7 @@ void cht_DoCheat (player_t *player, int cheat)
|
||||||
if (player->mo != NULL && player->health >= 0)
|
if (player->mo != NULL && player->health >= 0)
|
||||||
{
|
{
|
||||||
static VMFunction *gsp = nullptr;
|
static VMFunction *gsp = nullptr;
|
||||||
if (gsp == nullptr) gsp = PClass::FindFunction(NAME_Sigil, NAME_GiveSigilPiece);
|
if (gsp == nullptr) PClass::FindFunction(&gsp, NAME_Sigil, NAME_GiveSigilPiece);
|
||||||
if (gsp)
|
if (gsp)
|
||||||
{
|
{
|
||||||
VMValue params[1] = { player->mo };
|
VMValue params[1] = { player->mo };
|
||||||
|
|
|
@ -6203,7 +6203,7 @@ static bool CharArrayParms(int &capacity, int &offset, int &a, int *Stack, int &
|
||||||
static void SetMarineWeapon(AActor *marine, int weapon)
|
static void SetMarineWeapon(AActor *marine, int weapon)
|
||||||
{
|
{
|
||||||
static VMFunction *smw = nullptr;
|
static VMFunction *smw = nullptr;
|
||||||
if (smw == nullptr) smw = PClass::FindFunction(NAME_ScriptedMarine, NAME_SetWeapon);
|
if (smw == nullptr) PClass::FindFunction(&smw, NAME_ScriptedMarine, NAME_SetWeapon);
|
||||||
if (smw)
|
if (smw)
|
||||||
{
|
{
|
||||||
VMValue params[2] = { marine, weapon };
|
VMValue params[2] = { marine, weapon };
|
||||||
|
@ -6214,7 +6214,7 @@ static void SetMarineWeapon(AActor *marine, int weapon)
|
||||||
static void SetMarineSprite(AActor *marine, PClassActor *source)
|
static void SetMarineSprite(AActor *marine, PClassActor *source)
|
||||||
{
|
{
|
||||||
static VMFunction *sms = nullptr;
|
static VMFunction *sms = nullptr;
|
||||||
if (sms == nullptr) sms = PClass::FindFunction(NAME_ScriptedMarine, NAME_SetSprite);
|
if (sms == nullptr) PClass::FindFunction(&sms, NAME_ScriptedMarine, NAME_SetSprite);
|
||||||
if (sms)
|
if (sms)
|
||||||
{
|
{
|
||||||
VMValue params[2] = { marine, source };
|
VMValue params[2] = { marine, source };
|
||||||
|
|
|
@ -2049,7 +2049,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->target)
|
if (self->target && self->SeeState)
|
||||||
{
|
{
|
||||||
self->SetState (self->SeeState);
|
self->SetState (self->SeeState);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3423,6 +3423,17 @@ extern polyblock_t **PolyBlockMap;
|
||||||
|
|
||||||
void P_FreeLevelData ()
|
void P_FreeLevelData ()
|
||||||
{
|
{
|
||||||
|
MapThingsConverted.Clear();
|
||||||
|
MapThingsUserDataIndex.Clear();
|
||||||
|
MapThingsUserData.Clear();
|
||||||
|
linemap.Clear();
|
||||||
|
FCanvasTextureInfo::EmptyList();
|
||||||
|
R_FreePastViewers();
|
||||||
|
P_ClearUDMFKeys();
|
||||||
|
|
||||||
|
// [RH] Clear all ThingID hash chains.
|
||||||
|
AActor::ClearTIDHashes();
|
||||||
|
|
||||||
P_FreeMapDataBackup();
|
P_FreeMapDataBackup();
|
||||||
interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level.
|
interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level.
|
||||||
Renderer->CleanLevelData();
|
Renderer->CleanLevelData();
|
||||||
|
@ -3575,14 +3586,6 @@ void P_SetupLevel (const char *lumpname, int position)
|
||||||
level.maptype = MAPTYPE_UNKNOWN;
|
level.maptype = MAPTYPE_UNKNOWN;
|
||||||
wminfo.partime = 180;
|
wminfo.partime = 180;
|
||||||
|
|
||||||
MapThingsConverted.Clear();
|
|
||||||
MapThingsUserDataIndex.Clear();
|
|
||||||
MapThingsUserData.Clear();
|
|
||||||
linemap.Clear();
|
|
||||||
FCanvasTextureInfo::EmptyList ();
|
|
||||||
R_FreePastViewers ();
|
|
||||||
P_ClearUDMFKeys();
|
|
||||||
|
|
||||||
if (!savegamerestore)
|
if (!savegamerestore)
|
||||||
{
|
{
|
||||||
for (i = 0; i < MAXPLAYERS; ++i)
|
for (i = 0; i < MAXPLAYERS; ++i)
|
||||||
|
@ -3612,8 +3615,6 @@ void P_SetupLevel (const char *lumpname, int position)
|
||||||
|
|
||||||
// Make sure all sounds are stopped before Z_FreeTags.
|
// Make sure all sounds are stopped before Z_FreeTags.
|
||||||
S_Start ();
|
S_Start ();
|
||||||
// [RH] Clear all ThingID hash chains.
|
|
||||||
AActor::ClearTIDHashes ();
|
|
||||||
|
|
||||||
// [RH] clear out the mid-screen message
|
// [RH] clear out the mid-screen message
|
||||||
C_MidPrint (NULL, NULL);
|
C_MidPrint (NULL, NULL);
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <fnmatch.h>
|
#include <fnmatch.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
#include "d_ticcmd.h"
|
#include "d_ticcmd.h"
|
||||||
#include "doomdef.h"
|
#include "doomdef.h"
|
||||||
|
@ -98,9 +99,29 @@ void SetLanguageIDs()
|
||||||
void I_InitTimer();
|
void I_InitTimer();
|
||||||
void I_ShutdownTimer();
|
void I_ShutdownTimer();
|
||||||
|
|
||||||
|
double PerfToSec, PerfToMillisec;
|
||||||
|
|
||||||
|
static void CalculateCPUSpeed()
|
||||||
|
{
|
||||||
|
long long frequency;
|
||||||
|
size_t size = sizeof frequency;
|
||||||
|
|
||||||
|
if (0 == sysctlbyname("machdep.tsc.frequency", &frequency, &size, nullptr, 0) && 0 != frequency)
|
||||||
|
{
|
||||||
|
PerfToSec = 1.0 / frequency;
|
||||||
|
PerfToMillisec = 1000.0 / frequency;
|
||||||
|
|
||||||
|
if (!batchrun)
|
||||||
|
{
|
||||||
|
Printf("CPU speed: %.0f MHz\n", 0.001 / PerfToMillisec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void I_Init(void)
|
void I_Init(void)
|
||||||
{
|
{
|
||||||
CheckCPUID(&CPU);
|
CheckCPUID(&CPU);
|
||||||
|
CalculateCPUSpeed();
|
||||||
DumpCPUInfo(&CPU);
|
DumpCPUInfo(&CPU);
|
||||||
|
|
||||||
atterm(I_ShutdownSound);
|
atterm(I_ShutdownSound);
|
||||||
|
|
|
@ -546,6 +546,9 @@ CocoaVideo::CocoaVideo()
|
||||||
{
|
{
|
||||||
memset(&m_modeIterator, 0, sizeof m_modeIterator);
|
memset(&m_modeIterator, 0, sizeof m_modeIterator);
|
||||||
|
|
||||||
|
extern void gl_CalculateCPUSpeed();
|
||||||
|
gl_CalculateCPUSpeed();
|
||||||
|
|
||||||
// Create OpenGL pixel format
|
// Create OpenGL pixel format
|
||||||
|
|
||||||
NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat(OpenGLProfile::Core);
|
NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat(OpenGLProfile::Core);
|
||||||
|
|
|
@ -42,15 +42,6 @@
|
||||||
#include "m_swap.h"
|
#include "m_swap.h"
|
||||||
#include "sbar.h"
|
#include "sbar.h"
|
||||||
|
|
||||||
|
|
||||||
#if defined (__APPLE__)
|
|
||||||
|
|
||||||
mach_timebase_info_data_t cycle_t::s_info;
|
|
||||||
bool cycle_t::s_initialized;
|
|
||||||
|
|
||||||
#endif // __APPLE__
|
|
||||||
|
|
||||||
|
|
||||||
FStat *FStat::FirstStat;
|
FStat *FStat::FirstStat;
|
||||||
|
|
||||||
FStat::FStat (const char *name)
|
FStat::FStat (const char *name)
|
||||||
|
|
87
src/stats.h
87
src/stats.h
|
@ -36,78 +36,7 @@
|
||||||
|
|
||||||
#include "zstring.h"
|
#include "zstring.h"
|
||||||
|
|
||||||
#ifndef _WIN32
|
#if !defined _WIN32 && !defined __APPLE__
|
||||||
|
|
||||||
#if defined (__APPLE__)
|
|
||||||
|
|
||||||
|
|
||||||
#include <mach/mach_time.h>
|
|
||||||
|
|
||||||
|
|
||||||
class cycle_t
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
cycle_t()
|
|
||||||
{
|
|
||||||
if ( !s_initialized )
|
|
||||||
{
|
|
||||||
mach_timebase_info( &s_info );
|
|
||||||
s_initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
cycle_t &operator=( const cycle_t &other )
|
|
||||||
{
|
|
||||||
if ( &other != this )
|
|
||||||
{
|
|
||||||
m_seconds = other.m_seconds;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Reset()
|
|
||||||
{
|
|
||||||
m_seconds = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Clock()
|
|
||||||
{
|
|
||||||
m_seconds -= Nanoseconds() * 1e-9;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Unclock()
|
|
||||||
{
|
|
||||||
m_seconds += Nanoseconds() * 1e-9;
|
|
||||||
}
|
|
||||||
|
|
||||||
double Time()
|
|
||||||
{
|
|
||||||
return m_seconds;
|
|
||||||
}
|
|
||||||
|
|
||||||
double TimeMS()
|
|
||||||
{
|
|
||||||
return m_seconds * 1e3;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
double m_seconds;
|
|
||||||
|
|
||||||
static mach_timebase_info_data_t s_info;
|
|
||||||
static bool s_initialized;
|
|
||||||
|
|
||||||
uint64_t Nanoseconds() const
|
|
||||||
{
|
|
||||||
return mach_absolute_time() * s_info.numer / s_info.denom;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#else // !__APPLE__
|
|
||||||
|
|
||||||
#ifdef NO_CLOCK_GETTIME
|
#ifdef NO_CLOCK_GETTIME
|
||||||
class cycle_t
|
class cycle_t
|
||||||
|
@ -171,11 +100,9 @@ private:
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // __APPLE__
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// Windows
|
// Windows and macOS
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
|
|
||||||
extern double PerfToSec, PerfToMillisec;
|
extern double PerfToSec, PerfToMillisec;
|
||||||
|
@ -199,15 +126,19 @@ inline unsigned __int64 rdtsc()
|
||||||
#else
|
#else
|
||||||
inline unsigned long long rdtsc()
|
inline unsigned long long rdtsc()
|
||||||
{
|
{
|
||||||
#ifndef __amd64__
|
#ifdef __amd64__
|
||||||
|
unsigned long long tsc;
|
||||||
|
asm volatile ("rdtsc; shlq $32, %%rdx; orq %%rdx, %%rax" : "=a" (tsc) :: "%rdx");
|
||||||
|
return tsc;
|
||||||
|
#else // i386
|
||||||
if (CPU.bRDTSC)
|
if (CPU.bRDTSC)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
register unsigned long long tsc;
|
unsigned long long tsc;
|
||||||
asm volatile ("\trdtsc\n" : "=A" (tsc));
|
asm volatile ("\trdtsc\n" : "=A" (tsc));
|
||||||
return tsc;
|
return tsc;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif // __amd64__
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -287,7 +287,7 @@ class PathFollower : Actor
|
||||||
|
|
||||||
if (Interpolate ())
|
if (Interpolate ())
|
||||||
{
|
{
|
||||||
Time += (8. / (CurrNode.args[1] * TICRATE));
|
Time += (8. / (max(1, CurrNode.args[1]) * TICRATE));
|
||||||
if (Time > 1.)
|
if (Time > 1.)
|
||||||
{
|
{
|
||||||
Time -= 1.;
|
Time -= 1.;
|
||||||
|
|
|
@ -1345,7 +1345,7 @@ flickerlight2 FIREBULL
|
||||||
attenuate 1
|
attenuate 1
|
||||||
color 1.0 0.7 0.0
|
color 1.0 0.7 0.0
|
||||||
size 96
|
size 96
|
||||||
secondarysize - 105
|
secondarysize 130
|
||||||
interval 0.1
|
interval 0.1
|
||||||
offset 0 40 0
|
offset 0 40 0
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue