From fbafd5c9e2e4d84dff1e78bf42bef883126f7fe7 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 7 Aug 2020 14:48:54 +0200 Subject: [PATCH] Improve the inspector easing editor - Make it possible to drag a negative easing or an easing of 0 back to a positive value. - Clamp the value between -1000000 and 1000000 to avoid issues related to infinity. - Display more decimals for numbers closer to 0, less for large numbers. - Display trailing zeroes in decimals to avoid flickering when dragging. This closes #18712 and closes #22079. (cherry picked from commit 028de11db82c4cf9021273fb1b4aa26d40805184) --- editor/editor_properties.cpp | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 89ffb25bf7e..9d0a9165b9f 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -987,19 +987,27 @@ void EditorPropertyEasing::_drag_easing(const Ref &p_ev) { rel = -rel; float val = get_edited_object()->get(get_edited_property()); - if (val == 0) - return; bool sg = val < 0; val = Math::absf(val); val = Math::log(val) / Math::log((float)2.0); - //logspace + // Logarithmic space. val += rel * 0.05; val = Math::pow(2.0f, val); if (sg) val = -val; + // 0 is a singularity, but both positive and negative values + // are otherwise allowed. Enforce 0+ as workaround. + if (Math::is_zero_approx(val)) { + val = 0.00001; + } + + // Limit to a reasonable value to prevent the curve going into infinity, + // which can cause crashes and other issues. + val = CLAMP(val, -1000000, 1000000); + emit_changed(get_edited_property(), val); easing_draw->update(); } @@ -1044,7 +1052,18 @@ void EditorPropertyEasing::_draw_easing() { } easing_draw->draw_multiline(lines, line_color, 1.0, true); - f->draw(ci, Point2(10, 10 + f->get_ascent()), String::num(exp, 2), font_color); + // Draw more decimals for small numbers since higher precision is usually required for fine adjustments. + int decimals; + if (Math::abs(exp) < 0.1 - CMP_EPSILON) { + decimals = 4; + } else if (Math::abs(exp) < 1 - CMP_EPSILON) { + decimals = 3; + } else if (Math::abs(exp) < 10 - CMP_EPSILON) { + decimals = 2; + } else { + decimals = 1; + } + f->draw(ci, Point2(10, 10 + f->get_ascent()), rtos(exp).pad_decimals(decimals), font_color); } void EditorPropertyEasing::update_property() { @@ -1075,6 +1094,11 @@ void EditorPropertyEasing::_spin_value_changed(double p_value) { if (Math::is_zero_approx(p_value)) { p_value = 0.00001; } + + // Limit to a reasonable value to prevent the curve going into infinity, + // which can cause crashes and other issues. + p_value = CLAMP(p_value, -1000000, 1000000); + emit_changed(get_edited_property(), p_value); _spin_focus_exited(); }