private void UpdateContacts(ArbiterMap selectedArbiterMap) { foreach (Arbiter arbiter in selectedArbiterMap.Arbiters) { UpdateArbiterContacts(arbiter); } while (removedArbiterStack.Count > 0) { Arbiter arbiter = removedArbiterStack.Pop(); Arbiter.Pool.GiveBack(arbiter); selectedArbiterMap.Remove(arbiter); if (selectedArbiterMap == arbiterMap) { removedArbiterQueue.Enqueue(arbiter); events.RaiseBodiesEndCollide(arbiter.body1, arbiter.body2); cacheOverPairContact.SetBodies(arbiter.body1, arbiter.body2); initialCollisions.Remove(cacheOverPairContact); } else { 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); } } }
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); }