/// <summary> /// Removes all objects from the world and removes all memory cached objects. /// </summary> public void Clear() { // remove bodies from collision system for (int index = 0, length = rigidBodies.Count; index < length; index++) { RigidBody body = rigidBodies[index]; CollisionSystem.RemoveEntity(body); if (body.island != null) { body.island.ClearLists(); body.island = null; } body.connections.Clear(); body.arbiters.Clear(); body.constraints.Clear(); events.RaiseRemovedRigidBody(body); } for (int index = 0, length = softbodies.Count; index < length; index++) { SoftBody body = softbodies[index]; CollisionSystem.RemoveEntity(body); } // remove bodies from the world rigidBodies.Clear(); // remove constraints for (int index = 0, length = constraints.Count; index < length; index++) { Constraint constraint = constraints[index]; events.RaiseRemovedConstraint(constraint); } constraints.Clear(); softbodies.Clear(); // remove all islands islands.RemoveAll(); // delete the arbiters arbiterMap.Clear(); arbiterTriggerMap.Clear(); ResetResourcePools(); }
private bool RemoveBody(RigidBody body, bool removeMassPoints) { // Its very important to clean up, after removing a body if (!removeMassPoints && body.IsParticle) { return(false); } // remove the body from the world list if (!rigidBodies.Remove(body)) { return(false); } // Remove all connected constraints and arbiters for (int index = 0, length = body.arbiters.Count; index < length; index++) { Arbiter arbiter = body.arbiters[index]; arbiterMap.Remove(arbiter); events.RaiseBodiesEndCollide(arbiter.body1, arbiter.body2); cacheOverPairContact.SetBodies(arbiter.body1, arbiter.body2); initialCollisions.Remove(cacheOverPairContact); } for (int index = 0, length = body.arbitersTrigger.Count; index < length; index++) { Arbiter arbiter = body.arbitersTrigger[index]; arbiterTriggerMap.Remove(arbiter); if (arbiter.body1.isColliderOnly) { events.RaiseTriggerEndCollide(arbiter.body1, arbiter.body2); } else { events.RaiseTriggerEndCollide(arbiter.body2, arbiter.body1); } cacheOverPairContact.SetBodies(arbiter.body1, arbiter.body2); initialTriggers.Remove(cacheOverPairContact); } for (int index = 0, length = body.constraints.Count; index < length; index++) { Constraint constraint = body.constraints[index]; constraints.Remove(constraint); events.RaiseRemovedConstraint(constraint); } // remove the body from the collision system CollisionSystem.RemoveEntity(body); // remove the body from the island manager islands.RemoveBody(body); events.RaiseRemovedRigidBody(body); return(true); }