Layers.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. /// Class that determines if two object layers can collide
  14. class ObjectLayerPairFilterImpl : public ObjectLayerPairFilter
  15. {
  16. public:
  17. virtual bool ShouldCollide(ObjectLayer inObject1, ObjectLayer inObject2) const override
  18. {
  19. switch (inObject1)
  20. {
  21. case Layers::NON_MOVING:
  22. return inObject2 == Layers::MOVING; // Non moving only collides with moving
  23. case Layers::MOVING:
  24. return true; // Moving collides with everything
  25. default:
  26. JPH_ASSERT(false);
  27. return false;
  28. }
  29. }
  30. };
  31. /// Broadphase layers
  32. namespace BroadPhaseLayers
  33. {
  34. static constexpr BroadPhaseLayer NON_MOVING(0);
  35. static constexpr BroadPhaseLayer MOVING(1);
  36. static constexpr uint NUM_LAYERS(2);
  37. };
  38. /// BroadPhaseLayerInterface implementation
  39. class BPLayerInterfaceImpl final : public BroadPhaseLayerInterface
  40. {
  41. public:
  42. BPLayerInterfaceImpl()
  43. {
  44. // Create a mapping table from object to broad phase layer
  45. mObjectToBroadPhase[Layers::NON_MOVING] = BroadPhaseLayers::NON_MOVING;
  46. mObjectToBroadPhase[Layers::MOVING] = BroadPhaseLayers::MOVING;
  47. }
  48. virtual uint GetNumBroadPhaseLayers() const override
  49. {
  50. return BroadPhaseLayers::NUM_LAYERS;
  51. }
  52. virtual BroadPhaseLayer GetBroadPhaseLayer(ObjectLayer inLayer) const override
  53. {
  54. JPH_ASSERT(inLayer < Layers::NUM_LAYERS);
  55. return mObjectToBroadPhase[inLayer];
  56. }
  57. #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
  58. virtual const char * GetBroadPhaseLayerName(BroadPhaseLayer inLayer) const override
  59. {
  60. switch ((BroadPhaseLayer::Type)inLayer)
  61. {
  62. case (BroadPhaseLayer::Type)BroadPhaseLayers::NON_MOVING: return "NON_MOVING";
  63. case (BroadPhaseLayer::Type)BroadPhaseLayers::MOVING: return "MOVING";
  64. default: JPH_ASSERT(false); return "INVALID";
  65. }
  66. }
  67. #endif // JPH_EXTERNAL_PROFILE || JPH_PROFILE_ENABLED
  68. private:
  69. BroadPhaseLayer mObjectToBroadPhase[Layers::NUM_LAYERS];
  70. };
  71. /// Class that determines if an object layer can collide with a broadphase layer
  72. class ObjectVsBroadPhaseLayerFilterImpl : public ObjectVsBroadPhaseLayerFilter
  73. {
  74. public:
  75. virtual bool ShouldCollide(ObjectLayer inLayer1, BroadPhaseLayer inLayer2) const override
  76. {
  77. switch (inLayer1)
  78. {
  79. case Layers::NON_MOVING:
  80. return inLayer2 == BroadPhaseLayers::MOVING;
  81. case Layers::MOVING:
  82. return true;
  83. default:
  84. JPH_ASSERT(false);
  85. return false;
  86. }
  87. }
  88. };