Layers.h 4.6 KB

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