// DragonX Wallet - ImGui Edition // Copyright 2024-2026 The Hush Developers // Released under the GPLv3 #pragma once #include namespace dragonx { namespace ui { namespace effects { constexpr double kEffectTwoPi = 6.283185307179586476925286766559; /// Fractional part in [0,1) of t*rate + offset, evaluated in double so the result stays /// smooth after days of uptime (a float clock steps at one-frame granularity from ~3 days). inline double cyclePhaseD(double t, double rate, double offset = 0.0) { double p = std::fmod(t * rate + offset, 1.0); if (p < 0.0) p += 1.0; if (p >= 1.0) p = 0.0; // p was -tiny: p + 1.0 rounded up to 1.0 return p; } inline float cyclePhase(double t, double rate, double offset = 0.0) { return static_cast(cyclePhaseD(t, rate, offset)); } /// sin(2*pi*(t*cycles + offset)) - oscillator whose speed is in cycles per second. inline float cycleSin(double t, double cycles, double offset = 0.0) { return static_cast(std::sin(kEffectTwoPi * cyclePhaseD(t, cycles, offset))); } /// sin/cos(t*omega + offset), omega in rad/s; argument reduced in double. inline float radSin(double t, double omega, double offset = 0.0) { return static_cast(std::sin(std::fmod(t * omega + offset, kEffectTwoPi))); } inline float radCos(double t, double omega, double offset = 0.0) { return static_cast(std::cos(std::fmod(t * omega + offset, kEffectTwoPi))); } }}} // namespace