CollisionGroup.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Jolt/Physics/Collision/GroupFilter.h>
  5. #include <Jolt/ObjectStream/SerializableObject.h>
  6. JPH_NAMESPACE_BEGIN
  7. class StreamIn;
  8. class StreamOut;
  9. /// Two objects collide with each other if:
  10. /// - Both don't have a group filter
  11. /// - The first group filter says that the objects can collide
  12. /// - Or if there's no filter for the first object, the second group filter says the objects can collide
  13. class CollisionGroup
  14. {
  15. public:
  16. JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL(CollisionGroup)
  17. using GroupID = uint32;
  18. using SubGroupID = uint32;
  19. static const GroupID cInvalidGroup = ~GroupID(0);
  20. static const SubGroupID cInvalidSubGroup = ~SubGroupID(0);
  21. /// Default constructor
  22. CollisionGroup() = default;
  23. /// Construct with all properties
  24. CollisionGroup(const GroupFilter *inFilter, GroupID inGroupID, SubGroupID inSubGroupID) : mGroupFilter(inFilter), mGroupID(inGroupID), mSubGroupID(inSubGroupID) { }
  25. /// Set the collision group filter
  26. inline void SetGroupFilter(const GroupFilter *inFilter)
  27. {
  28. mGroupFilter = inFilter;
  29. }
  30. /// Get the collision group filter
  31. inline const GroupFilter *GetGroupFilter() const
  32. {
  33. return mGroupFilter;
  34. }
  35. /// Set the main group id for this object
  36. inline void SetGroupID(GroupID inID)
  37. {
  38. mGroupID = inID;
  39. }
  40. inline GroupID GetGroupID() const
  41. {
  42. return mGroupID;
  43. }
  44. /// Add this object to a sub group
  45. inline void SetSubGroupID(SubGroupID inID)
  46. {
  47. mSubGroupID = inID;
  48. }
  49. inline SubGroupID GetSubGroupID() const
  50. {
  51. return mSubGroupID;
  52. }
  53. /// Check if this object collides with another object
  54. bool CanCollide(const CollisionGroup &inOther) const
  55. {
  56. // Call the CanCollide function of the first group filter that's not null
  57. if (mGroupFilter != nullptr)
  58. return mGroupFilter->CanCollide(*this, inOther);
  59. else if (inOther.mGroupFilter != nullptr)
  60. return inOther.mGroupFilter->CanCollide(inOther, *this);
  61. else
  62. return true;
  63. }
  64. /// Saves the state of this object in binary form to inStream. Does not save group filter.
  65. void SaveBinaryState(StreamOut &inStream) const;
  66. /// Restore the state of this object from inStream. Does not save group filter.
  67. void RestoreBinaryState(StreamIn &inStream);
  68. private:
  69. RefConst<GroupFilter> mGroupFilter;
  70. GroupID mGroupID = cInvalidGroup;
  71. SubGroupID mSubGroupID = cInvalidSubGroup;
  72. };
  73. JPH_NAMESPACE_END