BroadPhaseTest.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <TestFramework.h>
  4. #include <Tests/BroadPhase/BroadPhaseTest.h>
  5. #include <Jolt/Physics/Collision/Shape/BoxShape.h>
  6. #include <Jolt/Physics/Body/BodyCreationSettings.h>
  7. #include <Jolt/Physics/Collision/BroadPhase/BroadPhaseBruteForce.h>
  8. #include <Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.h>
  9. #include <random>
  10. JPH_IMPLEMENT_RTTI_ABSTRACT(BroadPhaseTest)
  11. {
  12. JPH_ADD_BASE_CLASS(BroadPhaseTest, Test)
  13. }
  14. #define NUM_BODIES 10000
  15. //#define BROAD_PHASE BroadPhaseBruteForce()
  16. #define BROAD_PHASE BroadPhaseQuadTree()
  17. BroadPhaseTest::~BroadPhaseTest()
  18. {
  19. delete mBroadPhase;
  20. delete mBodyManager;
  21. }
  22. void BroadPhaseTest::CreateBalancedDistribution(BodyManager *inBodyManager, int inNumBodies, float inEnvironmentSize)
  23. {
  24. default_random_engine random(0x1ee7c0de);
  25. uniform_real_distribution<float> zero_to_one(0.0f, 1.0f);
  26. float n = float(inNumBodies);
  27. Vec3 max_box_start = Vec3::sReplicate(inEnvironmentSize * (1.0f - pow(n, -1.0f / 3.0f)));
  28. Vec3 min_box_size = Vec3::sReplicate(1.0f / inEnvironmentSize);
  29. Vec3 max_box_size = Vec3::sReplicate(inEnvironmentSize * pow(n, -1.0f / 3.0f)) - min_box_size;
  30. for (int b = 0; b < inNumBodies; ++b)
  31. {
  32. AABox box;
  33. box.mMin = max_box_start * Vec3(zero_to_one(random), zero_to_one(random), zero_to_one(random)) - Vec3::sReplicate(0.5f * inEnvironmentSize);
  34. box.mMax = box.mMin + min_box_size + max_box_size * Vec3(zero_to_one(random), zero_to_one(random), zero_to_one(random));
  35. BodyCreationSettings s;
  36. s.SetShape(new BoxShape(box.GetExtent(), 0.0f));
  37. s.mPosition = box.GetCenter();
  38. s.mRotation = Quat::sIdentity();
  39. s.mObjectLayer = (random() % 10) == 0? Layers::MOVING : Layers::NON_MOVING;
  40. Body *body = inBodyManager->AllocateBody(s);
  41. inBodyManager->AddBody(body);
  42. }
  43. }
  44. void BroadPhaseTest::Initialize()
  45. {
  46. // Create body manager
  47. mBodyManager = new BodyManager();
  48. mBodyManager->Init(NUM_BODIES, 0, mBroadPhaseLayerInterface);
  49. // Crate broadphase
  50. mBroadPhase = new BROAD_PHASE;
  51. mBroadPhase->Init(mBodyManager, mBroadPhaseLayerInterface);
  52. }
  53. void BroadPhaseTest::PostPhysicsUpdate(float inDeltaTime)
  54. {
  55. #ifdef JPH_DEBUG_RENDERER
  56. mBodyManager->Draw(BodyManager::DrawSettings(), PhysicsSettings(), mDebugRenderer);
  57. #endif // JPH_DEBUG_RENDERER
  58. }