/// Compute the point states given two manifolds. The states pertain to the transition from manifold1
        /// to manifold2. So state1 is either persist or remove while state2 is either add or persist.
        public static void b2GetPointStates(b2PointState[] state1, b2PointState[] state2,
                              ref b2Manifold manifold1, ref b2Manifold manifold2)
        {
            for (int i = 0; i < b2Settings.b2_maxManifoldPoints; ++i)
            {
                state1[i] = b2PointState.b2_nullState;
                state2[i] = b2PointState.b2_nullState;
            }

            // Detect persists and removes.
            for (int i = 0; i < manifold1.pointCount; ++i)
            {
                b2ContactFeature id = manifold1.points[i].id;

                state1[i] = b2PointState.b2_removeState;

                for (int j = 0; j < manifold2.pointCount; ++j)
                {
                    if (manifold2.points[j].id.Equals(id))
                    {
                        state1[i] = b2PointState.b2_persistState;
                        break;
                    }
                }
            }

            // Detect persists and adds.
            for (int i = 0; i < manifold2.pointCount; ++i)
            {
                b2ContactFeature id = manifold2.points[i].id;

                state2[i] = b2PointState.b2_addState;

                for (int j = 0; j < manifold1.pointCount; ++j)
                {
                    if (manifold1.points[j].id.Equals(id))
                    {
                        state2[i] = b2PointState.b2_persistState;
                        break;
                    }
                }
            }
        }
Exemple #2
0
        public override void PreSolve(b2Contact contact, ref b2Manifold oldManifold)
        {
            b2Manifold manifold = contact.GetManifold();

            if (manifold.pointCount == 0)
            {
                return;
            }

            b2Fixture fixtureA = contact.GetFixtureA();
            b2Fixture fixtureB = contact.GetFixtureB();

            b2PointState[] state1 = new b2PointState[b2Settings.b2_maxManifoldPoints];
            b2PointState[] state2 = new b2PointState[b2Settings.b2_maxManifoldPoints];
            b2Collision.b2GetPointStates(state1, state2, ref oldManifold, ref manifold);

            b2WorldManifold worldManifold = new b2WorldManifold();

            contact.GetWorldManifold(ref worldManifold);

            for (int i = 0; i < manifold.pointCount && m_pointCount < k_maxContactPoints; ++i)
            {
                ContactPoint cp = m_points[m_pointCount];
                if (cp == null)
                {
                    cp = new ContactPoint();
                    m_points[m_pointCount] = cp;
                }
                cp.fixtureA = fixtureA;
                cp.fixtureB = fixtureB;
                cp.position = worldManifold.points[i];
                cp.normal   = worldManifold.normal;
                cp.state    = state2[i];
                ++m_pointCount;
            }
        }
Exemple #3
0
            public override void PreSolve(Box2D.Dynamics.Contacts.b2Contact contact, ref Box2D.Collision.b2Manifold oldManifold)
            {
                b2Manifold manifold = contact.GetManifold();

                if (manifold.pointCount == 0)
                {
                    return;
                }

                b2Fixture fixtureA = contact.GetFixtureA();
                b2Fixture fixtureB = contact.GetFixtureB();

                b2PointState[] state1 = new b2PointState[b2Settings.b2_maxManifoldPoints];
                b2PointState[] state2 = new b2PointState[b2Settings.b2_maxManifoldPoints];
                b2Collision.b2GetPointStates(state1, state2, ref oldManifold, ref manifold);

                b2WorldManifold worldManifold = new b2WorldManifold();
                contact.GetWorldManifold(ref worldManifold);

                for (int i = 0; i < manifold.pointCount &&  m_pointCount < k_maxContactPoints; ++i)
                {
                    ContactPoint cp = m_points[m_pointCount];
                    cp.fixtureA = fixtureA;
                    cp.fixtureB = fixtureB;
                    cp.position = worldManifold.points[i];
                    cp.normal = worldManifold.normal;
                    cp.state = state2[i];
                    m_points[m_pointCount] = cp;
                    ++m_pointCount;
                }
            }