ObjectLayer.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Core/NonCopyable.h>
  5. namespace JPH {
  6. /// Layer that objects can be in, determines which other objects it can collide with
  7. using ObjectLayer = uint16;
  8. /// Constant value used to indicate an invalid object layer
  9. static constexpr ObjectLayer cObjectLayerInvalid = 0xffff;
  10. /// Filter class for object layers
  11. class ObjectLayerFilter : public NonCopyable
  12. {
  13. public:
  14. /// Destructor
  15. virtual ~ObjectLayerFilter() = default;
  16. /// Function to filter out object layers when doing collision query test (return true to allow testing against objects with this layer)
  17. virtual bool ShouldCollide(ObjectLayer inLayer) const
  18. {
  19. return true;
  20. }
  21. #ifdef JPH_TRACK_BROADPHASE_STATS
  22. /// Get a string that describes this filter for stat tracking purposes
  23. virtual string GetDescription() const
  24. {
  25. return "No Description";
  26. }
  27. #endif // JPH_TRACK_BROADPHASE_STATS
  28. };
  29. /// Function to test if two objects can collide based on their object layer. Used while finding collision pairs.
  30. using ObjectLayerPairFilter = bool (*)(ObjectLayer inLayer1, ObjectLayer inLayer2);
  31. /// Default filter class that uses the pair filter in combination with a specified layer to filter layers
  32. class DefaultObjectLayerFilter : public ObjectLayerFilter
  33. {
  34. public:
  35. /// Constructor
  36. DefaultObjectLayerFilter(ObjectLayerPairFilter inObjectLayerPairFilter, ObjectLayer inLayer) :
  37. mObjectLayerPairFilter(inObjectLayerPairFilter),
  38. mLayer(inLayer)
  39. {
  40. }
  41. /// Copy constructor
  42. DefaultObjectLayerFilter(const DefaultObjectLayerFilter &inRHS) :
  43. mObjectLayerPairFilter(inRHS.mObjectLayerPairFilter),
  44. mLayer(inRHS.mLayer)
  45. {
  46. }
  47. // See ObjectLayerFilter::ShouldCollide
  48. virtual bool ShouldCollide(ObjectLayer inLayer) const override
  49. {
  50. return mObjectLayerPairFilter(mLayer, inLayer);
  51. }
  52. private:
  53. ObjectLayerPairFilter mObjectLayerPairFilter;
  54. ObjectLayer mLayer;
  55. };
  56. /// Allows objects from a specific layer only
  57. class SpecifiedObjectLayerFilter : public ObjectLayerFilter
  58. {
  59. public:
  60. /// Constructor
  61. explicit SpecifiedObjectLayerFilter(ObjectLayer inLayer) :
  62. mLayer(inLayer)
  63. {
  64. }
  65. // See ObjectLayerFilter::ShouldCollide
  66. virtual bool ShouldCollide(ObjectLayer inLayer) const override
  67. {
  68. return mLayer == inLayer;
  69. }
  70. private:
  71. ObjectLayer mLayer;
  72. };
  73. } // JPH