public override float SolveIteration()
{
//Compute relative velocity. Collisions can occur between an entity and a non-entity. If it's not an entity, assume it's not moving.
float lambda = RelativeVelocity;
lambda *= velocityToImpulse; //convert to impulse
//Clamp accumulated impulse
float previousAccumulatedImpulse = accumulatedImpulse;
float maximumFrictionForce = 0;
for (int i = 0; i < contactCount; i++)
{
maximumFrictionForce += leverArms[i] * contactManifoldConstraint.penetrationConstraints.Elements[i].accumulatedImpulse;
}
maximumFrictionForce *= friction;
accumulatedImpulse = MathHelper.Clamp(accumulatedImpulse + lambda, -maximumFrictionForce, maximumFrictionForce); //instead of maximumFrictionForce, could recompute each iteration...
lambda = accumulatedImpulse - previousAccumulatedImpulse;
//Apply the impulse
#if !WINDOWS
Vector3 angular = new Vector3();
#else
Vector3 angular;
#endif
angular.X = lambda * angularX;
angular.Y = lambda * angularY;
angular.Z = lambda * angularZ;
if (entityADynamic)
{
entityA.ApplyAngularImpulse(ref angular);
}
if (entityBDynamic)
{
angular.X = -angular.X;
angular.Y = -angular.Y;
angular.Z = -angular.Z;
entityB.ApplyAngularImpulse(ref angular);
}
return Math.Abs(lambda);
}