|
@@ -987,19 +987,27 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &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();
|
|
|
}
|