/// <summary> /// 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. /// </summary> /// <param name="fixture">the fixture to be removed.</param> /// <warning>This function is locked during callbacks.</warning> public void DestroyFixture(Fixture fixture) { Debug.Assert(World.Locked == false); if (World.Locked == true) { return; } Debug.Assert(fixture.Body == this); // Remove the fixture from this body's singly linked list. Debug.Assert(FixtureCount > 0); Fixture node = FixtureList; Fixture last = null; // java change bool found = false; while (node != null) { if (node == fixture) { node = fixture.Next; found = true; break; } last = node; node = node.Next; } // You tried to remove a shape that is not attached to this body. Debug.Assert(found); // java change, remove it from the list if (last == null) { FixtureList = fixture.Next; } else { last.Next = fixture.Next; } // Destroy any contacts associated with the fixture. ContactEdge edge = ContactList; while (edge != null) { Contact c = edge.Contact; edge = edge.Next; Fixture fixtureA = c.FixtureA; Fixture fixtureB = c.FixtureB; if (fixture == fixtureA || fixture == fixtureB) { // This destroys the contact and removes it from // this body's contact list. World.ContactManager.Destroy(c); } } if ((Flags & TypeFlags.Active) == TypeFlags.Active) { BroadPhase broadPhase = World.ContactManager.BroadPhase; fixture.DestroyProxies(broadPhase); } fixture.Destroy(); fixture.Body = null; fixture.Next = null; --FixtureCount; // Reset the mass data. ResetMassData(); }