ObjectLayer.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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() { }
  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. };
  22. /// Function to test if two objects can collide based on their object layer. Used while finding collision pairs.
  23. using ObjectLayerPairFilter = bool (*)(ObjectLayer inLayer1, ObjectLayer inLayer2);
  24. /// Default filter class that uses the pair filter in combination with a specified layer to filter layers
  25. class DefaultObjectLayerFilter : public ObjectLayerFilter
  26. {
  27. public:
  28. /// Constructor
  29. DefaultObjectLayerFilter(ObjectLayerPairFilter inObjectLayerPairFilter, ObjectLayer inLayer) :
  30. mObjectLayerPairFilter(inObjectLayerPairFilter),
  31. mLayer(inLayer)
  32. {
  33. }
  34. /// Copy constructor
  35. DefaultObjectLayerFilter(const DefaultObjectLayerFilter &inRHS) :
  36. mObjectLayerPairFilter(inRHS.mObjectLayerPairFilter),
  37. mLayer(inRHS.mLayer)
  38. {
  39. }
  40. // See ObjectLayerFilter::ShouldCollide
  41. virtual bool ShouldCollide(ObjectLayer inLayer) const override
  42. {
  43. return mObjectLayerPairFilter(mLayer, inLayer);
  44. }
  45. private:
  46. ObjectLayerPairFilter mObjectLayerPairFilter;
  47. ObjectLayer mLayer;
  48. };
  49. /// Allows objects from a specific layer only
  50. class SpecifiedObjectLayerFilter : public ObjectLayerFilter
  51. {
  52. public:
  53. /// Constructor
  54. SpecifiedObjectLayerFilter(ObjectLayer inLayer) :
  55. mLayer(inLayer)
  56. {
  57. }
  58. // See ObjectLayerFilter::ShouldCollide
  59. virtual bool ShouldCollide(ObjectLayer inLayer) const override
  60. {
  61. return mLayer == inLayer;
  62. }
  63. private:
  64. ObjectLayer mLayer;
  65. };
  66. } // JPH