mirror of
https://github.com/godotengine/godot.git
synced 2026-01-06 10:11:57 +03:00
Improve cleanup of physics constraints
Don't abort the loop when one is already released Remove warning on already-released constraint Clean up area's contraints as well Clear the constraint data as well Do the cleanup as soon as the space changes
This commit is contained in:
@@ -232,6 +232,14 @@ void PhysicsServerSW::area_set_space(RID p_area, RID p_space) {
|
||||
if (area->get_space() == space)
|
||||
return; //pointless
|
||||
|
||||
for (Set<ConstraintSW *>::Element *E = area->get_constraints().front(); E; E = E->next()) {
|
||||
RID self = E->get()->get_self();
|
||||
if (!self.is_valid())
|
||||
continue;
|
||||
free(self);
|
||||
}
|
||||
area->clear_constraints();
|
||||
|
||||
area->set_space(space);
|
||||
};
|
||||
|
||||
@@ -485,6 +493,14 @@ void PhysicsServerSW::body_set_space(RID p_body, RID p_space) {
|
||||
if (body->get_space() == space)
|
||||
return; //pointless
|
||||
|
||||
while (body->get_constraint_map().size()) {
|
||||
RID self = body->get_constraint_map().front()->key()->get_self();
|
||||
if (!self.is_valid())
|
||||
continue;
|
||||
free(self);
|
||||
}
|
||||
body->clear_constraint_map();
|
||||
|
||||
body->set_space(space);
|
||||
};
|
||||
|
||||
@@ -1333,12 +1349,6 @@ void PhysicsServerSW::free(RID p_rid) {
|
||||
body->remove_shape(0);
|
||||
}
|
||||
|
||||
while (body->get_constraint_map().size()) {
|
||||
RID self = body->get_constraint_map().front()->key()->get_self();
|
||||
ERR_FAIL_COND(!self.is_valid());
|
||||
free(self);
|
||||
}
|
||||
|
||||
body_owner.free(p_rid);
|
||||
memdelete(body);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user