示例#1
0
    /// 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();
    }