| #include "rive/animation/elastic_ease.hpp" |
| #include "rive/math/math_types.hpp" |
| #include "math.h" |
| |
| using namespace rive; |
| |
| ElasticEase::ElasticEase(float amplitude, float period) : |
| m_amplitude(amplitude), |
| m_period(period), |
| m_s(amplitude < 1.0f ? period / 4.0f : period / (2.0f * math::PI) * asinf(1.0f / amplitude)) |
| {} |
| |
| float ElasticEase::computeActualAmplitude(float time) const |
| { |
| if (m_amplitude < 1.0f) |
| { |
| /// We use this when the amplitude is less than 1.0 (amplitude is |
| /// described as factor of change in value). We also precompute s which is |
| /// the effective starting period we use to align the decaying sin with |
| /// our keyframe. |
| float t = abs(m_s); |
| float absTime = abs(time); |
| if (absTime < t) |
| { |
| float l = absTime / t; |
| return (m_amplitude * l) + (1.0f - l); |
| } |
| } |
| |
| return m_amplitude; |
| } |
| |
| float ElasticEase::easeOut(float factor) const |
| { |
| float time = factor; |
| float actualAmplitude = computeActualAmplitude(time); |
| |
| return (actualAmplitude * pow(2.0f, 10.0f * -time) * |
| sinf((time - m_s) * (2.0f * math::PI) / m_period)) + |
| 1.0f; |
| } |
| |
| float ElasticEase::easeIn(float factor) const |
| { |
| float time = factor - 1.0f; |
| |
| float actualAmplitude = computeActualAmplitude(time); |
| |
| return -(actualAmplitude * pow(2.0f, 10.0f * time) * |
| sinf((-time - m_s) * (2.0f * math::PI) / m_period)); |
| } |
| |
| float ElasticEase::easeInOut(float factor) const |
| { |
| float time = factor * 2.0f - 1.0f; |
| float actualAmplitude = computeActualAmplitude(time); |
| if (time < 0.0f) |
| { |
| return -0.5f * actualAmplitude * pow(2.0f, 10.0f * time) * |
| sinf((-time - m_s) * (2.0f * math::PI) / m_period); |
| } |
| else |
| { |
| return 0.5f * (actualAmplitude * pow(2.0f, 10.0f * -time) * |
| sinf((time - m_s) * (2.0f * math::PI) / m_period)) + |
| 1.0f; |
| } |
| } |