CalculateSolverSteps.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2023 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. #include <Jolt/Physics/PhysicsSettings.h>
  6. JPH_NAMESPACE_BEGIN
  7. /// Class used to calculate the total number of velocity and position steps
  8. class CalculateSolverSteps
  9. {
  10. public:
  11. /// Constructor
  12. JPH_INLINE explicit CalculateSolverSteps(const PhysicsSettings &inSettings) : mSettings(inSettings) { }
  13. /// Combine the number of velocity and position steps for this body/constraint with the current values
  14. template <class Type>
  15. JPH_INLINE void operator () (const Type *inObject)
  16. {
  17. uint num_velocity_steps = inObject->GetNumVelocityStepsOverride();
  18. mNumVelocitySteps = max(mNumVelocitySteps, num_velocity_steps);
  19. mApplyDefaultVelocity |= num_velocity_steps == 0;
  20. uint num_position_steps = inObject->GetNumPositionStepsOverride();
  21. mNumPositionSteps = max(mNumPositionSteps, num_position_steps);
  22. mApplyDefaultPosition |= num_position_steps == 0;
  23. }
  24. /// Must be called after all bodies/constraints have been processed
  25. JPH_INLINE void Finalize()
  26. {
  27. // If we have a default velocity/position step count, take the max of the default and the overrides
  28. if (mApplyDefaultVelocity)
  29. mNumVelocitySteps = max(mNumVelocitySteps, mSettings.mNumVelocitySteps);
  30. if (mApplyDefaultPosition)
  31. mNumPositionSteps = max(mNumPositionSteps, mSettings.mNumPositionSteps);
  32. }
  33. /// Get the results of the calculation
  34. JPH_INLINE uint GetNumPositionSteps() const { return mNumPositionSteps; }
  35. JPH_INLINE uint GetNumVelocitySteps() const { return mNumVelocitySteps; }
  36. private:
  37. const PhysicsSettings & mSettings;
  38. uint mNumVelocitySteps = 0;
  39. uint mNumPositionSteps = 0;
  40. bool mApplyDefaultVelocity = false;
  41. bool mApplyDefaultPosition = false;
  42. };
  43. /// Dummy class to replace the steps calculator when we don't need the result
  44. class DummyCalculateSolverSteps
  45. {
  46. public:
  47. template <class Type>
  48. JPH_INLINE void operator () (const Type *) const
  49. {
  50. /* Nothing to do */
  51. }
  52. };
  53. JPH_NAMESPACE_END