/// <summary>
/// This resets the mass properties to the sum of the mass properties of the fixtures. This
/// normally does not need to be called unless you called setMassData to override the mass and you
/// later want to reset the mass.
/// </summary>
public void ResetMassData()
{
// Compute mass data from shapes. Each shape has its own density.
Mass = 0.0f;
InvMass = 0.0f;
I = 0.0f;
InvI = 0.0f;
Sweep.LocalCenter.SetZero();
// Static and kinematic bodies have zero mass.
if (m_type == BodyType.Static || m_type == BodyType.Kinematic)
{
// m_sweep.c0 = m_sweep.c = m_xf.position;
Sweep.C0.Set(Xf.P);
Sweep.C.Set(Xf.P);
Sweep.A0 = Sweep.A;
return;
}
Debug.Assert(m_type == BodyType.Dynamic);
// Accumulate mass over all fixtures.
Vec2 localCenter = World.Pool.PopVec2();
localCenter.SetZero();
Vec2 temp = World.Pool.PopVec2();
MassData massData = pmd;
for (Fixture f = FixtureList; f != null; f = f.Next)
{
if (f.Density == 0.0f)
{
continue;
}
f.GetMassData(massData);
Mass += massData.Mass;
// center += massData.mass * massData.center;
temp.Set(massData.Center).MulLocal(massData.Mass);
localCenter.AddLocal(temp);
I += massData.I;
}
// Compute center of mass.
if (Mass > 0.0f)
{
InvMass = 1.0f / Mass;
localCenter.MulLocal(InvMass);
}
else
{
// Force all dynamic bodies to have a positive mass.
Mass = 1.0f;
InvMass = 1.0f;
}
if (I > 0.0f && (Flags & TypeFlags.FixedRotation) == 0)
{
// Center the inertia about the center of mass.
I -= Mass * Vec2.Dot(localCenter, localCenter);
Debug.Assert(I > 0.0f);
InvI = 1.0f / I;
}
else
{
I = 0.0f;
InvI = 0.0f;
}
Vec2 oldCenter = World.Pool.PopVec2();
// Move center of mass.
oldCenter.Set(Sweep.C);
Sweep.LocalCenter.Set(localCenter);
// m_sweep.c0 = m_sweep.c = Mul(m_xf, m_sweep.localCenter);
Transform.MulToOutUnsafe(Xf, Sweep.LocalCenter, Sweep.C0);
Sweep.C.Set(Sweep.C0);
// Update center of mass velocity.
// m_linearVelocity += Cross(m_angularVelocity, m_sweep.c - oldCenter);
temp.Set(Sweep.C).SubLocal(oldCenter);
Vec2 temp2 = oldCenter;
Vec2.CrossToOutUnsafe(m_angularVelocity, temp, temp2);
m_linearVelocity.AddLocal(temp2);
World.Pool.PushVec2(3);
}