public override void Evaluate(ContactListener listener)
{
Body b1 = _shape1.GetBody();
Body b2 = _shape2.GetBody();
#warning "needfix"
//memcpy(&m0, &m_manifold, sizeof(b2Manifold));
Manifold m0 = _manifold.Clone();
Collision.Collision.CollidePolygonAndCircle(ref _manifold, (PolygonShape)_shape1, b1.GetXForm(),
(CircleShape)_shape2, b2.GetXForm());
bool[] persisted = new bool[] { false, false };
ContactPoint cp = new ContactPoint();
cp.Shape1 = _shape1;
cp.Shape2 = _shape2;
cp.Friction = Settings.MixFriction(_shape1.Friction, _shape2.Friction);
cp.Restitution = Settings.MixRestitution(_shape1.Restitution, _shape2.Restitution);
// Match contact ids to facilitate warm starting.
if (_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 < _manifold.PointCount; ++i)
{
ManifoldPoint mp = _manifold.Points[i];
mp.NormalImpulse = 0.0f;
mp.TangentImpulse = 0.0f;
bool found = false;
ContactID id = mp.ID;
for (int j = 0; j < m0.PointCount; ++j)
{
if (persisted[j] == true)
{
continue;
}
ManifoldPoint mp0 = m0.Points[j];
if (mp0.ID.Key == id.Key)
{
persisted[j] = true;
mp.NormalImpulse = mp0.NormalImpulse;
mp.TangentImpulse = mp0.TangentImpulse;
// A persistent point.
found = true;
// Report persistent point.
if (listener != null)
{
cp.Position = b1.GetWorldPoint(mp.LocalPoint1);
Vec2 v1 = b1.GetLinearVelocityFromLocalPoint(mp.LocalPoint1);
Vec2 v2 = b2.GetLinearVelocityFromLocalPoint(mp.LocalPoint2);
cp.Velocity = v2 - v1;
cp.Normal = _manifold.Normal;
cp.Separation = mp.Separation;
cp.ID = id;
listener.Persist(cp);
}
break;
}
}
// Report added point.
if (found == false && listener != null)
{
cp.Position = b1.GetWorldPoint(mp.LocalPoint1);
Vec2 v1 = b1.GetLinearVelocityFromLocalPoint(mp.LocalPoint1);
Vec2 v2 = b2.GetLinearVelocityFromLocalPoint(mp.LocalPoint2);
cp.Velocity = v2 - v1;
cp.Normal = _manifold.Normal;
cp.Separation = mp.Separation;
cp.ID = id;
listener.Add(cp);
}
}
_manifoldCount = 1;
}
else
{
_manifoldCount = 0;
}
if (listener == null)
{
return;
}
// Report removed points.
for (int i = 0; i < m0.PointCount; ++i)
{
if (persisted[i])
{
continue;
}
ManifoldPoint mp0 = m0.Points[i];
cp.Position = b1.GetWorldPoint(mp0.LocalPoint1);
Vec2 v1 = b1.GetLinearVelocityFromLocalPoint(mp0.LocalPoint1);
Vec2 v2 = b2.GetLinearVelocityFromLocalPoint(mp0.LocalPoint2);
cp.Velocity = v2 - v1;
cp.Normal = m0.Normal;
cp.Separation = mp0.Separation;
cp.ID = mp0.ID;
listener.Remove(cp);
}
}