home *** CD-ROM | disk | FTP | other *** search
- package Box2D.Dynamics
- {
- import Box2D.Collision.Shapes.b2Shape;
- import Box2D.Collision.b2ContactPoint;
- import Box2D.Collision.b2Manifold;
- import Box2D.Collision.b2ManifoldPoint;
- import Box2D.Collision.b2PairCallback;
- import Box2D.Common.Math.b2Vec2;
- import Box2D.Dynamics.Contacts.b2Contact;
- import Box2D.Dynamics.Contacts.b2NullContact;
-
- public class b2ContactManager extends b2PairCallback
- {
-
- private static const s_evalCP:b2ContactPoint = new b2ContactPoint();
-
-
- public var m_world:b2World;
-
- public var m_destroyImmediate:Boolean;
-
- public var m_nullContact:b2NullContact;
-
- public function b2ContactManager()
- {
- m_nullContact = new b2NullContact();
- super();
- m_world = null;
- m_destroyImmediate = false;
- }
-
- override public function PairRemoved(proxyUserData1:*, proxyUserData2:*, pairUserData:*) : void
- {
- if(pairUserData == null)
- {
- return;
- }
- var c:b2Contact = pairUserData as b2Contact;
- if(c == m_nullContact)
- {
- return;
- }
- Destroy(c);
- }
-
- public function Destroy(c:b2Contact) : void
- {
- var b1:b2Body = null;
- var b2:b2Body = null;
- var manifolds:Array = null;
- var cp:b2ContactPoint = null;
- var i:int = 0;
- var manifold:b2Manifold = null;
- var j:int = 0;
- var mp:b2ManifoldPoint = null;
- var v1:b2Vec2 = null;
- var v2:b2Vec2 = null;
- var shape1:b2Shape = c.m_shape1;
- var shape2:b2Shape = c.m_shape2;
- var manifoldCount:int = c.m_manifoldCount;
- if(manifoldCount > 0 && Boolean(m_world.m_contactListener))
- {
- b1 = shape1.m_body;
- b2 = shape2.m_body;
- manifolds = c.GetManifolds();
- cp = s_evalCP;
- cp.shape1 = c.m_shape1;
- cp.shape2 = c.m_shape1;
- cp.friction = c.m_friction;
- cp.restitution = c.m_restitution;
- for(i = 0; i < manifoldCount; i++)
- {
- manifold = manifolds[i];
- cp.normal.SetV(manifold.normal);
- for(j = 0; j < manifold.pointCount; j++)
- {
- mp = manifold.points[j];
- cp.position = b1.GetWorldPoint(mp.localPoint1);
- v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
- v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
- cp.velocity.Set(v2.x - v1.x,v2.y - v1.y);
- cp.separation = mp.separation;
- cp.id.key = mp.id._key;
- m_world.m_contactListener.Remove(cp);
- }
- }
- }
- if(c.m_prev)
- {
- c.m_prev.m_next = c.m_next;
- }
- if(c.m_next)
- {
- c.m_next.m_prev = c.m_prev;
- }
- if(c == m_world.m_contactList)
- {
- m_world.m_contactList = c.m_next;
- }
- var body1:b2Body = shape1.m_body;
- var body2:b2Body = shape2.m_body;
- if(c.m_node1.prev)
- {
- c.m_node1.prev.next = c.m_node1.next;
- }
- if(c.m_node1.next)
- {
- c.m_node1.next.prev = c.m_node1.prev;
- }
- if(c.m_node1 == body1.m_contactList)
- {
- body1.m_contactList = c.m_node1.next;
- }
- if(c.m_node2.prev)
- {
- c.m_node2.prev.next = c.m_node2.next;
- }
- if(c.m_node2.next)
- {
- c.m_node2.next.prev = c.m_node2.prev;
- }
- if(c.m_node2 == body2.m_contactList)
- {
- body2.m_contactList = c.m_node2.next;
- }
- b2Contact.Destroy(c,m_world.m_blockAllocator);
- --m_world.m_contactCount;
- }
-
- override public function PairAdded(proxyUserData1:*, proxyUserData2:*) : *
- {
- var shape1:b2Shape = proxyUserData1 as b2Shape;
- var shape2:b2Shape = proxyUserData2 as b2Shape;
- var body1:b2Body = shape1.m_body;
- var body2:b2Body = shape2.m_body;
- if(body1.IsStatic() && body2.IsStatic())
- {
- return m_nullContact;
- }
- if(shape1.m_body == shape2.m_body)
- {
- 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;
- }
- var c:b2Contact = b2Contact.Create(shape1,shape2,m_world.m_blockAllocator);
- if(c == null)
- {
- return m_nullContact;
- }
- shape1 = c.m_shape1;
- shape2 = c.m_shape2;
- body1 = shape1.m_body;
- body2 = shape2.m_body;
- 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;
- 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;
- 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 function Collide() : void
- {
- var body1:b2Body = null;
- var body2:b2Body = null;
- var c:b2Contact = m_world.m_contactList;
- while(c)
- {
- body1 = c.m_shape1.m_body;
- body2 = c.m_shape2.m_body;
- if(!(body1.IsSleeping() && body2.IsSleeping()))
- {
- c.Update(m_world.m_contactListener);
- }
- c = c.m_next;
- }
- }
- }
- }
-