PhysicsStepListenerTests.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include "UnitTestFramework.h"
  5. #include "PhysicsTestContext.h"
  6. #include "Layers.h"
  7. #include <Jolt/Physics/PhysicsStepListener.h>
  8. TEST_SUITE("StepListenerTest")
  9. {
  10. // Custom step listener that keeps track how often it has been called
  11. class TestStepListener : public PhysicsStepListener
  12. {
  13. public:
  14. virtual void OnStep(float inDeltaTime, PhysicsSystem &inPhysicsSystem) override
  15. {
  16. CHECK(inDeltaTime == mExpectedDeltaTime);
  17. ++mCount;
  18. }
  19. atomic<int> mCount = 0;
  20. float mExpectedDeltaTime = 0.0f;
  21. };
  22. // Perform the actual listener test with a variable amount of collision steps
  23. static void DoTest(int inCollisionSteps)
  24. {
  25. PhysicsTestContext c(1.0f / 60.0f, inCollisionSteps);
  26. // Initialize and add listeners
  27. TestStepListener listeners[10];
  28. for (TestStepListener &l : listeners)
  29. l.mExpectedDeltaTime = 1.0f / 60.0f / inCollisionSteps;
  30. for (TestStepListener &l : listeners)
  31. c.GetSystem()->AddStepListener(&l);
  32. // Step the simulation
  33. c.SimulateSingleStep();
  34. // There aren't any active bodies so no listeners should have been called
  35. for (TestStepListener &l : listeners)
  36. CHECK(l.mCount == 0);
  37. // Now add an active body
  38. c.CreateBox(RVec3::sZero(), Quat::sIdentity(), EMotionType::Dynamic, EMotionQuality::Discrete, Layers::MOVING, Vec3::sReplicate(1.0f));
  39. // Step the simulation
  40. c.SimulateSingleStep();
  41. for (TestStepListener &l : listeners)
  42. CHECK(l.mCount == inCollisionSteps);
  43. // Step the simulation
  44. c.SimulateSingleStep();
  45. for (TestStepListener &l : listeners)
  46. CHECK(l.mCount == 2 * inCollisionSteps);
  47. // Unregister all listeners
  48. for (TestStepListener &l : listeners)
  49. c.GetSystem()->RemoveStepListener(&l);
  50. }
  51. // Test the step listeners with a single collision step
  52. TEST_CASE("TestStepListener1")
  53. {
  54. DoTest(1);
  55. }
  56. // Test the step listeners with two collision steps
  57. TEST_CASE("TestStepListener2")
  58. {
  59. DoTest(2);
  60. }
  61. }