internal bool ApplyImpulse()
{
int numActiveConstraints = 0;
if (suspension.isActive)
{
if (++suspension.solverSettings.currentIterations <= suspension.solverSettings.maximumIterations)
if (Math.Abs(suspension.ApplyImpulse()) < suspension.solverSettings.minimumImpulse)
{
suspension.numIterationsAtZeroImpulse++;
if (suspension.numIterationsAtZeroImpulse > suspension.solverSettings.minimumIterations)
suspension.isActive = false;
else
{
numActiveConstraints++;
suspension.numIterationsAtZeroImpulse = 0;
}
}
else
{
numActiveConstraints++;
suspension.numIterationsAtZeroImpulse = 0;
}
else
suspension.isActive = false;
}
if (slidingFriction.isActive)
{
if (++slidingFriction.solverSettings.currentIterations <= suspension.solverSettings.maximumIterations)
if (Math.Abs(slidingFriction.ApplyImpulse()) < slidingFriction.solverSettings.minimumImpulse)
{
slidingFriction.numIterationsAtZeroImpulse++;
if (slidingFriction.numIterationsAtZeroImpulse > slidingFriction.solverSettings.minimumIterations)
slidingFriction.isActive = false;
else
{
numActiveConstraints++;
slidingFriction.numIterationsAtZeroImpulse = 0;
}
}
else
{
numActiveConstraints++;
slidingFriction.numIterationsAtZeroImpulse = 0;
}
else
slidingFriction.isActive = false;
}
if (drivingMotor.isActive)
{
if (++drivingMotor.solverSettings.currentIterations <= suspension.solverSettings.maximumIterations)
if (Math.Abs(drivingMotor.ApplyImpulse()) < drivingMotor.solverSettings.minimumImpulse)
{
drivingMotor.numIterationsAtZeroImpulse++;
if (drivingMotor.numIterationsAtZeroImpulse > drivingMotor.solverSettings.minimumIterations)
drivingMotor.isActive = false;
else
{
numActiveConstraints++;
drivingMotor.numIterationsAtZeroImpulse = 0;
}
}
else
{
numActiveConstraints++;
drivingMotor.numIterationsAtZeroImpulse = 0;
}
else
drivingMotor.isActive = false;
}
if (brake.isActive)
{
if (++brake.solverSettings.currentIterations <= suspension.solverSettings.maximumIterations)
if (Math.Abs(brake.ApplyImpulse()) < brake.solverSettings.minimumImpulse)
{
brake.numIterationsAtZeroImpulse++;
if (brake.numIterationsAtZeroImpulse > brake.solverSettings.minimumIterations)
brake.isActive = false;
else
{
numActiveConstraints++;
brake.numIterationsAtZeroImpulse = 0;
}
}
else
{
numActiveConstraints++;
brake.numIterationsAtZeroImpulse = 0;
}
else
brake.isActive = false;
}
return numActiveConstraints > 0;
}