Layers.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Physics/Collision/ObjectLayer.h>
  5. #include <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; // 3 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 NON_MOVING = 3;
  13. static constexpr uint8 MOVING = 4;
  14. static constexpr uint8 NUM_LAYERS = 5;
  15. };
  16. /// Function that determines if two object layers can collide
  17. inline bool ObjectCanCollide(ObjectLayer inObject1, ObjectLayer inObject2)
  18. {
  19. switch (inObject1)
  20. {
  21. case Layers::UNUSED1:
  22. case Layers::UNUSED2:
  23. case Layers::UNUSED3:
  24. return false;
  25. case Layers::NON_MOVING:
  26. return inObject2 == Layers::MOVING;
  27. case Layers::MOVING:
  28. return inObject2 == Layers::NON_MOVING || inObject2 == Layers::MOVING;
  29. default:
  30. JPH_ASSERT(false);
  31. return false;
  32. }
  33. };
  34. /// Broadphase layers
  35. namespace BroadPhaseLayers
  36. {
  37. static constexpr BroadPhaseLayer NON_MOVING(0);
  38. static constexpr BroadPhaseLayer MOVING(1);
  39. static constexpr BroadPhaseLayer UNUSED(2);
  40. };
  41. /// Function that determines if two broadphase layers can collide
  42. inline bool BroadPhaseCanCollide(ObjectLayer inLayer1, BroadPhaseLayer inLayer2)
  43. {
  44. switch (inLayer1)
  45. {
  46. case Layers::NON_MOVING:
  47. return inLayer2 == BroadPhaseLayers::MOVING;
  48. case Layers::MOVING:
  49. return inLayer2 == BroadPhaseLayers::NON_MOVING || inLayer2 == BroadPhaseLayers::MOVING;
  50. case Layers::UNUSED1:
  51. case Layers::UNUSED2:
  52. case Layers::UNUSED3:
  53. return false;
  54. default:
  55. JPH_ASSERT(false);
  56. return false;
  57. }
  58. }
  59. /// Create mapping table from layer to broadphase layer
  60. inline ObjectToBroadPhaseLayer GetObjectToBroadPhaseLayer()
  61. {
  62. ObjectToBroadPhaseLayer object_to_broadphase;
  63. object_to_broadphase.resize(Layers::NUM_LAYERS);
  64. object_to_broadphase[Layers::UNUSED1] = BroadPhaseLayers::UNUSED;
  65. object_to_broadphase[Layers::UNUSED2] = BroadPhaseLayers::UNUSED;
  66. object_to_broadphase[Layers::UNUSED3] = BroadPhaseLayers::UNUSED;
  67. object_to_broadphase[Layers::NON_MOVING] = BroadPhaseLayers::NON_MOVING;
  68. object_to_broadphase[Layers::MOVING] = BroadPhaseLayers::MOVING;
  69. return object_to_broadphase;
  70. }
  71. /// Get name of broadphase layer for debugging purposes
  72. inline const char *GetBroadPhaseLayerName(BroadPhaseLayer inLayer)
  73. {
  74. switch ((BroadPhaseLayer::Type)inLayer)
  75. {
  76. case (BroadPhaseLayer::Type)BroadPhaseLayers::NON_MOVING: return "NON_MOVING";
  77. case (BroadPhaseLayer::Type)BroadPhaseLayers::MOVING: return "MOVING";
  78. case (BroadPhaseLayer::Type)BroadPhaseLayers::UNUSED: return "UNUSED";
  79. default: JPH_ASSERT(false); return "INVALID";
  80. }
  81. }