From aca86fa588079f2f3ebfaea7e43d56842e9be2f9 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 24 Jul 2024 13:49:42 +0200 Subject: [PATCH] [cpp] Fix float exception, closes #2583 --- spine-cpp/spine-cpp/include/spine/MathUtil.h | 2 ++ spine-cpp/spine-cpp/src/spine/AnimationState.cpp | 2 +- spine-cpp/spine-cpp/src/spine/MathUtil.cpp | 11 +++++------ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/spine-cpp/spine-cpp/include/spine/MathUtil.h b/spine-cpp/spine-cpp/include/spine/MathUtil.h index 6ce5361f9..7a2f37976 100644 --- a/spine-cpp/spine-cpp/include/spine/MathUtil.h +++ b/spine-cpp/spine-cpp/include/spine/MathUtil.h @@ -88,6 +88,8 @@ namespace spine { static bool isNan(float v); + static float quietNan(); + static float random(); static float randomTriangular(float min, float max); diff --git a/spine-cpp/spine-cpp/src/spine/AnimationState.cpp b/spine-cpp/spine-cpp/src/spine/AnimationState.cpp index ad60bccda..dd3b57c08 100644 --- a/spine-cpp/spine-cpp/src/spine/AnimationState.cpp +++ b/spine-cpp/spine-cpp/src/spine/AnimationState.cpp @@ -921,7 +921,7 @@ void AnimationState::setAttachment(Skeleton &skeleton, Slot &slot, const String void AnimationState::queueEvents(TrackEntry *entry, float animationTime) { float animationStart = entry->_animationStart, animationEnd = entry->_animationEnd; float duration = animationEnd - animationStart; - float trackLastWrapped = MathUtil::fmod(entry->_trackLast, duration); + float trackLastWrapped = duration != 0 ? MathUtil::fmod(entry->_trackLast, duration) : MathUtil::quietNan(); // Queue events before complete. size_t i = 0, n = _events.size(); diff --git a/spine-cpp/spine-cpp/src/spine/MathUtil.cpp b/spine-cpp/spine-cpp/src/spine/MathUtil.cpp index 1438f793b..159b4e7c0 100644 --- a/spine-cpp/spine-cpp/src/spine/MathUtil.cpp +++ b/spine-cpp/spine-cpp/src/spine/MathUtil.cpp @@ -30,6 +30,7 @@ #include #include #include +#include // Required for division by 0 in _isNaN on MSVC #ifdef _MSC_VER @@ -99,14 +100,12 @@ float MathUtil::cosDeg(float degrees) { return (float) ::cos(degrees * MathUtil::Deg_Rad); } -/* Need to pass 0 as an argument, so VC++ doesn't error with C2124 */ -static bool _isNan(float value, float zero) { - float _nan = (float) 0.0 / zero; - return 0 == memcmp((void *) &value, (void *) &_nan, sizeof(value)); +bool MathUtil::isNan(float v) { + return std::isnan(v); } -bool MathUtil::isNan(float v) { - return _isNan(v, 0); +float MathUtil::quietNan() { + return std::nan(""); } float MathUtil::random() {