/// <summary> /// Applies impulses and returns whether or not this wheel should be updated more. /// </summary> /// <returns>Whether not the wheel is done updating for the frame.</returns> 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); }