diff --git a/include/framerate.h b/include/framerate.h index e8b352e83..07aa7a6bc 100644 --- a/include/framerate.h +++ b/include/framerate.h @@ -76,9 +76,23 @@ u64 frameRateDivisor(); class Timer { public: + enum class Type + { + U8 = 0xFF, + S8 = 0X7F, + U16 = 0xFFFF, + S16 = 0x8000 + }; + Timer(); Timer(const Timer& t); Timer(float n); + Timer(float n, s64 min, s64 max); + Timer(s64 min, s64 max) : m_counter(0), m_counterInt(0), m_min(min), m_max(max) + { + } + + float frac() const; static Timer invalid(); @@ -121,19 +135,55 @@ class Timer return (u16)m_counter; } + void setRange(s64 min, s64 max); + constexpr static float INVALID = -FRAMERATE_MAX / 20.0f; protected: void update(); float m_counter; s64 m_counterInt; + s64 m_min; + s64 m_max; }; -typedef Timer Counter; +class TimerU8 : public Timer +{ + public: + TimerU8() : Timer(-0x80, 0x7F) + { + } + + TimerU8(const Timer& t) : Timer(t) + { + } + + TimerU8(float n) : Timer(n, -0x80, 0x7F) + { + } +}; + +class TimerU16 : public Timer +{ + public: + TimerU16() : Timer(-0x8000, 0x7FFF) + { + } + + TimerU16(const Timer& t) : Timer(t) + { + } + + TimerU16(float n) : Timer(n, -0x8000, 0x7FFF) + { + } +}; + +typedef TimerU16 Counter; typedef Timer Rotation; typedef Timer Position; -typedef Timer TimerU8; -typedef Timer TimerU16; +//typedef Timer TimerU8; +//typedef Timer TimerU16; typedef Timer TimerS16; typedef Timer TimerS32; typedef Timer TimerU32; diff --git a/src/code/framerate.cpp b/src/code/framerate.cpp index 50814c2fd..268bab6f1 100644 --- a/src/code/framerate.cpp +++ b/src/code/framerate.cpp @@ -79,7 +79,7 @@ u64 frameRateDivisor() return R_UPDATE_RATE; } -Timer::Timer() : m_counter(0), m_counterInt(0) +Timer::Timer() : m_counter(0), m_counterInt(0), m_min(-0x8000), m_max(0x7FFF) { } @@ -87,27 +87,38 @@ Timer::Timer(const Timer& t) { m_counter = t.m_counter; m_counterInt = t.m_counterInt; + m_min = t.m_min; + m_max = t.m_max; } -Timer::Timer(float n) : m_counter(n), m_counterInt(n * COUNTER_SCALER) + +Timer::Timer(float n) : m_counter(n), m_counterInt(n * COUNTER_SCALER), m_min(-0x8000), m_max(0x7FFF) { if(n == 0xFFFF) { bool error = true; } - /*if(m_counterInt == 0) +} + +Timer::Timer(float n, s64 min, s64 max) : m_counter(n), m_counterInt(n * COUNTER_SCALER), m_min(min), m_max(max) +{ + if(n == 0xFFFF) { - if(n < 1.0f && n > 0.0f) - { - m_counterInt = 1; - update(); - } - else if(n > -1.0f && n < 0.0f) - { - m_counterInt = -1; - update(); - } - }*/ + bool error = true; + } +} + +void Timer::setRange(s64 min, s64 max) +{ + m_min = min; + m_max = max; +} + +float Timer::frac() const +{ + float integer; + return modf(m_counter, &integer); + //return (m_counterInt % (s64)FRAMERATE_SCALER_INV) / (float)FRAMERATE_SCALER_INV; } Timer Timer::invalid() @@ -119,6 +130,16 @@ Timer Timer::invalid() void Timer::update() { + while(m_counterInt > m_max * COUNTER_SCALER) + { + m_counterInt = (m_min * COUNTER_SCALER) + (m_counterInt - (m_max * COUNTER_SCALER + 1)); + } + + while(m_counterInt < m_min * COUNTER_SCALER) + { + m_counterInt = (m_max * COUNTER_SCALER) + (m_counterInt - (m_min * COUNTER_SCALER - 1)); + } + m_counter = (float)m_counterInt * COUNTER_STEP; }