Layers.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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 MOVING2 = 7; // Another moving layer that acts as MOVING but doesn't collide with MOVING
  18. static constexpr ObjectLayer HQ_DEBRIS = 8; // High quality debris collides with MOVING and NON_MOVING but not with any debris
  19. static constexpr ObjectLayer LQ_DEBRIS = 9; // Low quality debris only collides with NON_MOVING
  20. static constexpr ObjectLayer SENSOR = 10; // Sensors only collide with MOVING objects
  21. static constexpr ObjectLayer NUM_LAYERS = 11;
  22. };
  23. /// Class that determines if two object layers can collide
  24. class ObjectLayerPairFilterImpl : public ObjectLayerPairFilter
  25. {
  26. public:
  27. virtual bool ShouldCollide(ObjectLayer inObject1, ObjectLayer inObject2) const override
  28. {
  29. switch (inObject1)
  30. {
  31. case Layers::UNUSED1:
  32. case Layers::UNUSED2:
  33. case Layers::UNUSED3:
  34. case Layers::UNUSED4:
  35. case Layers::UNUSED5:
  36. return false;
  37. case Layers::NON_MOVING:
  38. return inObject2 == Layers::MOVING || inObject2 == Layers::MOVING2 || inObject2 == Layers::HQ_DEBRIS || inObject2 == Layers::LQ_DEBRIS;
  39. case Layers::MOVING:
  40. return inObject2 == Layers::NON_MOVING || inObject2 == Layers::MOVING || inObject2 == Layers::HQ_DEBRIS || inObject2 == Layers::SENSOR;
  41. case Layers::MOVING2:
  42. return inObject2 == Layers::NON_MOVING || inObject2 == Layers::MOVING2 || inObject2 == Layers::HQ_DEBRIS || inObject2 == Layers::SENSOR;
  43. case Layers::HQ_DEBRIS:
  44. return inObject2 == Layers::NON_MOVING || inObject2 == Layers::MOVING || inObject2 == Layers::MOVING2;
  45. case Layers::LQ_DEBRIS:
  46. return inObject2 == Layers::NON_MOVING;
  47. case Layers::SENSOR:
  48. return inObject2 == Layers::MOVING || inObject2 == Layers::MOVING2;
  49. default:
  50. JPH_ASSERT(false);
  51. return false;
  52. }
  53. }
  54. };
  55. /// Broadphase layers
  56. namespace BroadPhaseLayers
  57. {
  58. static constexpr BroadPhaseLayer NON_MOVING(0);
  59. static constexpr BroadPhaseLayer MOVING(1);
  60. static constexpr BroadPhaseLayer MOVING2(2);
  61. static constexpr BroadPhaseLayer LQ_DEBRIS(3);
  62. static constexpr BroadPhaseLayer UNUSED(4);
  63. static constexpr BroadPhaseLayer SENSOR(5);
  64. static constexpr uint NUM_LAYERS(6);
  65. };
  66. /// BroadPhaseLayerInterface implementation
  67. class BPLayerInterfaceImpl final : public BroadPhaseLayerInterface
  68. {
  69. public:
  70. BPLayerInterfaceImpl()
  71. {
  72. // Create a mapping table from object to broad phase layer
  73. mObjectToBroadPhase[Layers::UNUSED1] = BroadPhaseLayers::UNUSED;
  74. mObjectToBroadPhase[Layers::UNUSED2] = BroadPhaseLayers::UNUSED;
  75. mObjectToBroadPhase[Layers::UNUSED3] = BroadPhaseLayers::UNUSED;
  76. mObjectToBroadPhase[Layers::UNUSED4] = BroadPhaseLayers::UNUSED;
  77. mObjectToBroadPhase[Layers::UNUSED5] = BroadPhaseLayers::UNUSED;
  78. mObjectToBroadPhase[Layers::NON_MOVING] = BroadPhaseLayers::NON_MOVING;
  79. mObjectToBroadPhase[Layers::MOVING] = BroadPhaseLayers::MOVING;
  80. mObjectToBroadPhase[Layers::MOVING2] = BroadPhaseLayers::MOVING2;
  81. 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
  82. mObjectToBroadPhase[Layers::LQ_DEBRIS] = BroadPhaseLayers::LQ_DEBRIS;
  83. mObjectToBroadPhase[Layers::SENSOR] = BroadPhaseLayers::SENSOR;
  84. }
  85. virtual uint GetNumBroadPhaseLayers() const override
  86. {
  87. return BroadPhaseLayers::NUM_LAYERS;
  88. }
  89. virtual BroadPhaseLayer GetBroadPhaseLayer(ObjectLayer inLayer) const override
  90. {
  91. JPH_ASSERT(inLayer < Layers::NUM_LAYERS);
  92. return mObjectToBroadPhase[inLayer];
  93. }
  94. #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
  95. virtual const char * GetBroadPhaseLayerName(BroadPhaseLayer inLayer) const override
  96. {
  97. switch ((BroadPhaseLayer::Type)inLayer)
  98. {
  99. case (BroadPhaseLayer::Type)BroadPhaseLayers::NON_MOVING: return "NON_MOVING";
  100. case (BroadPhaseLayer::Type)BroadPhaseLayers::MOVING: return "MOVING";
  101. case (BroadPhaseLayer::Type)BroadPhaseLayers::MOVING2: return "MOVING2";
  102. case (BroadPhaseLayer::Type)BroadPhaseLayers::LQ_DEBRIS: return "LQ_DEBRIS";
  103. case (BroadPhaseLayer::Type)BroadPhaseLayers::UNUSED: return "UNUSED";
  104. case (BroadPhaseLayer::Type)BroadPhaseLayers::SENSOR: return "SENSOR";
  105. default: JPH_ASSERT(false); return "INVALID";
  106. }
  107. }
  108. #endif // JPH_EXTERNAL_PROFILE || JPH_PROFILE_ENABLED
  109. private:
  110. BroadPhaseLayer mObjectToBroadPhase[Layers::NUM_LAYERS];
  111. };
  112. /// Class that determines if an object layer can collide with a broadphase layer
  113. class ObjectVsBroadPhaseLayerFilterImpl : public ObjectVsBroadPhaseLayerFilter
  114. {
  115. public:
  116. virtual bool ShouldCollide(ObjectLayer inLayer1, BroadPhaseLayer inLayer2) const override
  117. {
  118. switch (inLayer1)
  119. {
  120. case Layers::NON_MOVING:
  121. return inLayer2 == BroadPhaseLayers::MOVING;
  122. case Layers::MOVING:
  123. case Layers::HQ_DEBRIS:
  124. return inLayer2 == BroadPhaseLayers::NON_MOVING || inLayer2 == BroadPhaseLayers::MOVING || inLayer2 == BroadPhaseLayers::SENSOR;
  125. case Layers::MOVING2:
  126. return inLayer2 == BroadPhaseLayers::NON_MOVING || inLayer2 == BroadPhaseLayers::MOVING2 || inLayer2 == BroadPhaseLayers::SENSOR;
  127. case Layers::LQ_DEBRIS:
  128. return inLayer2 == BroadPhaseLayers::NON_MOVING;
  129. case Layers::SENSOR:
  130. return inLayer2 == BroadPhaseLayers::MOVING;
  131. case Layers::UNUSED1:
  132. case Layers::UNUSED2:
  133. case Layers::UNUSED3:
  134. case Layers::UNUSED4:
  135. case Layers::UNUSED5:
  136. return false;
  137. default:
  138. JPH_ASSERT(false);
  139. return false;
  140. }
  141. }
  142. };