// djm pooling public void update(ContactListener listener) { oldManifold.set(m_manifold); // Re-enable this contact. m_flags |= ENABLED_FLAG; bool touching = false; bool wasTouching = (m_flags & TOUCHING_FLAG) == TOUCHING_FLAG; bool sensorA = m_fixtureA.isSensor(); bool sensorB = m_fixtureB.isSensor(); bool sensor = sensorA || sensorB; Body bodyA = m_fixtureA.getBody(); Body bodyB = m_fixtureB.getBody(); Transform xfA = bodyA.getTransform(); Transform xfB = bodyB.getTransform(); // log.debug("TransformA: "+xfA); // log.debug("TransformB: "+xfB); if (sensor) { Shape shapeA = m_fixtureA.getShape(); Shape shapeB = m_fixtureB.getShape(); touching = pool.getCollision().testOverlap(shapeA, m_indexA, shapeB, m_indexB, xfA, xfB); // Sensors don't generate manifolds. m_manifold.pointCount = 0; } else { evaluate(m_manifold, xfA, xfB); touching = m_manifold.pointCount > 0; // Match old contact ids to new contact ids and copy the // stored impulses to warm start the solver. for (int i = 0; i < m_manifold.pointCount; ++i) { ManifoldPoint mp2 = m_manifold.points[i]; mp2.normalImpulse = 0.0d; mp2.tangentImpulse = 0.0d; ContactID id2 = mp2.id; for (int j = 0; j < oldManifold.pointCount; ++j) { ManifoldPoint mp1 = oldManifold.points[j]; if (mp1.id.isEqual(id2)) { mp2.normalImpulse = mp1.normalImpulse; mp2.tangentImpulse = mp1.tangentImpulse; break; } } } if (touching != wasTouching) { bodyA.setAwake(true); bodyB.setAwake(true); } } if (touching) { m_flags |= TOUCHING_FLAG; } else { m_flags &= ~TOUCHING_FLAG; } if (listener == null) { return; } if (wasTouching == false && touching) { listener.beginContact(this); } if (wasTouching && touching == false) { listener.endContact(this); } if (sensor == false && touching) { listener.preSolve(this, oldManifold); } }