ChangeObjectLayerTest.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <TestFramework.h>
  4. #include <Tests/General/ChangeObjectLayerTest.h>
  5. #include <Layers.h>
  6. #include <Jolt/Physics/Collision/Shape/BoxShape.h>
  7. #include <Jolt/Physics/Body/BodyCreationSettings.h>
  8. JPH_IMPLEMENT_RTTI_VIRTUAL(ChangeObjectLayerTest)
  9. {
  10. JPH_ADD_BASE_CLASS(ChangeObjectLayerTest, Test)
  11. }
  12. void ChangeObjectLayerTest::Initialize()
  13. {
  14. // Floor
  15. CreateFloor();
  16. // A dynamic box in the MOVING layer
  17. mMoving = mBodyInterface->CreateAndAddBody(BodyCreationSettings(new BoxShape(Vec3(5, 0.1f, 5)), Vec3(0, 1.5f, 0), Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING), EActivation::Activate);
  18. // Lots of dynamic objects in the DEBRIS layer
  19. default_random_engine random;
  20. uniform_real_distribution<float> position_variation(-10, 10);
  21. for (int i = 0; i < 50; ++i)
  22. {
  23. Vec3 position(position_variation(random), 2.0f, position_variation(random));
  24. Quat rotation = Quat::sRandom(random);
  25. mDebris.push_back(mBodyInterface->CreateAndAddBody(BodyCreationSettings(new BoxShape(Vec3::sReplicate(0.1f)), position, rotation, EMotionType::Dynamic, Layers::DEBRIS), EActivation::Activate));
  26. }
  27. }
  28. void ChangeObjectLayerTest::PrePhysicsUpdate(const PreUpdateParams &inParams)
  29. {
  30. const float cSwitchTime = 2.0f;
  31. // Increment time
  32. mTime += inParams.mDeltaTime;
  33. if (mTime >= cSwitchTime)
  34. {
  35. mIsDebris = !mIsDebris;
  36. // Reposition moving object
  37. mBodyInterface->SetPosition(mMoving, Vec3(0, 1.5f, 0), EActivation::Activate);
  38. default_random_engine random;
  39. uniform_real_distribution<float> position_variation(-7.5f, 7.5f);
  40. for (BodyID id : mDebris)
  41. {
  42. // Reposition debris
  43. Vec3 position(position_variation(random), 2.0f, position_variation(random));
  44. Quat rotation = Quat::sRandom(random);
  45. mBodyInterface->SetPositionAndRotation(id, position, rotation, EActivation::Activate);
  46. // And update layer
  47. mBodyInterface->SetObjectLayer(id, mIsDebris? Layers::DEBRIS : Layers::MOVING);
  48. }
  49. mTime = 0;
  50. }
  51. }
  52. void ChangeObjectLayerTest::SaveState(StateRecorder &inStream) const
  53. {
  54. inStream.Write(mTime);
  55. inStream.Write(mIsDebris);
  56. }
  57. void ChangeObjectLayerTest::RestoreState(StateRecorder &inStream)
  58. {
  59. inStream.Read(mTime);
  60. inStream.Read(mIsDebris);
  61. // Restore layer
  62. for (BodyID id : mDebris)
  63. mBodyInterface->SetObjectLayer(id, mIsDebris? Layers::DEBRIS : Layers::MOVING);
  64. }