Layers.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Jolt/Physics/Collision/ObjectLayer.h>
  5. #include <Jolt/Physics/Collision/BroadPhase/BroadPhaseLayer.h>
  6. /// Layer that objects can be in, determines which other objects it can collide with
  7. namespace Layers
  8. {
  9. static constexpr uint8 NON_MOVING = 0;
  10. static constexpr uint8 MOVING = 1;
  11. static constexpr uint8 NUM_LAYERS = 2;
  12. };
  13. /// Function that determines if two object layers can collide
  14. inline bool ObjectCanCollide(ObjectLayer inObject1, ObjectLayer inObject2)
  15. {
  16. switch (inObject1)
  17. {
  18. case Layers::NON_MOVING:
  19. return inObject2 == Layers::MOVING; // Non moving only collides with moving
  20. case Layers::MOVING:
  21. return true; // Moving collides with everything
  22. default:
  23. JPH_ASSERT(false);
  24. return false;
  25. }
  26. };
  27. /// Broadphase layers
  28. namespace BroadPhaseLayers
  29. {
  30. static constexpr BroadPhaseLayer NON_MOVING(0);
  31. static constexpr BroadPhaseLayer MOVING(1);
  32. static constexpr uint NUM_LAYERS(2);
  33. };
  34. /// BroadPhaseLayerInterface implementation
  35. class BPLayerInterfaceImpl final : public BroadPhaseLayerInterface
  36. {
  37. public:
  38. BPLayerInterfaceImpl()
  39. {
  40. // Create a mapping table from object to broad phase layer
  41. mObjectToBroadPhase[Layers::NON_MOVING] = BroadPhaseLayers::NON_MOVING;
  42. mObjectToBroadPhase[Layers::MOVING] = BroadPhaseLayers::MOVING;
  43. }
  44. virtual uint GetNumBroadPhaseLayers() const override
  45. {
  46. return BroadPhaseLayers::NUM_LAYERS;
  47. }
  48. virtual BroadPhaseLayer GetBroadPhaseLayer(ObjectLayer inLayer) const override
  49. {
  50. JPH_ASSERT(inLayer < Layers::NUM_LAYERS);
  51. return mObjectToBroadPhase[inLayer];
  52. }
  53. #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
  54. virtual const char * GetBroadPhaseLayerName(BroadPhaseLayer inLayer) const override
  55. {
  56. switch ((BroadPhaseLayer::Type)inLayer)
  57. {
  58. case (BroadPhaseLayer::Type)BroadPhaseLayers::NON_MOVING: return "NON_MOVING";
  59. case (BroadPhaseLayer::Type)BroadPhaseLayers::MOVING: return "MOVING";
  60. default: JPH_ASSERT(false); return "INVALID";
  61. }
  62. }
  63. #endif // JPH_EXTERNAL_PROFILE || JPH_PROFILE_ENABLED
  64. private:
  65. BroadPhaseLayer mObjectToBroadPhase[Layers::NUM_LAYERS];
  66. };
  67. /// Function that determines if two broadphase layers can collide
  68. inline bool BroadPhaseCanCollide(ObjectLayer inLayer1, BroadPhaseLayer inLayer2)
  69. {
  70. switch (inLayer1)
  71. {
  72. case Layers::NON_MOVING:
  73. return inLayer2 == BroadPhaseLayers::MOVING;
  74. case Layers::MOVING:
  75. return true;
  76. default:
  77. JPH_ASSERT(false);
  78. return false;
  79. }
  80. }