BroadPhaseCastRayTest.cpp 1.9 KB

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