Browse Source

Ability to retrieve absolute time in previous frame to Timeline.

The time is relative to moment when Timeline::start() was called.
pull/7/head
Vladimír Vondruš 14 years ago
parent
commit
113ff70aec
  1. 16
      src/Timeline.cpp
  2. 19
      src/Timeline.h

16
src/Timeline.cpp

@ -23,13 +23,15 @@ namespace Magnum {
void Timeline::start() {
running = true;
previousFrameTime = high_resolution_clock::now();
_startTime = high_resolution_clock::now();
_previousFrameTime = _startTime;
_previousFrameDuration = 0;
}
void Timeline::stop() {
running = false;
previousFrameTime = high_resolution_clock::time_point();
_startTime = high_resolution_clock::time_point();
_previousFrameTime = _startTime;
_previousFrameDuration = 0;
}
@ -37,16 +39,20 @@ void Timeline::nextFrame() {
if(!running) return;
auto now = high_resolution_clock::now();
std::uint32_t duration = duration_cast<microseconds>(now-previousFrameTime).count();
std::uint32_t duration = duration_cast<microseconds>(now-_previousFrameTime).count();
_previousFrameDuration = duration/1e6f;
if(_previousFrameDuration < _minimalFrameTime) {
Corrade::Utility::sleep(_minimalFrameTime*1000 - duration/1000);
now = high_resolution_clock::now();
_previousFrameDuration = duration_cast<microseconds>(now-previousFrameTime).count()/1e6f;
_previousFrameDuration = duration_cast<microseconds>(now-_previousFrameTime).count()/1e6f;
}
previousFrameTime = now;
_previousFrameTime = now;
}
GLfloat Timeline::previousFrameTime() const {
return duration_cast<microseconds>(_previousFrameTime-_startTime).count()/1e6f;
}
}

19
src/Timeline.h

@ -98,7 +98,7 @@ class MAGNUM_EXPORT Timeline {
/**
* @brief Start timeline
*
* Sets previous frame duration to `0`.
* Sets previous frame time and duration to `0`.
* @see stop(), previousFrameDuration()
*/
void start();
@ -120,13 +120,26 @@ class MAGNUM_EXPORT Timeline {
*/
void nextFrame();
/** @brief Duration of previous frame (in seconds) */
/**
* @brief Time at previous frame (in seconds)
*
* Returns time elapsed since start() was called. If the timeline is
* stopped, the function returns `0.0f`.
*/
GLfloat previousFrameTime() const;
/**
* @brief Duration of previous frame (in seconds)
*
* If the timeline is stopped, the function returns `0.0f`.
*/
inline constexpr GLfloat previousFrameDuration() const {
return _previousFrameDuration;
}
private:
std::chrono::high_resolution_clock::time_point previousFrameTime;
std::chrono::high_resolution_clock::time_point _startTime;
std::chrono::high_resolution_clock::time_point _previousFrameTime;
GLfloat _minimalFrameTime;
GLfloat _previousFrameDuration;

Loading…
Cancel
Save