Fix nested remap animation not respecting work area.
diff --git a/include/rive/animation/linear_animation.hpp b/include/rive/animation/linear_animation.hpp index 9871bc6..1d91d3e 100644 --- a/include/rive/animation/linear_animation.hpp +++ b/include/rive/animation/linear_animation.hpp
@@ -28,6 +28,10 @@ float endSeconds() const; float durationSeconds() const; + /// Convert a global clock to local seconds (takes into consideration + /// work area start/end, speed, looping). + float globalToLocalSeconds(float seconds) const; + #ifdef TESTING size_t numKeyedObjects() { return m_KeyedObjects.size(); } // Used in testing to check how many animations gets deleted.
diff --git a/src/animation/linear_animation.cpp b/src/animation/linear_animation.cpp index c7a8e46..4a8d743 100644 --- a/src/animation/linear_animation.cpp +++ b/src/animation/linear_animation.cpp
@@ -67,4 +67,21 @@ } float LinearAnimation::durationSeconds() const { return endSeconds() - startSeconds(); +} + +float LinearAnimation::globalToLocalSeconds(float seconds) const { + switch (loop()) { + case Loop::oneShot: + return seconds + startSeconds(); + case Loop::loop: + return std::fmod(seconds, (endSeconds() - startSeconds())) + + startSeconds(); + case Loop::pingPong: + float localTime = + std::fmod(seconds, (endSeconds() - startSeconds())); + int direction = + ((int)(seconds / (endSeconds() - startSeconds()))) % 2; + return direction == 0 ? localTime + startSeconds() + : endSeconds() - localTime; + } } \ No newline at end of file
diff --git a/src/animation/nested_remap_animation.cpp b/src/animation/nested_remap_animation.cpp index ba76daa..47b81be 100644 --- a/src/animation/nested_remap_animation.cpp +++ b/src/animation/nested_remap_animation.cpp
@@ -5,8 +5,9 @@ void NestedRemapAnimation::timeChanged() { if (m_AnimationInstance != nullptr) { - m_AnimationInstance->time(m_AnimationInstance->durationSeconds() * - time()); + m_AnimationInstance->time( + m_AnimationInstance->animation()->globalToLocalSeconds( + m_AnimationInstance->durationSeconds() * time())); } }