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:
Pedro J. Estébanez
2017-07-25 04:26:47 +02:00
parent ac2c5e8dcd
commit 7264716e86
6 changed files with 37 additions and 13 deletions

View File

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