public override float SolveIteration()
{
Vector3 velocityDifference;
Vector3.Subtract(ref connectionB.angularVelocity, ref connectionA.angularVelocity, out velocityDifference);
Vector3 softnessVector;
Vector3.Multiply(ref accumulatedImpulse, softness, out softnessVector);
Vector3 lambda;
Vector3.Add(ref velocityDifference, ref biasVelocity, out lambda);
Vector3.Subtract(ref lambda, ref softnessVector, out lambda);
Matrix3x3.Transform(ref lambda, ref effectiveMassMatrix, out lambda);
Vector3.Add(ref lambda, ref accumulatedImpulse, out accumulatedImpulse);
if (connectionA.isDynamic)
{
connectionA.ApplyAngularImpulse(ref lambda);
}
if (connectionB.isDynamic)
{
Vector3 torqueB;
Vector3.Negate(ref lambda, out torqueB);
connectionB.ApplyAngularImpulse(ref torqueB);
}
return Math.Abs(lambda.X) + Math.Abs(lambda.Y) + Math.Abs(lambda.Z);
}