Browse Source

Merge pull request #29959 from akien-mga/dont-reset-my-curves

Curve: Prevent forcing 1.0 min value to 0.99
Rémi Verschelde 6 years ago
parent
commit
10cf5ac0ff
2 changed files with 10 additions and 4 deletions
  1. 9 4
      scene/resources/curve.cpp
  2. 1 0
      scene/resources/curve.h

+ 9 - 4
scene/resources/curve.cpp

@@ -51,6 +51,7 @@ Curve::Curve() {
 	_baked_cache_dirty = false;
 	_min_value = 0;
 	_max_value = 1;
+	_minmax_set_once = 0b00;
 }
 
 int Curve::add_point(Vector2 p_pos, real_t left_tangent, real_t right_tangent, TangentMode left_mode, TangentMode right_mode) {
@@ -282,20 +283,24 @@ void Curve::update_auto_tangents(int i) {
 #define MIN_Y_RANGE 0.01
 
 void Curve::set_min_value(float p_min) {
-	if (p_min > _max_value - MIN_Y_RANGE)
+	if (_minmax_set_once & 0b11 && p_min > _max_value - MIN_Y_RANGE) {
 		_min_value = _max_value - MIN_Y_RANGE;
-	else
+	} else {
+		_minmax_set_once |= 0b10; // first bit is "min set"
 		_min_value = p_min;
+	}
 	// Note: min and max are indicative values,
 	// it's still possible that existing points are out of range at this point.
 	emit_signal(SIGNAL_RANGE_CHANGED);
 }
 
 void Curve::set_max_value(float p_max) {
-	if (p_max < _min_value + MIN_Y_RANGE)
+	if (_minmax_set_once & 0b11 && p_max < _min_value + MIN_Y_RANGE) {
 		_max_value = _min_value + MIN_Y_RANGE;
-	else
+	} else {
+		_minmax_set_once |= 0b01; // second bit is "max set"
 		_max_value = p_max;
+	}
 	emit_signal(SIGNAL_RANGE_CHANGED);
 }
 

+ 1 - 0
scene/resources/curve.h

@@ -143,6 +143,7 @@ private:
 	int _bake_resolution;
 	float _min_value;
 	float _max_value;
+	int _minmax_set_once; // Encodes whether min and max have been set a first time, first bit for min and second for max.
 };
 
 VARIANT_ENUM_CAST(Curve::TangentMode)