|  | #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; | 
|  | } | 
|  | } |