public void collide() { // Update awake contacts. for (Contact c = m_world.m_contactList; c != null; c = c.getNext()) { final Body body1 = c.getShape1().getBody(); final Body body2 = c.getShape2().getBody(); if (body1.isSleeping() && body2.isSleeping()) { continue; } c.update(m_world.m_contactListener); } }
public Object pairAdded(final Object proxyUserData1, final Object proxyUserData2) { Shape shape1 = (Shape) proxyUserData1; Shape shape2 = (Shape) proxyUserData2; Body body1 = shape1.getBody(); Body body2 = shape2.getBody(); if (body1.isStatic() && body2.isStatic()) { return m_nullContact; } if (shape1.getBody() == shape2.getBody()) { return m_nullContact; } if (body2.isConnected(body1)) { return m_nullContact; } if (m_world.m_contactFilter != null && m_world.m_contactFilter.shouldCollide(shape1, shape2) == false) { return m_nullContact; } // Call the factory. final Contact c = Contact.createContact(shape1, shape2); if (c == null) { return m_nullContact; } // Contact creation may swap shapes. shape1 = c.getShape1(); shape2 = c.getShape2(); body1 = shape1.getBody(); body2 = shape2.getBody(); // Insert into the world. c.m_prev = null; c.m_next = m_world.m_contactList; if (m_world.m_contactList != null) { m_world.m_contactList.m_prev = c; } m_world.m_contactList = c; // Connect to island graph. // Connect to body 1 c.m_node1.contact = c; c.m_node1.other = body2; c.m_node1.prev = null; c.m_node1.next = body1.m_contactList; if (body1.m_contactList != null) { body1.m_contactList.prev = c.m_node1; } body1.m_contactList = c.m_node1; // Connect to body 2 c.m_node2.contact = c; c.m_node2.other = body1; c.m_node2.prev = null; c.m_node2.next = body2.m_contactList; if (body2.m_contactList != null) { body2.m_contactList.prev = c.m_node2; } body2.m_contactList = c.m_node2; ++m_world.m_contactCount; return c; }
public void destroy(final Contact c) { final Vec2 v1 = tlV1.get(); final ContactPoint cp = tlCp.get(); final Shape shape1 = c.getShape1(); final Shape shape2 = c.getShape2(); // Inform the user that this contact is ending. final int manifoldCount = c.getManifoldCount(); if (manifoldCount > 0 && (m_world.m_contactListener != null)) { final Body b1 = shape1.getBody(); final Body b2 = shape2.getBody(); final List<Manifold> manifolds = c.getManifolds(); cp.shape1 = c.getShape1(); cp.shape2 = c.getShape2(); cp.friction = c.m_friction; cp.restitution = c.m_restitution; for (int i = 0; i < manifoldCount; ++i) { final Manifold manifold = manifolds.get(i); cp.normal.set(manifold.normal); for (int j = 0; j < manifold.pointCount; ++j) { final ManifoldPoint mp = manifold.points[j]; b1.getWorldLocationToOut(mp.localPoint1, cp.position); b1.getLinearVelocityFromLocalPointToOut(mp.localPoint1, v1); // velocity isn't initialized in the contact point b2.getLinearVelocityFromLocalPointToOut(mp.localPoint2, cp.velocity); cp.velocity.subLocal(v1); cp.separation = mp.separation; cp.id.set(mp.id); m_world.m_contactListener.remove(cp); } } } // Remove from the world. if (c.m_prev != null) { c.m_prev.m_next = c.m_next; } if (c.m_next != null) { c.m_next.m_prev = c.m_prev; } if (c == m_world.m_contactList) { m_world.m_contactList = c.m_next; } final Body body1 = shape1.getBody(); final Body body2 = shape2.getBody(); // Remove from body 1 if (c.m_node1.prev != null) { c.m_node1.prev.next = c.m_node1.next; } if (c.m_node1.next != null) { c.m_node1.next.prev = c.m_node1.prev; } if (c.m_node1 == body1.m_contactList) { body1.m_contactList = c.m_node1.next; } // Remove from body 2 if (c.m_node2.prev != null) { c.m_node2.prev.next = c.m_node2.next; } if (c.m_node2.next != null) { c.m_node2.next.prev = c.m_node2.prev; } if (c.m_node2 == body2.m_contactList) { body2.m_contactList = c.m_node2.next; } // Call the factory. Contact.destroy(c); --m_world.m_contactCount; }