internal void PreStep(float dt)
{
Matrix.CreateFromAxisAngle(ref suspension.localDirection, shape.steeringAngle, out shape.steeringTransform);
//Matrix.TransformNormal(ref localForwardDirection, ref shape.steeringTransform, out worldForwardDirection);
Vector3.Transform(ref localForwardDirection, ref shape.steeringTransform, out worldForwardDirection);
Matrix3x3.Transform(ref worldForwardDirection, ref Vehicle.Body.orientationMatrix, out worldForwardDirection);
if (HasSupport)
{
Vector3.Subtract(ref supportLocation, ref Vehicle.Body.position, out ra);
if (supportingEntity != null)
{
Vector3.Subtract(ref supportLocation, ref SupportingEntity.position, out rb);
}
//Mind the order of updating! sliding friction must come before driving force or rolling friction
//because it computes the sliding direction.
suspension.isActive = true;
suspension.numIterationsAtZeroImpulse = 0;
suspension.solverSettings.currentIterations = 0;
slidingFriction.isActive = true;
slidingFriction.numIterationsAtZeroImpulse = 0;
slidingFriction.solverSettings.currentIterations = 0;
drivingMotor.isActive = true;
drivingMotor.numIterationsAtZeroImpulse = 0;
drivingMotor.solverSettings.currentIterations = 0;
brake.isActive = true;
brake.numIterationsAtZeroImpulse = 0;
brake.solverSettings.currentIterations = 0;
suspension.PreStep(dt);
slidingFriction.PreStep(dt);
drivingMotor.PreStep(dt);
brake.PreStep(dt);
}
else
{
//No support, don't need any solving.
suspension.isActive = false;
slidingFriction.isActive = false;
drivingMotor.isActive = false;
brake.isActive = false;
suspension.accumulatedImpulse = 0;
slidingFriction.accumulatedImpulse = 0;
drivingMotor.accumulatedImpulse = 0;
brake.accumulatedImpulse = 0;
}
}