home *** CD-ROM | disk | FTP | other *** search
/ 404 Jogos / CLJG.iso / Diversos / Beez.swf / scripts / Box2D / Dynamics / b2ContactManager.as < prev    next >
Encoding:
Text File  |  2008-09-03  |  6.4 KB  |  208 lines

  1. package Box2D.Dynamics
  2. {
  3.    import Box2D.Collision.Shapes.b2Shape;
  4.    import Box2D.Collision.b2ContactPoint;
  5.    import Box2D.Collision.b2Manifold;
  6.    import Box2D.Collision.b2ManifoldPoint;
  7.    import Box2D.Collision.b2PairCallback;
  8.    import Box2D.Common.Math.b2Vec2;
  9.    import Box2D.Dynamics.Contacts.b2Contact;
  10.    import Box2D.Dynamics.Contacts.b2NullContact;
  11.    
  12.    public class b2ContactManager extends b2PairCallback
  13.    {
  14.       
  15.       private static const s_evalCP:b2ContactPoint = new b2ContactPoint();
  16.        
  17.       
  18.       public var m_world:b2World;
  19.       
  20.       public var m_destroyImmediate:Boolean;
  21.       
  22.       public var m_nullContact:b2NullContact;
  23.       
  24.       public function b2ContactManager()
  25.       {
  26.          m_nullContact = new b2NullContact();
  27.          super();
  28.          m_world = null;
  29.          m_destroyImmediate = false;
  30.       }
  31.       
  32.       override public function PairRemoved(proxyUserData1:*, proxyUserData2:*, pairUserData:*) : void
  33.       {
  34.          if(pairUserData == null)
  35.          {
  36.             return;
  37.          }
  38.          var c:b2Contact = pairUserData as b2Contact;
  39.          if(c == m_nullContact)
  40.          {
  41.             return;
  42.          }
  43.          Destroy(c);
  44.       }
  45.       
  46.       public function Destroy(c:b2Contact) : void
  47.       {
  48.          var b1:b2Body = null;
  49.          var b2:b2Body = null;
  50.          var manifolds:Array = null;
  51.          var cp:b2ContactPoint = null;
  52.          var i:int = 0;
  53.          var manifold:b2Manifold = null;
  54.          var j:int = 0;
  55.          var mp:b2ManifoldPoint = null;
  56.          var v1:b2Vec2 = null;
  57.          var v2:b2Vec2 = null;
  58.          var shape1:b2Shape = c.m_shape1;
  59.          var shape2:b2Shape = c.m_shape2;
  60.          var manifoldCount:int = c.m_manifoldCount;
  61.          if(manifoldCount > 0 && Boolean(m_world.m_contactListener))
  62.          {
  63.             b1 = shape1.m_body;
  64.             b2 = shape2.m_body;
  65.             manifolds = c.GetManifolds();
  66.             cp = s_evalCP;
  67.             cp.shape1 = c.m_shape1;
  68.             cp.shape2 = c.m_shape1;
  69.             cp.friction = c.m_friction;
  70.             cp.restitution = c.m_restitution;
  71.             for(i = 0; i < manifoldCount; i++)
  72.             {
  73.                manifold = manifolds[i];
  74.                cp.normal.SetV(manifold.normal);
  75.                for(j = 0; j < manifold.pointCount; j++)
  76.                {
  77.                   mp = manifold.points[j];
  78.                   cp.position = b1.GetWorldPoint(mp.localPoint1);
  79.                   v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
  80.                   v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
  81.                   cp.velocity.Set(v2.x - v1.x,v2.y - v1.y);
  82.                   cp.separation = mp.separation;
  83.                   cp.id.key = mp.id._key;
  84.                   m_world.m_contactListener.Remove(cp);
  85.                }
  86.             }
  87.          }
  88.          if(c.m_prev)
  89.          {
  90.             c.m_prev.m_next = c.m_next;
  91.          }
  92.          if(c.m_next)
  93.          {
  94.             c.m_next.m_prev = c.m_prev;
  95.          }
  96.          if(c == m_world.m_contactList)
  97.          {
  98.             m_world.m_contactList = c.m_next;
  99.          }
  100.          var body1:b2Body = shape1.m_body;
  101.          var body2:b2Body = shape2.m_body;
  102.          if(c.m_node1.prev)
  103.          {
  104.             c.m_node1.prev.next = c.m_node1.next;
  105.          }
  106.          if(c.m_node1.next)
  107.          {
  108.             c.m_node1.next.prev = c.m_node1.prev;
  109.          }
  110.          if(c.m_node1 == body1.m_contactList)
  111.          {
  112.             body1.m_contactList = c.m_node1.next;
  113.          }
  114.          if(c.m_node2.prev)
  115.          {
  116.             c.m_node2.prev.next = c.m_node2.next;
  117.          }
  118.          if(c.m_node2.next)
  119.          {
  120.             c.m_node2.next.prev = c.m_node2.prev;
  121.          }
  122.          if(c.m_node2 == body2.m_contactList)
  123.          {
  124.             body2.m_contactList = c.m_node2.next;
  125.          }
  126.          b2Contact.Destroy(c,m_world.m_blockAllocator);
  127.          --m_world.m_contactCount;
  128.       }
  129.       
  130.       override public function PairAdded(proxyUserData1:*, proxyUserData2:*) : *
  131.       {
  132.          var shape1:b2Shape = proxyUserData1 as b2Shape;
  133.          var shape2:b2Shape = proxyUserData2 as b2Shape;
  134.          var body1:b2Body = shape1.m_body;
  135.          var body2:b2Body = shape2.m_body;
  136.          if(body1.IsStatic() && body2.IsStatic())
  137.          {
  138.             return m_nullContact;
  139.          }
  140.          if(shape1.m_body == shape2.m_body)
  141.          {
  142.             return m_nullContact;
  143.          }
  144.          if(body2.IsConnected(body1))
  145.          {
  146.             return m_nullContact;
  147.          }
  148.          if(m_world.m_contactFilter != null && m_world.m_contactFilter.ShouldCollide(shape1,shape2) == false)
  149.          {
  150.             return m_nullContact;
  151.          }
  152.          var c:b2Contact = b2Contact.Create(shape1,shape2,m_world.m_blockAllocator);
  153.          if(c == null)
  154.          {
  155.             return m_nullContact;
  156.          }
  157.          shape1 = c.m_shape1;
  158.          shape2 = c.m_shape2;
  159.          body1 = shape1.m_body;
  160.          body2 = shape2.m_body;
  161.          c.m_prev = null;
  162.          c.m_next = m_world.m_contactList;
  163.          if(m_world.m_contactList != null)
  164.          {
  165.             m_world.m_contactList.m_prev = c;
  166.          }
  167.          m_world.m_contactList = c;
  168.          c.m_node1.contact = c;
  169.          c.m_node1.other = body2;
  170.          c.m_node1.prev = null;
  171.          c.m_node1.next = body1.m_contactList;
  172.          if(body1.m_contactList != null)
  173.          {
  174.             body1.m_contactList.prev = c.m_node1;
  175.          }
  176.          body1.m_contactList = c.m_node1;
  177.          c.m_node2.contact = c;
  178.          c.m_node2.other = body1;
  179.          c.m_node2.prev = null;
  180.          c.m_node2.next = body2.m_contactList;
  181.          if(body2.m_contactList != null)
  182.          {
  183.             body2.m_contactList.prev = c.m_node2;
  184.          }
  185.          body2.m_contactList = c.m_node2;
  186.          ++m_world.m_contactCount;
  187.          return c;
  188.       }
  189.       
  190.       public function Collide() : void
  191.       {
  192.          var body1:b2Body = null;
  193.          var body2:b2Body = null;
  194.          var c:b2Contact = m_world.m_contactList;
  195.          while(c)
  196.          {
  197.             body1 = c.m_shape1.m_body;
  198.             body2 = c.m_shape2.m_body;
  199.             if(!(body1.IsSleeping() && body2.IsSleeping()))
  200.             {
  201.                c.Update(m_world.m_contactListener);
  202.             }
  203.             c = c.m_next;
  204.          }
  205.       }
  206.    }
  207. }
  208.