Procházet zdrojové kódy

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)
Hugo Locurcio před 5 roky
rodič
revize
fbafd5c9e2
1 změnil soubory, kde provedl 28 přidání a 4 odebrání
  1. 28 4
      editor/editor_properties.cpp

+ 28 - 4
editor/editor_properties.cpp

@@ -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();
 }