| #ifndef WIN32 |
| #include <sys/time.h> |
| #else |
| #endif /** !WIN32 */ |
| #include <stdlib.h> |
| |
| #include "TimeKeeper.hpp" |
| #include "RandomNumberGenerators.hpp" |
| |
| |
| TimeKeeper::TimeKeeper (double presetDuration, double smoothDuration, double easterEgg) |
| { |
| _smoothDuration = smoothDuration; |
| _presetDuration = presetDuration; |
| _easterEgg = easterEgg; |
| |
| #ifndef WIN32 |
| gettimeofday ( &this->startTime, NULL ); |
| #else |
| startTime = GetTickCount(); |
| #endif /** !WIN32 */ |
| |
| UpdateTimers(); |
| } |
| |
| void |
| TimeKeeper::UpdateTimers() |
| { |
| #ifndef WIN32 |
| _currentTime = getTicks (&startTime) * 0.001; |
| #else |
| _currentTime = getTicks (startTime) * 0.001; |
| #endif /** !WIN32 */ |
| |
| _presetFrameA++; |
| _presetFrameB++; |
| } |
| |
| void |
| TimeKeeper::StartPreset() |
| { |
| _isSmoothing = false; |
| _presetTimeA = _currentTime; |
| _presetFrameA = 1; |
| _presetDurationA = sampledPresetDuration(); |
| } |
| |
| void |
| TimeKeeper::StartSmoothing() |
| { |
| _isSmoothing = true; |
| _presetTimeB = _currentTime; |
| _presetFrameB = 1; |
| _presetDurationB = sampledPresetDuration(); |
| } |
| |
| void |
| TimeKeeper::EndSmoothing() |
| { |
| _isSmoothing = false; |
| _presetTimeA = _presetTimeB; |
| _presetFrameA = _presetFrameB; |
| _presetDurationA = _presetDurationB; |
| } |
| |
| bool |
| TimeKeeper::CanHardCut() |
| { |
| return ((_currentTime - _presetTimeA) > HARD_CUT_DELAY); |
| } |
| |
| double |
| TimeKeeper::SmoothRatio() |
| { |
| return (_currentTime - _presetTimeB) / _smoothDuration; |
| } |
| |
| bool |
| TimeKeeper::IsSmoothing() |
| { |
| return _isSmoothing; |
| } |
| |
| double |
| TimeKeeper::GetRunningTime() |
| { |
| return _currentTime; |
| } |
| |
| double |
| TimeKeeper::PresetProgressA() |
| { |
| if (_isSmoothing) return 1.0; |
| else return (_currentTime - _presetTimeA) / _presetDurationA; |
| } |
| |
| double |
| TimeKeeper::PresetProgressB() |
| { |
| return (_currentTime - _presetTimeB) / _presetDurationB; |
| } |
| |
| int |
| TimeKeeper::PresetFrameB() |
| { |
| return _presetFrameB; |
| } |
| |
| int |
| TimeKeeper::PresetFrameA() |
| { |
| return _presetFrameA; |
| } |
| |
| double |
| TimeKeeper::sampledPresetDuration() |
| { |
| #ifdef WIN32 |
| return _presetDuration; |
| #else |
| return fmax (1, fmin (60, RandomNumberGenerators::gaussian (_presetDuration, |
| _easterEgg))); |
| #endif |
| } |