/// Destroy a fixture. This removes the fixture from the broad-phase and /// destroys all contacts associated with this fixture. This will /// automatically adjust the mass of the body if the body is dynamic and the /// fixture has positive density. /// All fixtures attached to a body are implicitly destroyed when the body is destroyed. /// @param fixture the fixture to be removed. /// @warning This function is locked during callbacks. public void DestroyFixture(b2Fixture fixture) { if (fixture == null) { return; } Debug.Assert(m_world.IsLocked() == false); if (m_world.IsLocked() == true) { return; } Debug.Assert(fixture.m_body == this); // Remove the fixture from this body's singly linked list. Debug.Assert(m_fixtureCount > 0); b2Fixture node = m_fixtureList; bool found = false; while (node != null) { if (node == fixture) { node = fixture.m_next; found = true; break; } node = node.m_next; } // You tried to remove a shape that is not attached to this body. Debug.Assert(found); // Destroy any contacts associated with the fixture. b2ContactEdge edge = m_contactList; while (edge != null) { b2Contact c = edge.contact; edge = edge.next; b2Fixture fixtureA = c.GetFixtureA(); b2Fixture fixtureB = c.GetFixtureB(); if (fixture == fixtureA || fixture == fixtureB) { // This destroys the contact and removes it from // this body's contact list. m_world.m_contactManager.Destroy(c); } } if ((m_flags & BodyFlags.e_activeFlag) != 0) { b2BroadPhase broadPhase = m_world.m_contactManager.m_broadPhase; fixture.DestroyProxies(broadPhase); } fixture.m_body = null; fixture.m_next = null; fixture.Destroy(); --m_fixtureCount; // Reset the mass data. ResetMassData(); }