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()));
}
}