Esempio n. 1
0
 public ContactManager()
 {
     m_contactList     = new List <Contact>();
     m_contactFilter   = _defaultFilter;
     m_contactListener = _defaultListener;
     m_broadPhase      = new BroadPhase();
 }
Esempio n. 2
0
        public Island(ContactListener listener)
        {
            m_listener = listener;

            m_bodies   = new List <Body>();
            m_contacts = new List <Contact>();
            m_joints   = new List <Joint>();

            m_velocities = new List <Velocity>();
            m_positions  = new List <Position>();
        }
Esempio n. 3
0
        internal void Destroy(Contact c)
        {
            Fixture fixtureA = c.GetFixtureA();
            Fixture fixtureB = c.GetFixtureB();
            Body    bodyA    = fixtureA.GetBody();
            Body    bodyB    = fixtureB.GetBody();

            if (ContactListener != null && c.IsTouching())
            {
                ContactListener.EndContact(c);
            }

            // Remove from the world.
            if (c._prev != null)
            {
                c._prev._next = c._next;
            }

            if (c._next != null)
            {
                c._next._prev = c._prev;
            }

            if (c == _contactList)
            {
                _contactList = c._next;
            }

            // Remove from body 1
            if (c._nodeA.Prev != null)
            {
                c._nodeA.Prev.Next = c._nodeA.Next;
            }

            if (c._nodeA.Next != null)
            {
                c._nodeA.Next.Prev = c._nodeA.Prev;
            }

            if (c._nodeA == bodyA._contactList)
            {
                bodyA._contactList = c._nodeA.Next;
            }

            // Remove from body 2
            if (c._nodeB.Prev != null)
            {
                c._nodeB.Prev.Next = c._nodeB.Next;
            }

            if (c._nodeB.Next != null)
            {
                c._nodeB.Next.Prev = c._nodeB.Prev;
            }

            if (c._nodeB == bodyB._contactList)
            {
                bodyB._contactList = c._nodeB.Next;
            }

            c.Destroy();

            --_contactCount;
        }
Esempio n. 4
0
		// Update the contact manifold and touching status.
		// Note: do not assume the fixture AABBs are overlapping or are valid.
		internal void Update(ContactListener listener){
			Manifold oldManifold = m_manifold;

			// Re-enable this contact.
			m_flags |= ContactFlags.e_enabledFlag;

			bool touching = false;
			bool wasTouching = (m_flags & ContactFlags.e_touchingFlag) == ContactFlags.e_touchingFlag;

			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();

			// Is this contact a sensor?
			if (sensor)
			{
			    Shape shapeA = m_fixtureA.GetShape();
			    Shape shapeB = m_fixtureB.GetShape();
			    touching = Collision.TestOverlap(shapeA, m_indexA, shapeB, m_indexB, xfA, xfB);

			    // Sensors don't generate manifolds.
				m_manifold.points.Clear();
			}
			else
			{
			    Evaluate(out m_manifold, xfA, xfB);
			    touching = m_manifold.points.Count() > 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.points.Count(); ++i)
			    {
					ManifoldPoint mp2 = m_manifold.points[i];
					mp2.normalImpulse = 0.0f;
					mp2.tangentImpulse = 0.0f;
					ContactID id2 = mp2.id;

					for (int j = 0; j < oldManifold.points.Count(); ++j) {
						ManifoldPoint mp1 = oldManifold.points[j];

						if (mp1.id.key == id2.key) {
							mp2.normalImpulse = mp1.normalImpulse;
							mp2.tangentImpulse = mp1.tangentImpulse;
							break;
						}
					}
			    }

			    if (touching != wasTouching)
			    {
			        bodyA.SetAwake(true);
			        bodyB.SetAwake(true);
			    }
			}

			if (touching)
			{
			    m_flags |= ContactFlags.e_touchingFlag;
			}
			else
			{
				m_flags &= ~ContactFlags.e_touchingFlag;
			}

			if (wasTouching == false && touching == true && listener != null)
			{
			    listener.BeginContact(this);
			}

			if (wasTouching == true && touching == false && listener != null)
			{
			    listener.EndContact(this);
			}

			if (sensor == false && touching && listener != null)
			{
			    listener.PreSolve(this, oldManifold);
			}
		}
Esempio n. 5
0
		/// Register a contact event listener. The listener is owned by you and must
		/// remain in scope.
		public void SetContactListener(ContactListener listener){
			m_contactManager.m_contactListener = listener;
		}
Esempio n. 6
0
		public ContactManager() {
			m_contactList = new List<Contact>();
			m_contactFilter = _defaultFilter;
			m_contactListener = _defaultListener;
			m_broadPhase = new BroadPhase();
		}
Esempio n. 7
0
 /// Register a contact event listener. The listener is owned by you and must
 /// remain in scope.
 public void SetContactListener(ContactListener listener)
 {
     m_contactManager.m_contactListener = listener;
 }
Esempio n. 8
0
		public Island(ContactListener listener){
			m_listener = listener;

			m_bodies = new List<Body>();
			m_contacts = new List<Contact>();
			m_joints = new List<Joint>();

			m_velocities = new List<Velocity>();
			m_positions = new List<Position>();
		}
Esempio n. 9
0
        // Update the contact manifold and touching status.
        // Note: do not assume the fixture AABBs are overlapping or are valid.
        internal void Update(ContactListener listener)
        {
            Manifold oldManifold = m_manifold;

            // Re-enable this contact.
            m_flags |= ContactFlags.e_enabledFlag;

            bool touching    = false;
            bool wasTouching = (m_flags & ContactFlags.e_touchingFlag) == ContactFlags.e_touchingFlag;

            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();

            // Is this contact a sensor?
            if (sensor)
            {
                Shape shapeA = m_fixtureA.GetShape();
                Shape shapeB = m_fixtureB.GetShape();
                touching = Collision.TestOverlap(shapeA, m_indexA, shapeB, m_indexB, xfA, xfB);

                // Sensors don't generate manifolds.
                m_manifold.points.Clear();
            }
            else
            {
                Evaluate(out m_manifold, xfA, xfB);
                touching = m_manifold.points.Count() > 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.points.Count(); ++i)
                {
                    ManifoldPoint mp2 = m_manifold.points[i];
                    mp2.normalImpulse  = 0.0f;
                    mp2.tangentImpulse = 0.0f;
                    ContactID id2 = mp2.id;

                    for (int j = 0; j < oldManifold.points.Count(); ++j)
                    {
                        ManifoldPoint mp1 = oldManifold.points[j];

                        if (mp1.id.key == id2.key)
                        {
                            mp2.normalImpulse  = mp1.normalImpulse;
                            mp2.tangentImpulse = mp1.tangentImpulse;
                            break;
                        }
                    }
                }

                if (touching != wasTouching)
                {
                    bodyA.SetAwake(true);
                    bodyB.SetAwake(true);
                }
            }

            if (touching)
            {
                m_flags |= ContactFlags.e_touchingFlag;
            }
            else
            {
                m_flags &= ~ContactFlags.e_touchingFlag;
            }

            if (wasTouching == false && touching == true && listener != null)
            {
                listener.BeginContact(this);
            }

            if (wasTouching == true && touching == false && listener != null)
            {
                listener.EndContact(this);
            }

            if (sensor == false && touching && listener != null)
            {
                listener.PreSolve(this, oldManifold);
            }
        }