Fix Softbody pinned vertices when editing the array

Fix Softbody pinned vertices when editing the array
This commit is contained in:
BurryBurst 2024-09-28 22:28:11 +02:00
parent e3213aaef5
commit 38358fcdeb
1 changed files with 14 additions and 10 deletions

View File

@ -185,8 +185,8 @@ void SoftBody3D::_get_property_list(List<PropertyInfo> *p_list) const {
bool SoftBody3D::_set_property_pinned_points_indices(const Array &p_indices) { bool SoftBody3D::_set_property_pinned_points_indices(const Array &p_indices) {
const int p_indices_size = p_indices.size(); const int p_indices_size = p_indices.size();
{ // Remove the pined points on physics server that will be removed by resize { // Remove the pinned points on physics server that will be removed by resize
const PinnedPoint *r = pinned_points.ptr(); const PinnedPoint *r = pinned_points.ptr();
if (p_indices_size < pinned_points.size()) { if (p_indices_size < pinned_points.size()) {
for (int i = pinned_points.size() - 1; i >= p_indices_size; --i) { for (int i = pinned_points.size() - 1; i >= p_indices_size; --i) {
@ -202,16 +202,20 @@ bool SoftBody3D::_set_property_pinned_points_indices(const Array &p_indices) {
for (int i = 0; i < p_indices_size; ++i) { for (int i = 0; i < p_indices_size; ++i) {
point_index = p_indices.get(i); point_index = p_indices.get(i);
if (w[i].point_index != point_index || pinned_points.size() < p_indices_size) { if (w[i].point_index != point_index || pinned_points.size() < p_indices_size) {
bool insert = false; if (point_index < -1) {
if (w[i].point_index != -1 && p_indices.find(w[i].point_index) == -1) { // Ignore point_indices under -1 so we dont go the whole call stack for this to fail
pin_point(w[i].point_index, false); w[i].point_index = point_index;
insert = true; continue;
} }
w[i].point_index = point_index; if (w[i].point_index == -1) {
if (insert) { w[i].point_index = point_index;
pin_point(w[i].point_index, true, NodePath(), i); pin_point(point_index, true);
} else { } else {
pin_point(w[i].point_index, true); if (p_indices.find(w[i].point_index) == -1) {
_pin_point_on_physics_server(w[i].point_index, false);
}
w[i].point_index = point_index;
pin_point(point_index, true, NodePath(), i);
} }
} }
} }