internal override bool solvePositionConstraints( ref SolverData data )
{
Vector2 cA = data.positions[_indexA].c;
float aA = data.positions[_indexA].a;
Vector2 cB = data.positions[_indexB].c;
float aB = data.positions[_indexB].a;
Rot qA = new Rot( aA ), qB = new Rot( aB );
Vector2 rA = MathUtils.mul( qA, localAnchorA - _localCenterA );
Vector2 rB = MathUtils.mul( qB, localAnchorB - _localCenterB );
Vector2 u = cB + rB - cA - rA;
float length = u.Length(); u.Normalize();
float C = length - maxLength;
C = MathUtils.clamp( C, 0.0f, Settings.maxLinearCorrection );
float impulse = -_mass * C;
Vector2 P = impulse * u;
cA -= _invMassA * P;
aA -= _invIA * MathUtils.cross( rA, P );
cB += _invMassB * P;
aB += _invIB * MathUtils.cross( rB, P );
data.positions[_indexA].c = cA;
data.positions[_indexA].a = aA;
data.positions[_indexB].c = cB;
data.positions[_indexB].a = aB;
return length - maxLength < Settings.linearSlop;
}