internal void destroy( Contact contact ) { var fixtureA = contact.fixtureA; var fixtureB = contact.fixtureB; var bodyA = fixtureA.body; var bodyB = fixtureB.body; if( contact.isTouching ) { //Report the separation to both participants: if( fixtureA != null && fixtureA.onSeparation != null ) fixtureA.onSeparation( fixtureA, fixtureB ); //Reverse the order of the reported fixtures. The first fixture is always the one that the //user subscribed to. if( fixtureB != null && fixtureB.onSeparation != null ) fixtureB.onSeparation( fixtureB, fixtureA ); if( onEndContact != null ) onEndContact( contact ); } // Remove from the world. contactList.Remove( contact ); // Remove from body 1 if( contact._nodeA.prev != null ) contact._nodeA.prev.next = contact._nodeA.next; if( contact._nodeA.next != null ) contact._nodeA.next.prev = contact._nodeA.prev; if( contact._nodeA == bodyA.contactList ) bodyA.contactList = contact._nodeA.next; // Remove from body 2 if( contact._nodeB.prev != null ) contact._nodeB.prev.next = contact._nodeB.next; if( contact._nodeB.next != null ) contact._nodeB.next.prev = contact._nodeB.prev; if( contact._nodeB == bodyB.contactList ) bodyB.contactList = contact._nodeB.next; #if USE_ACTIVE_CONTACT_SET if (ActiveContacts.Contains(contact)) { ActiveContacts.Remove(contact); } #endif contact.destroy(); }