public b2ContactFeature(b2ContactFeature other) { indexA = other.indexA; indexB = other.indexB; typeA = other.typeA; typeB = other.typeB; }
// Update the contact manifold and touching status. // Note: do not assume the fixture AABBs are overlapping or are valid. public virtual void Update(b2ContactListener listener) { oldManifold.CopyFrom(m_manifold); // Re-enable this contact. Flags |= b2ContactFlags.e_enabledFlag; bool touching = false; bool wasTouching = (Flags & b2ContactFlags.e_touchingFlag) == b2ContactFlags.e_touchingFlag; bool sensor = FixtureA.m_isSensor || FixtureB.m_isSensor; b2Body bodyA = FixtureA.Body; b2Body bodyB = FixtureB.Body; b2Transform xfA = bodyA.Transform; b2Transform xfB = bodyB.Transform; // Is this contact a sensor? if (sensor) { b2Shape shapeA = FixtureA.Shape; b2Shape shapeB = FixtureB.Shape; touching = b2Collision.b2TestOverlap(shapeA, m_indexA, shapeB, m_indexB, ref xfA, ref xfB); // Sensors don't generate manifolds. m_manifold.pointCount = 0; } else { Evaluate(m_manifold, ref xfA, ref xfB); touching = m_manifold.pointCount > 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.pointCount; ++i) { b2ManifoldPoint mp2 = m_manifold.points[i]; mp2.normalImpulse = 0.0f; mp2.tangentImpulse = 0.0f; b2ContactFeature id2 = mp2.id; for (int j = 0; j < oldManifold.pointCount; ++j) { b2ManifoldPoint 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) { Flags |= b2ContactFlags.e_touchingFlag; } else { Flags &= ~b2ContactFlags.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); } }
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(b2ContactFeature obj) { return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr); }