Layers.h 2.8 KB

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