/// 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; } } } }
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; } }
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; } }