Fix remap based on issue JC caught. Diffs= 4ecbf9321 Fix remap based on issue JC caught. (#4771)
diff --git a/.rive_head b/.rive_head index bca1be1..f5a6241 100644 --- a/.rive_head +++ b/.rive_head
@@ -1 +1 @@ -89e38b700dce1e2328712c5258d2cd54b990b30b +4ecbf93211d349dd5cc0e7f6f71acc63cdfdaef6
diff --git a/src/animation/linear_animation.cpp b/src/animation/linear_animation.cpp index 9ddfd0a..3bbdc4a 100644 --- a/src/animation/linear_animation.cpp +++ b/src/animation/linear_animation.cpp
@@ -79,6 +79,18 @@ } float LinearAnimation::durationSeconds() const { return endSeconds() - startSeconds(); } +// Matches Dart modulus: https://api.dart.dev/stable/2.19.0/dart-core/double/operator_modulo.html +static float positiveMod(float value, float range) +{ + assert(range > 0.0f); + float v = fmodf(value, range); + if (v < 0.0f) + { + v += range; + } + return v; +} + float LinearAnimation::globalToLocalSeconds(float seconds) const { switch (loop()) @@ -86,9 +98,9 @@ case Loop::oneShot: return seconds + startSeconds(); case Loop::loop: - return std::fmod(seconds, (endSeconds() - startSeconds())) + startSeconds(); + return positiveMod(seconds, (endSeconds() - startSeconds())) + startSeconds(); case Loop::pingPong: - float localTime = std::fmod(seconds, (endSeconds() - startSeconds())); + float localTime = positiveMod(seconds, (endSeconds() - startSeconds())); int direction = ((int)(seconds / (endSeconds() - startSeconds()))) % 2; return direction == 0 ? localTime + startSeconds() : endSeconds() - localTime; }