home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / XenonSource.exe / gamesystem / source / gs_timer.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-11  |  3.2 KB  |  159 lines

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    gsCTimer
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    12/03/00
  8. //
  9. // Base:    gsCObject
  10. //
  11. // Derived:    None
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "gamesystem.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. __int64 gsCTimer::m_freq;
  20. __int64 gsCTimer::m_time0;
  21.  
  22. float gsCTimer::m_previous_time = 0.f;
  23. float gsCTimer::m_system_time = 0.f;
  24.  
  25. float gsCTimer::m_fake_time = 0.f;
  26.  
  27. //-------------------------------------------------------------
  28. // Constructor
  29.  
  30. gsCTimer::gsCTimer()
  31. {
  32.     m_base_time = 0.f;
  33.     m_state = gsTIMER_RESET;
  34. }
  35.  
  36. //-------------------------------------------------------------
  37. // Destructor
  38.  
  39. gsCTimer::~gsCTimer()
  40. {
  41. }
  42.  
  43. //-------------------------------------------------------------
  44.  
  45. void gsCTimer::initialize()
  46. {
  47.     QueryPerformanceFrequency((LARGE_INTEGER*) &m_freq);
  48.     QueryPerformanceCounter((LARGE_INTEGER*) &m_time0);
  49.  
  50.     float t = getCurrentTime();
  51.  
  52.     m_system_time = t;
  53.     m_previous_time = t;
  54. }
  55.  
  56. //-------------------------------------------------------------
  57. // Update internal copy of system time
  58. //
  59. // Call once per game loop
  60.  
  61. void gsCTimer::update(bool frame_done)
  62. {
  63.     if (!frame_done)
  64.         m_previous_time = m_system_time;
  65.  
  66.     m_system_time = getCurrentTime();
  67. }
  68.  
  69. //-------------------------------------------------------------
  70. // Reset timer
  71.  
  72. void gsCTimer::reset()
  73. {
  74.     m_state = gsTIMER_RESET;
  75. }
  76.  
  77. //-------------------------------------------------------------
  78. // Start timer
  79.  
  80. void gsCTimer::start()
  81. {
  82.     m_base_time = m_system_time;
  83.     m_state = gsTIMER_ACTIVE;
  84. }
  85.  
  86. //-------------------------------------------------------------
  87. // Pause timer
  88.  
  89. void gsCTimer::pause()
  90. {
  91.     m_base_time = m_system_time;
  92.     m_state = gsTIMER_PAUSED;
  93. }
  94.  
  95. //-------------------------------------------------------------
  96. // Unpause timer
  97. //
  98. // Notes:    Reported time continues from the time value when
  99. //            the timer was paused
  100.  
  101. void gsCTimer::unpause()
  102. {
  103.     m_base_time = m_system_time - m_base_time;
  104.     m_state = gsTIMER_ACTIVE;
  105. }
  106.  
  107. //-------------------------------------------------------------
  108. // Get the current state of the timer
  109. //
  110. // Returns:    One of the following states:
  111. //                gsTIMER_RESET
  112. //                gsTIMER_ACTIVE
  113. //                gsTIMER_PAUSED
  114.  
  115. gsTimerState gsCTimer::getState()
  116. {
  117.     return m_state;
  118. }
  119.  
  120. //-------------------------------------------------------------
  121. // Get current time 
  122. //
  123. // Returns:    Current time in seconds since timer was started
  124.  
  125. float gsCTimer::getTime()
  126. {
  127.     switch (m_state) {
  128.         case gsTIMER_ACTIVE:
  129.             return m_system_time - m_base_time;
  130.         case gsTIMER_PAUSED:
  131.             return m_base_time;
  132.         default:
  133.             return 0.f;
  134.         }
  135. }
  136.  
  137. //-------------------------------------------------------------
  138. // Get delta time (between current and previous frame)
  139.  
  140. float gsCTimer::getDeltaTime()
  141. {
  142.     return m_system_time - m_previous_time;
  143. }
  144.  
  145. //-------------------------------------------------------------
  146. // Get current time
  147.  
  148. float gsCTimer::getCurrentTime()
  149. {
  150.     __int64 t;
  151.  
  152.     QueryPerformanceCounter((LARGE_INTEGER*) &t);
  153.     t -= m_time0;
  154.  
  155.     return float(double(t) / double(m_freq));
  156. }
  157.  
  158. //-------------------------------------------------------------
  159.