mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-11 07:11:54 +00:00
Moved cursor and timer implementations into separate files
This commit is contained in:
parent
d6cc6ee452
commit
fecd1b6401
4 changed files with 291 additions and 244 deletions
|
@ -559,11 +559,13 @@ set( PLAT_SDL_SOURCES
|
||||||
sdl/crashcatcher.c
|
sdl/crashcatcher.c
|
||||||
sdl/hardware.cpp
|
sdl/hardware.cpp
|
||||||
sdl/i_cd.cpp
|
sdl/i_cd.cpp
|
||||||
|
sdl/i_cursor.cpp
|
||||||
sdl/i_input.cpp
|
sdl/i_input.cpp
|
||||||
sdl/i_joystick.cpp
|
sdl/i_joystick.cpp
|
||||||
sdl/i_main.cpp
|
sdl/i_main.cpp
|
||||||
sdl/i_movie.cpp
|
sdl/i_movie.cpp
|
||||||
sdl/i_system.cpp
|
sdl/i_system.cpp
|
||||||
|
sdl/i_timer.cpp
|
||||||
sdl/sdlvideo.cpp
|
sdl/sdlvideo.cpp
|
||||||
sdl/st_start.cpp )
|
sdl/st_start.cpp )
|
||||||
set( PLAT_MAC_SOURCES
|
set( PLAT_MAC_SOURCES
|
||||||
|
|
73
src/sdl/i_cursor.cpp
Normal file
73
src/sdl/i_cursor.cpp
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
|
||||||
|
// Moved from sdl/i_system.cpp
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
#include "bitmap.h"
|
||||||
|
#include "v_palette.h"
|
||||||
|
#include "textures.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern SDL_Surface *cursorSurface;
|
||||||
|
extern SDL_Rect cursorBlit;
|
||||||
|
|
||||||
|
|
||||||
|
bool I_SetCursor(FTexture *cursorpic)
|
||||||
|
{
|
||||||
|
if (cursorpic != NULL && cursorpic->UseType != FTexture::TEX_Null)
|
||||||
|
{
|
||||||
|
// Must be no larger than 32x32.
|
||||||
|
if (cursorpic->GetWidth() > 32 || cursorpic->GetHeight() > 32)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef USE_XCURSOR
|
||||||
|
if (UseXCursor)
|
||||||
|
{
|
||||||
|
if (FirstCursor == NULL)
|
||||||
|
{
|
||||||
|
FirstCursor = SDL_GetCursor();
|
||||||
|
}
|
||||||
|
X11Cursor = CreateColorCursor(cursorpic);
|
||||||
|
if (X11Cursor != NULL)
|
||||||
|
{
|
||||||
|
SDL_SetCursor(X11Cursor);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (cursorSurface == NULL)
|
||||||
|
cursorSurface = SDL_CreateRGBSurface (0, 32, 32, 32, MAKEARGB(0,255,0,0), MAKEARGB(0,0,255,0), MAKEARGB(0,0,0,255), MAKEARGB(255,0,0,0));
|
||||||
|
|
||||||
|
SDL_ShowCursor(0);
|
||||||
|
SDL_LockSurface(cursorSurface);
|
||||||
|
BYTE buffer[32*32*4];
|
||||||
|
memset(buffer, 0, 32*32*4);
|
||||||
|
FBitmap bmp(buffer, 32*4, 32, 32);
|
||||||
|
cursorpic->CopyTrueColorPixels(&bmp, 0, 0);
|
||||||
|
memcpy(cursorSurface->pixels, bmp.GetPixels(), 32*32*4);
|
||||||
|
SDL_UnlockSurface(cursorSurface);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SDL_ShowCursor(1);
|
||||||
|
|
||||||
|
if (cursorSurface != NULL)
|
||||||
|
{
|
||||||
|
SDL_FreeSurface(cursorSurface);
|
||||||
|
cursorSurface = NULL;
|
||||||
|
}
|
||||||
|
#ifdef USE_XCURSOR
|
||||||
|
if (X11Cursor != NULL)
|
||||||
|
{
|
||||||
|
SDL_SetCursor(FirstCursor);
|
||||||
|
SDL_FreeCursor(X11Cursor);
|
||||||
|
X11Cursor = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -122,190 +122,6 @@ void I_EndRead(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static DWORD TicStart;
|
|
||||||
static DWORD TicNext;
|
|
||||||
static DWORD BaseTime;
|
|
||||||
static int TicFrozen;
|
|
||||||
|
|
||||||
// Signal based timer.
|
|
||||||
static Semaphore timerWait;
|
|
||||||
static int tics;
|
|
||||||
static DWORD sig_start, sig_next;
|
|
||||||
|
|
||||||
void I_SelectTimer();
|
|
||||||
|
|
||||||
// [RH] Returns time in milliseconds
|
|
||||||
unsigned int I_MSTime (void)
|
|
||||||
{
|
|
||||||
unsigned int time = SDL_GetTicks ();
|
|
||||||
return time - BaseTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exactly the same thing, but based does no modification to the time.
|
|
||||||
unsigned int I_FPSTime()
|
|
||||||
{
|
|
||||||
return SDL_GetTicks();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// I_GetTime
|
|
||||||
// returns time in 1/35th second tics
|
|
||||||
//
|
|
||||||
int I_GetTimeSelect (bool saveMS)
|
|
||||||
{
|
|
||||||
I_SelectTimer();
|
|
||||||
return I_GetTime (saveMS);
|
|
||||||
}
|
|
||||||
|
|
||||||
int I_GetTimePolled (bool saveMS)
|
|
||||||
{
|
|
||||||
if (TicFrozen != 0)
|
|
||||||
{
|
|
||||||
return TicFrozen;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD tm = SDL_GetTicks();
|
|
||||||
|
|
||||||
if (saveMS)
|
|
||||||
{
|
|
||||||
TicStart = tm;
|
|
||||||
TicNext = Scale((Scale (tm, TICRATE, 1000) + 1), 1000, TICRATE);
|
|
||||||
}
|
|
||||||
return Scale(tm - BaseTime, TICRATE, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
int I_GetTimeSignaled (bool saveMS)
|
|
||||||
{
|
|
||||||
if (saveMS)
|
|
||||||
{
|
|
||||||
TicStart = sig_start;
|
|
||||||
TicNext = sig_next;
|
|
||||||
}
|
|
||||||
return tics;
|
|
||||||
}
|
|
||||||
|
|
||||||
int I_WaitForTicPolled (int prevtic)
|
|
||||||
{
|
|
||||||
int time;
|
|
||||||
|
|
||||||
assert (TicFrozen == 0);
|
|
||||||
while ((time = I_GetTimePolled(false)) <= prevtic)
|
|
||||||
;
|
|
||||||
|
|
||||||
return time;
|
|
||||||
}
|
|
||||||
|
|
||||||
int I_WaitForTicSignaled (int prevtic)
|
|
||||||
{
|
|
||||||
assert (TicFrozen == 0);
|
|
||||||
|
|
||||||
while(tics <= prevtic)
|
|
||||||
{
|
|
||||||
SEMAPHORE_WAIT(timerWait)
|
|
||||||
}
|
|
||||||
|
|
||||||
return tics;
|
|
||||||
}
|
|
||||||
|
|
||||||
void I_FreezeTimeSelect (bool frozen)
|
|
||||||
{
|
|
||||||
I_SelectTimer();
|
|
||||||
return I_FreezeTime (frozen);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I_FreezeTimePolled (bool frozen)
|
|
||||||
{
|
|
||||||
if (frozen)
|
|
||||||
{
|
|
||||||
assert(TicFrozen == 0);
|
|
||||||
TicFrozen = I_GetTimePolled(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
assert(TicFrozen != 0);
|
|
||||||
int froze = TicFrozen;
|
|
||||||
TicFrozen = 0;
|
|
||||||
int now = I_GetTimePolled(false);
|
|
||||||
BaseTime += (now - froze) * 1000 / TICRATE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void I_FreezeTimeSignaled (bool frozen)
|
|
||||||
{
|
|
||||||
TicFrozen = frozen;
|
|
||||||
}
|
|
||||||
|
|
||||||
int I_WaitForTicSelect (int prevtic)
|
|
||||||
{
|
|
||||||
I_SelectTimer();
|
|
||||||
return I_WaitForTic (prevtic);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// I_HandleAlarm
|
|
||||||
// Should be called every time there is an alarm.
|
|
||||||
//
|
|
||||||
void I_HandleAlarm (int sig)
|
|
||||||
{
|
|
||||||
if(!TicFrozen)
|
|
||||||
tics++;
|
|
||||||
sig_start = SDL_GetTicks();
|
|
||||||
sig_next = Scale((Scale (sig_start, TICRATE, 1000) + 1), 1000, TICRATE);
|
|
||||||
SEMAPHORE_SIGNAL(timerWait)
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// I_SelectTimer
|
|
||||||
// Sets up the timer function based on if we can use signals for efficent CPU
|
|
||||||
// usage.
|
|
||||||
//
|
|
||||||
void I_SelectTimer()
|
|
||||||
{
|
|
||||||
SEMAPHORE_INIT(timerWait, 0, 0)
|
|
||||||
#ifndef __sun
|
|
||||||
signal(SIGALRM, I_HandleAlarm);
|
|
||||||
#else
|
|
||||||
struct sigaction alrmaction;
|
|
||||||
sigaction(SIGALRM, NULL, &alrmaction);
|
|
||||||
alrmaction.sa_handler = I_HandleAlarm;
|
|
||||||
sigaction(SIGALRM, &alrmaction, NULL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct itimerval itv;
|
|
||||||
itv.it_interval.tv_sec = itv.it_value.tv_sec = 0;
|
|
||||||
itv.it_interval.tv_usec = itv.it_value.tv_usec = 1000000/TICRATE;
|
|
||||||
|
|
||||||
if (setitimer(ITIMER_REAL, &itv, NULL) != 0)
|
|
||||||
{
|
|
||||||
I_GetTime = I_GetTimePolled;
|
|
||||||
I_FreezeTime = I_FreezeTimePolled;
|
|
||||||
I_WaitForTic = I_WaitForTicPolled;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
I_GetTime = I_GetTimeSignaled;
|
|
||||||
I_FreezeTime = I_FreezeTimeSignaled;
|
|
||||||
I_WaitForTic = I_WaitForTicSignaled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the fractional amount of a tic passed since the most recent tic
|
|
||||||
fixed_t I_GetTimeFrac (uint32 *ms)
|
|
||||||
{
|
|
||||||
DWORD now = SDL_GetTicks ();
|
|
||||||
if (ms) *ms = TicNext;
|
|
||||||
DWORD step = TicNext - TicStart;
|
|
||||||
if (step == 0)
|
|
||||||
{
|
|
||||||
return FRACUNIT;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fixed_t frac = clamp<fixed_t> ((now - TicStart)*FRACUNIT/step, 0, FRACUNIT);
|
|
||||||
return frac;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void I_WaitVBL (int count)
|
void I_WaitVBL (int count)
|
||||||
{
|
{
|
||||||
// I_WaitVBL is never used to actually synchronize to the
|
// I_WaitVBL is never used to actually synchronize to the
|
||||||
|
@ -327,6 +143,9 @@ void SetLanguageIDs ()
|
||||||
LanguageIDs[3] = LanguageIDs[2] = LanguageIDs[1] = LanguageIDs[0] = lang;
|
LanguageIDs[3] = LanguageIDs[2] = LanguageIDs[1] = LanguageIDs[0] = lang;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void I_InitTimer ();
|
||||||
|
void I_ShutdownTimer ();
|
||||||
|
|
||||||
//
|
//
|
||||||
// I_Init
|
// I_Init
|
||||||
//
|
//
|
||||||
|
@ -335,11 +154,9 @@ void I_Init (void)
|
||||||
CheckCPUID (&CPU);
|
CheckCPUID (&CPU);
|
||||||
DumpCPUInfo (&CPU);
|
DumpCPUInfo (&CPU);
|
||||||
|
|
||||||
I_GetTime = I_GetTimeSelect;
|
|
||||||
I_WaitForTic = I_WaitForTicSelect;
|
|
||||||
I_FreezeTime = I_FreezeTimeSelect;
|
|
||||||
atterm (I_ShutdownSound);
|
atterm (I_ShutdownSound);
|
||||||
I_InitSound ();
|
I_InitSound ();
|
||||||
|
I_InitTimer ();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -355,6 +172,8 @@ void I_Quit (void)
|
||||||
G_CheckDemoStatus();
|
G_CheckDemoStatus();
|
||||||
|
|
||||||
C_DeinitConsole();
|
C_DeinitConsole();
|
||||||
|
|
||||||
|
I_ShutdownTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -900,60 +719,3 @@ SDL_Cursor *CreateColorCursor(FTexture *cursorpic)
|
||||||
|
|
||||||
SDL_Surface *cursorSurface = NULL;
|
SDL_Surface *cursorSurface = NULL;
|
||||||
SDL_Rect cursorBlit = {0, 0, 32, 32};
|
SDL_Rect cursorBlit = {0, 0, 32, 32};
|
||||||
bool I_SetCursor(FTexture *cursorpic)
|
|
||||||
{
|
|
||||||
if (cursorpic != NULL && cursorpic->UseType != FTexture::TEX_Null)
|
|
||||||
{
|
|
||||||
// Must be no larger than 32x32.
|
|
||||||
if (cursorpic->GetWidth() > 32 || cursorpic->GetHeight() > 32)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_XCURSOR
|
|
||||||
if (UseXCursor)
|
|
||||||
{
|
|
||||||
if (FirstCursor == NULL)
|
|
||||||
{
|
|
||||||
FirstCursor = SDL_GetCursor();
|
|
||||||
}
|
|
||||||
X11Cursor = CreateColorCursor(cursorpic);
|
|
||||||
if (X11Cursor != NULL)
|
|
||||||
{
|
|
||||||
SDL_SetCursor(X11Cursor);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (cursorSurface == NULL)
|
|
||||||
cursorSurface = SDL_CreateRGBSurface (0, 32, 32, 32, MAKEARGB(0,255,0,0), MAKEARGB(0,0,255,0), MAKEARGB(0,0,0,255), MAKEARGB(255,0,0,0));
|
|
||||||
|
|
||||||
SDL_ShowCursor(0);
|
|
||||||
SDL_LockSurface(cursorSurface);
|
|
||||||
BYTE buffer[32*32*4];
|
|
||||||
memset(buffer, 0, 32*32*4);
|
|
||||||
FBitmap bmp(buffer, 32*4, 32, 32);
|
|
||||||
cursorpic->CopyTrueColorPixels(&bmp, 0, 0);
|
|
||||||
memcpy(cursorSurface->pixels, bmp.GetPixels(), 32*32*4);
|
|
||||||
SDL_UnlockSurface(cursorSurface);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SDL_ShowCursor(1);
|
|
||||||
|
|
||||||
if (cursorSurface != NULL)
|
|
||||||
{
|
|
||||||
SDL_FreeSurface(cursorSurface);
|
|
||||||
cursorSurface = NULL;
|
|
||||||
}
|
|
||||||
#ifdef USE_XCURSOR
|
|
||||||
if (X11Cursor != NULL)
|
|
||||||
{
|
|
||||||
SDL_SetCursor(FirstCursor);
|
|
||||||
SDL_FreeCursor(X11Cursor);
|
|
||||||
X11Cursor = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
210
src/sdl/i_timer.cpp
Normal file
210
src/sdl/i_timer.cpp
Normal file
|
@ -0,0 +1,210 @@
|
||||||
|
|
||||||
|
// Moved from sdl/i_system.cpp
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
#include "basictypes.h"
|
||||||
|
#include "basicinlines.h"
|
||||||
|
#include "hardware.h"
|
||||||
|
#include "i_system.h"
|
||||||
|
#include "templates.h"
|
||||||
|
|
||||||
|
|
||||||
|
static DWORD TicStart;
|
||||||
|
static DWORD TicNext;
|
||||||
|
static DWORD BaseTime;
|
||||||
|
static int TicFrozen;
|
||||||
|
|
||||||
|
// Signal based timer.
|
||||||
|
static Semaphore timerWait;
|
||||||
|
static int tics;
|
||||||
|
static DWORD sig_start, sig_next;
|
||||||
|
|
||||||
|
void I_SelectTimer();
|
||||||
|
|
||||||
|
// [RH] Returns time in milliseconds
|
||||||
|
unsigned int I_MSTime (void)
|
||||||
|
{
|
||||||
|
unsigned int time = SDL_GetTicks ();
|
||||||
|
return time - BaseTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exactly the same thing, but based does no modification to the time.
|
||||||
|
unsigned int I_FPSTime()
|
||||||
|
{
|
||||||
|
return SDL_GetTicks();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// I_GetTime
|
||||||
|
// returns time in 1/35th second tics
|
||||||
|
//
|
||||||
|
int I_GetTimeSelect (bool saveMS)
|
||||||
|
{
|
||||||
|
I_SelectTimer();
|
||||||
|
return I_GetTime (saveMS);
|
||||||
|
}
|
||||||
|
|
||||||
|
int I_GetTimePolled (bool saveMS)
|
||||||
|
{
|
||||||
|
if (TicFrozen != 0)
|
||||||
|
{
|
||||||
|
return TicFrozen;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD tm = SDL_GetTicks();
|
||||||
|
|
||||||
|
if (saveMS)
|
||||||
|
{
|
||||||
|
TicStart = tm;
|
||||||
|
TicNext = Scale((Scale (tm, TICRATE, 1000) + 1), 1000, TICRATE);
|
||||||
|
}
|
||||||
|
return Scale(tm - BaseTime, TICRATE, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
int I_GetTimeSignaled (bool saveMS)
|
||||||
|
{
|
||||||
|
if (saveMS)
|
||||||
|
{
|
||||||
|
TicStart = sig_start;
|
||||||
|
TicNext = sig_next;
|
||||||
|
}
|
||||||
|
return tics;
|
||||||
|
}
|
||||||
|
|
||||||
|
int I_WaitForTicPolled (int prevtic)
|
||||||
|
{
|
||||||
|
int time;
|
||||||
|
|
||||||
|
assert (TicFrozen == 0);
|
||||||
|
while ((time = I_GetTimePolled(false)) <= prevtic)
|
||||||
|
;
|
||||||
|
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
int I_WaitForTicSignaled (int prevtic)
|
||||||
|
{
|
||||||
|
assert (TicFrozen == 0);
|
||||||
|
|
||||||
|
while(tics <= prevtic)
|
||||||
|
{
|
||||||
|
SEMAPHORE_WAIT(timerWait)
|
||||||
|
}
|
||||||
|
|
||||||
|
return tics;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I_FreezeTimeSelect (bool frozen)
|
||||||
|
{
|
||||||
|
I_SelectTimer();
|
||||||
|
return I_FreezeTime (frozen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I_FreezeTimePolled (bool frozen)
|
||||||
|
{
|
||||||
|
if (frozen)
|
||||||
|
{
|
||||||
|
assert(TicFrozen == 0);
|
||||||
|
TicFrozen = I_GetTimePolled(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(TicFrozen != 0);
|
||||||
|
int froze = TicFrozen;
|
||||||
|
TicFrozen = 0;
|
||||||
|
int now = I_GetTimePolled(false);
|
||||||
|
BaseTime += (now - froze) * 1000 / TICRATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void I_FreezeTimeSignaled (bool frozen)
|
||||||
|
{
|
||||||
|
TicFrozen = frozen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int I_WaitForTicSelect (int prevtic)
|
||||||
|
{
|
||||||
|
I_SelectTimer();
|
||||||
|
return I_WaitForTic (prevtic);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// I_HandleAlarm
|
||||||
|
// Should be called every time there is an alarm.
|
||||||
|
//
|
||||||
|
void I_HandleAlarm (int sig)
|
||||||
|
{
|
||||||
|
if(!TicFrozen)
|
||||||
|
tics++;
|
||||||
|
sig_start = SDL_GetTicks();
|
||||||
|
sig_next = Scale((Scale (sig_start, TICRATE, 1000) + 1), 1000, TICRATE);
|
||||||
|
SEMAPHORE_SIGNAL(timerWait)
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// I_SelectTimer
|
||||||
|
// Sets up the timer function based on if we can use signals for efficent CPU
|
||||||
|
// usage.
|
||||||
|
//
|
||||||
|
void I_SelectTimer()
|
||||||
|
{
|
||||||
|
SEMAPHORE_INIT(timerWait, 0, 0)
|
||||||
|
#ifndef __sun
|
||||||
|
signal(SIGALRM, I_HandleAlarm);
|
||||||
|
#else
|
||||||
|
struct sigaction alrmaction;
|
||||||
|
sigaction(SIGALRM, NULL, &alrmaction);
|
||||||
|
alrmaction.sa_handler = I_HandleAlarm;
|
||||||
|
sigaction(SIGALRM, &alrmaction, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct itimerval itv;
|
||||||
|
itv.it_interval.tv_sec = itv.it_value.tv_sec = 0;
|
||||||
|
itv.it_interval.tv_usec = itv.it_value.tv_usec = 1000000/TICRATE;
|
||||||
|
|
||||||
|
if (setitimer(ITIMER_REAL, &itv, NULL) != 0)
|
||||||
|
{
|
||||||
|
I_GetTime = I_GetTimePolled;
|
||||||
|
I_FreezeTime = I_FreezeTimePolled;
|
||||||
|
I_WaitForTic = I_WaitForTicPolled;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
I_GetTime = I_GetTimeSignaled;
|
||||||
|
I_FreezeTime = I_FreezeTimeSignaled;
|
||||||
|
I_WaitForTic = I_WaitForTicSignaled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the fractional amount of a tic passed since the most recent tic
|
||||||
|
fixed_t I_GetTimeFrac (uint32 *ms)
|
||||||
|
{
|
||||||
|
DWORD now = SDL_GetTicks ();
|
||||||
|
if (ms) *ms = TicNext;
|
||||||
|
DWORD step = TicNext - TicStart;
|
||||||
|
if (step == 0)
|
||||||
|
{
|
||||||
|
return FRACUNIT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fixed_t frac = clamp<fixed_t> ((now - TicStart)*FRACUNIT/step, 0, FRACUNIT);
|
||||||
|
return frac;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void I_InitTimer ()
|
||||||
|
{
|
||||||
|
I_GetTime = I_GetTimeSelect;
|
||||||
|
I_WaitForTic = I_WaitForTicSelect;
|
||||||
|
I_FreezeTime = I_FreezeTimeSelect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I_ShutdownTimer ()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue