public override void InitVelocityConstraints(SolverData data)
{
Vec2[] d = Pool.GetVec2Array(Bodies.Length);
for (int i = 0; i < Bodies.Length; ++i)
{
int prev = (i == 0) ? Bodies.Length - 1 : i - 1;
int next = (i == Bodies.Length - 1) ? 0 : i + 1;
d[i].Set(Bodies[next].WorldCenter);
d[i].SubLocal(Bodies[prev].WorldCenter);
}
if (data.Step.WarmStarting)
{
m_impulse *= data.Step.DtRatio;
// float lambda = -2.0f * crossMassSum / dotMassSum;
// System.out.println(crossMassSum + " " +dotMassSum);
// lambda = MathUtils.clamp(lambda, -Settings.maxLinearCorrection,
// Settings.maxLinearCorrection);
// m_impulse = lambda;
for (int i = 0; i < Bodies.Length; ++i)
{
Bodies[i].LinearVelocity.X += Bodies[i].InvMass * d[i].Y * .5f * m_impulse;
Bodies[i].LinearVelocity.Y += Bodies[i].InvMass * (-d[i].X) * .5f * m_impulse;
}
}
else
{
m_impulse = 0.0f;
}
}