Esempio n. 1
0
        public void Destroy(Contact c)
        {
            Fixture fixtureA = c.FixtureA;
            Fixture fixtureB = c.FixtureB;
            Body    bodyA    = fixtureA.GetBody();
            Body    bodyB    = fixtureB.GetBody();

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

            // Remove from the world.
            m_contactList.Remove(c);

            // Remove from body 1
            c.m_nodeA.other.m_contactList.Remove(c.m_nodeA);

            // Remove from body 2
            c.m_nodeB.other.m_contactList.Remove(c.m_nodeA);

            // Call the factory.
        }
Esempio n. 2
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. 3
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. 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);
            }
        }