Layers.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. #include <Jolt/Physics/Collision/ObjectLayer.h>
  6. #include <Jolt/Physics/Collision/BroadPhase/BroadPhaseLayer.h>
  7. /// Layer that objects can be in, determines which other objects it can collide with
  8. namespace Layers
  9. {
  10. static constexpr ObjectLayer UNUSED1 = 0; // 5 unused values so that broadphase layers values don't match with object layer values (for testing purposes)
  11. static constexpr ObjectLayer UNUSED2 = 1;
  12. static constexpr ObjectLayer UNUSED3 = 2;
  13. static constexpr ObjectLayer UNUSED4 = 3;
  14. static constexpr ObjectLayer UNUSED5 = 4;
  15. static constexpr ObjectLayer NON_MOVING = 5;
  16. static constexpr ObjectLayer MOVING = 6;
  17. static constexpr ObjectLayer HQ_DEBRIS = 7; // High quality debris collides with MOVING and NON_MOVING but not with any debris
  18. static constexpr ObjectLayer LQ_DEBRIS = 8; // Low quality debris only collides with NON_MOVING
  19. static constexpr ObjectLayer SENSOR = 9; // Sensors only collide with MOVING objects
  20. static constexpr ObjectLayer NUM_LAYERS = 10;
  21. };
  22. /// Class that determines if two object layers can collide
  23. class ObjectLayerPairFilterImpl : public ObjectLayerPairFilter
  24. {
  25. public:
  26. virtual bool ShouldCollide(ObjectLayer inObject1, ObjectLayer inObject2) const override
  27. {
  28. switch (inObject1)
  29. {
  30. case Layers::UNUSED1:
  31. case Layers::UNUSED2:
  32. case Layers::UNUSED3:
  33. case Layers::UNUSED4:
  34. case Layers::UNUSED5:
  35. return false;
  36. case Layers::NON_MOVING:
  37. return inObject2 == Layers::MOVING || inObject2 == Layers::HQ_DEBRIS || inObject2 == Layers::LQ_DEBRIS;
  38. case Layers::MOVING:
  39. return inObject2 == Layers::NON_MOVING || inObject2 == Layers::MOVING || inObject2 == Layers::HQ_DEBRIS || inObject2 == Layers::SENSOR;
  40. case Layers::HQ_DEBRIS:
  41. return inObject2 == Layers::NON_MOVING || inObject2 == Layers::MOVING;
  42. case Layers::LQ_DEBRIS:
  43. return inObject2 == Layers::NON_MOVING;
  44. case Layers::SENSOR:
  45. return inObject2 == Layers::MOVING;
  46. default:
  47. JPH_ASSERT(false);
  48. return false;
  49. }
  50. }
  51. };
  52. /// Broadphase layers
  53. namespace BroadPhaseLayers
  54. {
  55. static constexpr BroadPhaseLayer NON_MOVING(0);
  56. static constexpr BroadPhaseLayer MOVING(1);
  57. static constexpr BroadPhaseLayer LQ_DEBRIS(2);
  58. static constexpr BroadPhaseLayer UNUSED(3);
  59. static constexpr BroadPhaseLayer SENSOR(4);
  60. static constexpr uint NUM_LAYERS(5);
  61. };
  62. /// BroadPhaseLayerInterface implementation
  63. class BPLayerInterfaceImpl final : public BroadPhaseLayerInterface
  64. {
  65. public:
  66. BPLayerInterfaceImpl()
  67. {
  68. // Create a mapping table from object to broad phase layer
  69. mObjectToBroadPhase[Layers::UNUSED1] = BroadPhaseLayers::UNUSED;
  70. mObjectToBroadPhase[Layers::UNUSED2] = BroadPhaseLayers::UNUSED;
  71. mObjectToBroadPhase[Layers::UNUSED3] = BroadPhaseLayers::UNUSED;
  72. mObjectToBroadPhase[Layers::UNUSED4] = BroadPhaseLayers::UNUSED;
  73. mObjectToBroadPhase[Layers::UNUSED5] = BroadPhaseLayers::UNUSED;
  74. mObjectToBroadPhase[Layers::NON_MOVING] = BroadPhaseLayers::NON_MOVING;
  75. mObjectToBroadPhase[Layers::MOVING] = BroadPhaseLayers::MOVING;
  76. mObjectToBroadPhase[Layers::HQ_DEBRIS] = BroadPhaseLayers::MOVING; // HQ_DEBRIS is also in the MOVING layer as an example on how to map multiple layers onto the same broadphase layer
  77. mObjectToBroadPhase[Layers::LQ_DEBRIS] = BroadPhaseLayers::LQ_DEBRIS;
  78. mObjectToBroadPhase[Layers::SENSOR] = BroadPhaseLayers::SENSOR;
  79. }
  80. virtual uint GetNumBroadPhaseLayers() const override
  81. {
  82. return BroadPhaseLayers::NUM_LAYERS;
  83. }
  84. virtual BroadPhaseLayer GetBroadPhaseLayer(ObjectLayer inLayer) const override
  85. {
  86. JPH_ASSERT(inLayer < Layers::NUM_LAYERS);
  87. return mObjectToBroadPhase[inLayer];
  88. }
  89. #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
  90. virtual const char * GetBroadPhaseLayerName(BroadPhaseLayer inLayer) const override
  91. {
  92. switch ((BroadPhaseLayer::Type)inLayer)
  93. {
  94. case (BroadPhaseLayer::Type)BroadPhaseLayers::NON_MOVING: return "NON_MOVING";
  95. case (BroadPhaseLayer::Type)BroadPhaseLayers::MOVING: return "MOVING";
  96. case (BroadPhaseLayer::Type)BroadPhaseLayers::LQ_DEBRIS: return "LQ_DEBRIS";
  97. case (BroadPhaseLayer::Type)BroadPhaseLayers::UNUSED: return "UNUSED";
  98. case (BroadPhaseLayer::Type)BroadPhaseLayers::SENSOR: return "SENSOR";
  99. default: JPH_ASSERT(false); return "INVALID";
  100. }
  101. }
  102. #endif // JPH_EXTERNAL_PROFILE || JPH_PROFILE_ENABLED
  103. private:
  104. BroadPhaseLayer mObjectToBroadPhase[Layers::NUM_LAYERS];
  105. };
  106. /// Class that determines if an object layer can collide with a broadphase layer
  107. class ObjectVsBroadPhaseLayerFilterImpl : public ObjectVsBroadPhaseLayerFilter
  108. {
  109. public:
  110. virtual bool ShouldCollide(ObjectLayer inLayer1, BroadPhaseLayer inLayer2) const override
  111. {
  112. switch (inLayer1)
  113. {
  114. case Layers::NON_MOVING:
  115. return inLayer2 == BroadPhaseLayers::MOVING;
  116. case Layers::MOVING:
  117. case Layers::HQ_DEBRIS:
  118. return inLayer2 == BroadPhaseLayers::NON_MOVING || inLayer2 == BroadPhaseLayers::MOVING || inLayer2 == BroadPhaseLayers::SENSOR;
  119. case Layers::LQ_DEBRIS:
  120. return inLayer2 == BroadPhaseLayers::NON_MOVING;
  121. case Layers::SENSOR:
  122. return inLayer2 == BroadPhaseLayers::MOVING;
  123. case Layers::UNUSED1:
  124. case Layers::UNUSED2:
  125. case Layers::UNUSED3:
  126. case Layers::UNUSED4:
  127. case Layers::UNUSED5:
  128. return false;
  129. default:
  130. JPH_ASSERT(false);
  131. return false;
  132. }
  133. }
  134. };