Layers.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 UNUSED1 = 0; // 4 unused values so that broadphase layers values don't match with object layer values (for testing purposes)
  10. static constexpr uint8 UNUSED2 = 1;
  11. static constexpr uint8 UNUSED3 = 2;
  12. static constexpr uint8 UNUSED4 = 3;
  13. static constexpr uint8 NON_MOVING = 4;
  14. static constexpr uint8 MOVING = 5;
  15. static constexpr uint8 DEBRIS = 6; // Example: Debris collides only with NON_MOVING
  16. static constexpr uint8 NUM_LAYERS = 7;
  17. };
  18. /// Function that determines if two object layers can collide
  19. inline bool ObjectCanCollide(ObjectLayer inObject1, ObjectLayer inObject2)
  20. {
  21. switch (inObject1)
  22. {
  23. case Layers::UNUSED1:
  24. case Layers::UNUSED2:
  25. case Layers::UNUSED3:
  26. case Layers::UNUSED4:
  27. return false;
  28. case Layers::NON_MOVING:
  29. return inObject2 == Layers::MOVING || inObject2 == Layers::DEBRIS;
  30. case Layers::MOVING:
  31. return inObject2 == Layers::NON_MOVING || inObject2 == Layers::MOVING;
  32. case Layers::DEBRIS:
  33. return inObject2 == Layers::NON_MOVING;
  34. default:
  35. JPH_ASSERT(false);
  36. return false;
  37. }
  38. };
  39. /// Broadphase layers
  40. namespace BroadPhaseLayers
  41. {
  42. static constexpr BroadPhaseLayer NON_MOVING(0);
  43. static constexpr BroadPhaseLayer MOVING(1);
  44. static constexpr BroadPhaseLayer DEBRIS(2);
  45. static constexpr BroadPhaseLayer UNUSED(3);
  46. static constexpr uint NUM_LAYERS(4);
  47. };
  48. /// BroadPhaseLayerInterface implementation
  49. class BPLayerInterfaceImpl final : public BroadPhaseLayerInterface
  50. {
  51. public:
  52. BPLayerInterfaceImpl()
  53. {
  54. // Create a mapping table from object to broad phase layer
  55. mObjectToBroadPhase[Layers::UNUSED1] = BroadPhaseLayers::UNUSED;
  56. mObjectToBroadPhase[Layers::UNUSED2] = BroadPhaseLayers::UNUSED;
  57. mObjectToBroadPhase[Layers::UNUSED3] = BroadPhaseLayers::UNUSED;
  58. mObjectToBroadPhase[Layers::UNUSED4] = BroadPhaseLayers::UNUSED;
  59. mObjectToBroadPhase[Layers::NON_MOVING] = BroadPhaseLayers::NON_MOVING;
  60. mObjectToBroadPhase[Layers::MOVING] = BroadPhaseLayers::MOVING;
  61. mObjectToBroadPhase[Layers::DEBRIS] = BroadPhaseLayers::DEBRIS;
  62. }
  63. virtual uint GetNumBroadPhaseLayers() const override
  64. {
  65. return BroadPhaseLayers::NUM_LAYERS;
  66. }
  67. virtual BroadPhaseLayer GetBroadPhaseLayer(ObjectLayer inLayer) const override
  68. {
  69. JPH_ASSERT(inLayer < Layers::NUM_LAYERS);
  70. return mObjectToBroadPhase[inLayer];
  71. }
  72. #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
  73. virtual const char * GetBroadPhaseLayerName(BroadPhaseLayer inLayer) const override
  74. {
  75. switch ((BroadPhaseLayer::Type)inLayer)
  76. {
  77. case (BroadPhaseLayer::Type)BroadPhaseLayers::NON_MOVING: return "NON_MOVING";
  78. case (BroadPhaseLayer::Type)BroadPhaseLayers::MOVING: return "MOVING";
  79. case (BroadPhaseLayer::Type)BroadPhaseLayers::DEBRIS: return "DEBRIS";
  80. case (BroadPhaseLayer::Type)BroadPhaseLayers::UNUSED: return "UNUSED";
  81. default: JPH_ASSERT(false); return "INVALID";
  82. }
  83. }
  84. #endif // JPH_EXTERNAL_PROFILE || JPH_PROFILE_ENABLED
  85. private:
  86. BroadPhaseLayer mObjectToBroadPhase[Layers::NUM_LAYERS];
  87. };
  88. /// Function that determines if two broadphase layers can collide
  89. inline bool BroadPhaseCanCollide(ObjectLayer inLayer1, BroadPhaseLayer inLayer2)
  90. {
  91. switch (inLayer1)
  92. {
  93. case Layers::NON_MOVING:
  94. return inLayer2 == BroadPhaseLayers::MOVING;
  95. case Layers::MOVING:
  96. return inLayer2 == BroadPhaseLayers::NON_MOVING || inLayer2 == BroadPhaseLayers::MOVING;
  97. case Layers::DEBRIS:
  98. return inLayer2 == BroadPhaseLayers::NON_MOVING;
  99. case Layers::UNUSED1:
  100. case Layers::UNUSED2:
  101. case Layers::UNUSED3:
  102. return false;
  103. default:
  104. JPH_ASSERT(false);
  105. return false;
  106. }
  107. }