Browse Source

Fix `wrapf` to correct wrap values with 0.1 stepping

Yuri Rubinsky 3 years ago
parent
commit
09418afbc0
1 changed files with 10 additions and 2 deletions
  1. 10 2
      core/math/math_funcs.h

+ 10 - 2
core/math/math_funcs.h

@@ -302,11 +302,19 @@ public:
 	}
 	}
 	static _ALWAYS_INLINE_ double wrapf(double value, double min, double max) {
 	static _ALWAYS_INLINE_ double wrapf(double value, double min, double max) {
 		double range = max - min;
 		double range = max - min;
-		return is_zero_approx(range) ? min : value - (range * Math::floor((value - min) / range));
+		double result = is_zero_approx(range) ? min : value - (range * Math::floor((value - min) / range));
+		if (is_equal_approx(result, max)) {
+			return min;
+		}
+		return result;
 	}
 	}
 	static _ALWAYS_INLINE_ float wrapf(float value, float min, float max) {
 	static _ALWAYS_INLINE_ float wrapf(float value, float min, float max) {
 		float range = max - min;
 		float range = max - min;
-		return is_zero_approx(range) ? min : value - (range * Math::floor((value - min) / range));
+		float result = is_zero_approx(range) ? min : value - (range * Math::floor((value - min) / range));
+		if (is_equal_approx(result, max)) {
+			return min;
+		}
+		return result;
 	}
 	}
 
 
 	static _ALWAYS_INLINE_ float fract(float value) {
 	static _ALWAYS_INLINE_ float fract(float value) {