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() { void Timeline::start() {
running = true; running = true;
previousFrameTime = high_resolution_clock::now(); _startTime = high_resolution_clock::now();
_previousFrameTime = _startTime;
_previousFrameDuration = 0; _previousFrameDuration = 0;
} }
void Timeline::stop() { void Timeline::stop() {
running = false; running = false;
previousFrameTime = high_resolution_clock::time_point(); _startTime = high_resolution_clock::time_point();
_previousFrameTime = _startTime;
_previousFrameDuration = 0; _previousFrameDuration = 0;
} }
@ -37,16 +39,20 @@ void Timeline::nextFrame() {
if(!running) return; if(!running) return;
auto now = high_resolution_clock::now(); 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; _previousFrameDuration = duration/1e6f;
if(_previousFrameDuration < _minimalFrameTime) { if(_previousFrameDuration < _minimalFrameTime) {
Corrade::Utility::sleep(_minimalFrameTime*1000 - duration/1000); Corrade::Utility::sleep(_minimalFrameTime*1000 - duration/1000);
now = high_resolution_clock::now(); 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 * @brief Start timeline
* *
* Sets previous frame duration to `0`. * Sets previous frame time and duration to `0`.
* @see stop(), previousFrameDuration() * @see stop(), previousFrameDuration()
*/ */
void start(); void start();
@ -120,13 +120,26 @@ class MAGNUM_EXPORT Timeline {
*/ */
void nextFrame(); 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 { inline constexpr GLfloat previousFrameDuration() const {
return _previousFrameDuration; return _previousFrameDuration;
} }
private: 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 _minimalFrameTime;
GLfloat _previousFrameDuration; GLfloat _previousFrameDuration;

Loading…
Cancel
Save