CollisionGroup.h 2.5 KB

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