diff --git a/include/godot_cpp/core/math.hpp b/include/godot_cpp/core/math.hpp index 78eee8aa..ca1e6e9d 100644 --- a/include/godot_cpp/core/math.hpp +++ b/include/godot_cpp/core/math.hpp @@ -583,19 +583,6 @@ inline float wrapf(real_t value, real_t min, real_t max) { return is_zero_approx(range) ? min : value - (range * floor((value - min) / range)); } -inline float stepify(float p_value, float p_step) { - if (p_step != 0) { - p_value = floor(p_value / p_step + 0.5f) * p_step; - } - return p_value; -} -inline double stepify(double p_value, double p_step) { - if (p_step != 0) { - p_value = floor(p_value / p_step + 0.5) * p_step; - } - return p_value; -} - inline unsigned int next_power_of_2(unsigned int x) { if (x == 0) return 0; @@ -641,6 +628,24 @@ inline double snapped(double p_value, double p_step) { return p_value; } +inline float snap_scalar(float p_offset, float p_step, float p_target) { + return p_step != 0 ? Math::snapped(p_target - p_offset, p_step) + p_offset : p_target; +} + +inline float snap_scalar_separation(float p_offset, float p_step, float p_target, float p_separation) { + if (p_step != 0) { + float a = Math::snapped(p_target - p_offset, p_step + p_separation) + p_offset; + float b = a; + if (p_target >= 0) { + b -= p_separation; + } else { + b += p_step; + } + return (Math::abs(p_target - a) < Math::abs(p_target - b)) ? a : b; + } + return p_target; +} + } // namespace Math } // namespace godot