diff --git a/scene/resources/curve.cpp b/scene/resources/curve.cpp index 6fa0ebbf55e..97ab91e26d8 100644 --- a/scene/resources/curve.cpp +++ b/scene/resources/curve.cpp @@ -40,11 +40,16 @@ Curve::Curve() { void Curve::set_point_count(int p_count) { ERR_FAIL_COND(p_count < 0); - if (_points.size() >= p_count) { + int old_size = _points.size(); + if (old_size == p_count) { + return; + } + + if (old_size > p_count) { _points.resize(p_count); mark_dirty(); } else { - for (int i = p_count - _points.size(); i > 0; i--) { + for (int i = p_count - old_size; i > 0; i--) { _add_point(Vector2()); } } @@ -226,6 +231,10 @@ void Curve::remove_point(int p_index) { } void Curve::clear_points() { + if (_points.is_empty()) { + return; + } + _points.clear(); mark_dirty(); notify_property_list_changed(); @@ -398,8 +407,6 @@ void Curve::set_data(const Array p_input) { const unsigned int ELEMS = 5; ERR_FAIL_COND(p_input.size() % ELEMS != 0); - _points.clear(); - // Validate input for (int i = 0; i < p_input.size(); i += ELEMS) { ERR_FAIL_COND(p_input[i].get_type() != Variant::VECTOR2); @@ -414,8 +421,11 @@ void Curve::set_data(const Array p_input) { int right_mode = p_input[i + 4]; ERR_FAIL_COND(right_mode < 0 || right_mode >= TANGENT_MODE_COUNT); } - - _points.resize(p_input.size() / ELEMS); + int old_size = _points.size(); + int new_size = p_input.size() / ELEMS; + if (old_size != new_size) { + _points.resize(new_size); + } for (int j = 0; j < _points.size(); ++j) { Point &p = _points.write[j]; @@ -431,7 +441,9 @@ void Curve::set_data(const Array p_input) { } mark_dirty(); - notify_property_list_changed(); + if (old_size != new_size) { + notify_property_list_changed(); + } } void Curve::bake() { @@ -636,11 +648,16 @@ int Curve2D::get_point_count() const { void Curve2D::set_point_count(int p_count) { ERR_FAIL_COND(p_count < 0); - if (points.size() >= p_count) { + int old_size = points.size(); + if (old_size == p_count) { + return; + } + + if (old_size > p_count) { points.resize(p_count); mark_dirty(); } else { - for (int i = p_count - points.size(); i > 0; i--) { + for (int i = p_count - old_size; i > 0; i--) { _add_point(Vector2()); } } @@ -1128,7 +1145,11 @@ void Curve2D::_set_data(const Dictionary &p_data) { PackedVector2Array rp = p_data["points"]; int pc = rp.size(); ERR_FAIL_COND(pc % 3 != 0); - points.resize(pc / 3); + int old_size = points.size(); + int new_size = pc / 3; + if (old_size != new_size) { + points.resize(new_size); + } const Vector2 *r = rp.ptr(); for (int i = 0; i < points.size(); i++) { @@ -1138,7 +1159,9 @@ void Curve2D::_set_data(const Dictionary &p_data) { } mark_dirty(); - notify_property_list_changed(); + if (old_size != new_size) { + notify_property_list_changed(); + } } PackedVector2Array Curve2D::tessellate(int p_max_stages, real_t p_tolerance) const { @@ -1330,11 +1353,16 @@ int Curve3D::get_point_count() const { void Curve3D::set_point_count(int p_count) { ERR_FAIL_COND(p_count < 0); - if (points.size() >= p_count) { + int old_size = points.size(); + if (old_size == p_count) { + return; + } + + if (old_size > p_count) { points.resize(p_count); mark_dirty(); } else { - for (int i = p_count - points.size(); i > 0; i--) { + for (int i = p_count - old_size; i > 0; i--) { _add_point(Vector3()); } } @@ -2036,7 +2064,11 @@ void Curve3D::_set_data(const Dictionary &p_data) { PackedVector3Array rp = p_data["points"]; int pc = rp.size(); ERR_FAIL_COND(pc % 3 != 0); - points.resize(pc / 3); + int old_size = points.size(); + int new_size = pc / 3; + if (old_size != new_size) { + points.resize(new_size); + } const Vector3 *r = rp.ptr(); Vector rtl = p_data["tilts"]; const real_t *rt = rtl.ptr(); @@ -2049,7 +2081,9 @@ void Curve3D::_set_data(const Dictionary &p_data) { } mark_dirty(); - notify_property_list_changed(); + if (old_size != new_size) { + notify_property_list_changed(); + } } PackedVector3Array Curve3D::tessellate(int p_max_stages, real_t p_tolerance) const {