BroadPhaseCastRayTest.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <TestFramework.h>
  4. #include <Tests/BroadPhase/BroadPhaseCastRayTest.h>
  5. #include <Jolt/Physics/Collision/RayCast.h>
  6. #include <Jolt/Physics/Collision/CastResult.h>
  7. #include <Jolt/Physics/Collision/CollisionCollectorImpl.h>
  8. #include <Renderer/DebugRendererImp.h>
  9. #include <random>
  10. JPH_IMPLEMENT_RTTI_VIRTUAL(BroadPhaseCastRayTest)
  11. {
  12. JPH_ADD_BASE_CLASS(BroadPhaseCastRayTest, BroadPhaseTest)
  13. }
  14. void BroadPhaseCastRayTest::Initialize()
  15. {
  16. BroadPhaseTest::Initialize();
  17. int num_bodies = int(mBodyManager->GetMaxBodies());
  18. // Create random boxes
  19. CreateBalancedDistribution(mBodyManager, num_bodies);
  20. // Add all bodies to the broadphase
  21. Body **body_vector = mBodyManager->GetBodies().data();
  22. BodyID *bodies_to_add = new BodyID [num_bodies];
  23. for (int b = 0; b < num_bodies; ++b)
  24. bodies_to_add[b] = body_vector[b]->GetID();
  25. BroadPhase::AddState add_state = mBroadPhase->AddBodiesPrepare(bodies_to_add, num_bodies);
  26. mBroadPhase->AddBodiesFinalize(bodies_to_add, num_bodies, add_state);
  27. delete [] bodies_to_add;
  28. // Optimize the broadphase
  29. mBroadPhase->Optimize();
  30. }
  31. void BroadPhaseCastRayTest::PrePhysicsUpdate(const PreUpdateParams &inParams)
  32. {
  33. // Create ray
  34. default_random_engine random;
  35. Vec3 from = 1000.0f * Vec3::sRandom(random);
  36. RayCast ray { from, -2.0f * from };
  37. // Raycast before update
  38. AllHitCollisionCollector<RayCastBodyCollector> collector;
  39. mBroadPhase->CastRay(ray, collector);
  40. int num_hits = (int)collector.mHits.size();
  41. BroadPhaseCastResult *results = collector.mHits.data();
  42. // Draw results
  43. for (int i = 0; i < num_hits; ++i)
  44. mDebugRenderer->DrawMarker(ray.mOrigin + results[i].mFraction * ray.mDirection, Color::sGreen, 10.0f);
  45. mDebugRenderer->DrawLine(ray.mOrigin, ray.mOrigin + ray.mDirection, Color::sRed);
  46. }