X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fapp%2FIntervalTimer.hpp;h=2f465ad92880787aa42c4f7f07e4494e30433819;hb=fd86376a8e7d3f1b09be3d018f772ef884937238;hp=5240f5d3f60a419e8593b5e883dab9fd5c8e8d1c;hpb=896c4c0ba2efd6774894fd8308cc097b7f4123e3;p=blank.git diff --git a/src/app/IntervalTimer.hpp b/src/app/IntervalTimer.hpp index 5240f5d..2f465ad 100644 --- a/src/app/IntervalTimer.hpp +++ b/src/app/IntervalTimer.hpp @@ -1,48 +1,57 @@ #ifndef BLANK_APP_INTERVALTIMER_HPP #define BLANK_APP_INTERVALTIMER_HPP +#include + namespace blank { -/// Timer that hits every n milliseconds. Resolution is that of the -/// delta values passed to Update(), minimum 1ms. -/// Also tracks the number of iterations as well as milliseconds +/// Timer that hits every n Time units. Resolution is that of the +/// delta values passed to Update(). +/// Also tracks the number of iterations as well as Time units /// passed. +template class IntervalTimer { public: - /// Create a timer that hits every interval_ms milliseconds. + /// Create a timer that hits every interval Time units. /// Initial state is stopped. - explicit IntervalTimer(int interval_ms = 0) noexcept + explicit IntervalTimer(Time interval_ms = Time(0)) noexcept : intv(interval_ms) { } void Start() noexcept { - speed = 1; + speed = Time(1); } void Stop() noexcept { - value = 0; - speed = 0; + value = Time(0); + speed = Time(0); } void Reset() noexcept { - value = 0; + value = Time(0); } bool Running() const noexcept { - return speed != 0; + return speed != Time(0); } /// true if an interval boundary was passed by the last call to Update() bool Hit() const noexcept { - return Running() && value % intv < last_dt; + return Running() && IntervalElapsed() < last_dt; } bool HitOnce() const noexcept { return Running() && value >= intv; } - int Elapsed() const noexcept { + Time Elapsed() const noexcept { return value; } - int Interval() const noexcept { + Time Interval() const noexcept { return intv; } + Time IntervalElapsed() const noexcept { + return mod(value, intv); + } + Time IntervalRemain() const noexcept { + return intv - IntervalElapsed(); + } int Iteration() const noexcept { return value / intv; } @@ -50,19 +59,36 @@ public: value -= intv; } - void Update(int dt) noexcept { + void Update(Time dt) noexcept { value += dt * speed; last_dt = dt; } + static Time mod(Time val, Time m) noexcept { + return val % m; + } + private: - int intv; - int value = 0; - int speed = 0; - int last_dt = 0; + Time intv; + Time value = Time(0); + Time speed = Time(0); + Time last_dt = Time(0); }; +using CoarseTimer = IntervalTimer; +using FineTimer = IntervalTimer; + +template<> +inline float IntervalTimer::mod(float val, float m) noexcept { + return std::fmod(val, m); +} + +template<> +inline int IntervalTimer::Iteration() const noexcept { + return std::floor(value / intv); +} + } #endif