Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Collision/CollisionGroup.h
9912 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56#include <Jolt/Physics/Collision/GroupFilter.h>7#include <Jolt/ObjectStream/SerializableObject.h>89JPH_NAMESPACE_BEGIN1011class StreamIn;12class StreamOut;1314/// Two objects collide with each other if:15/// - Both don't have a group filter16/// - The first group filter says that the objects can collide17/// - Or if there's no filter for the first object, the second group filter says the objects can collide18class JPH_EXPORT CollisionGroup19{20JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL(JPH_EXPORT, CollisionGroup)2122public:23using GroupID = uint32;24using SubGroupID = uint32;2526static const GroupID cInvalidGroup = ~GroupID(0);27static const SubGroupID cInvalidSubGroup = ~SubGroupID(0);2829/// Default constructor30CollisionGroup() = default;3132/// Construct with all properties33CollisionGroup(const GroupFilter *inFilter, GroupID inGroupID, SubGroupID inSubGroupID) : mGroupFilter(inFilter), mGroupID(inGroupID), mSubGroupID(inSubGroupID) { }3435/// Set the collision group filter36inline void SetGroupFilter(const GroupFilter *inFilter)37{38mGroupFilter = inFilter;39}4041/// Get the collision group filter42inline const GroupFilter *GetGroupFilter() const43{44return mGroupFilter;45}4647/// Set the main group id for this object48inline void SetGroupID(GroupID inID)49{50mGroupID = inID;51}5253inline GroupID GetGroupID() const54{55return mGroupID;56}5758/// Add this object to a sub group59inline void SetSubGroupID(SubGroupID inID)60{61mSubGroupID = inID;62}6364inline SubGroupID GetSubGroupID() const65{66return mSubGroupID;67}6869/// Check if this object collides with another object70bool CanCollide(const CollisionGroup &inOther) const71{72// Call the CanCollide function of the first group filter that's not null73if (mGroupFilter != nullptr)74return mGroupFilter->CanCollide(*this, inOther);75else if (inOther.mGroupFilter != nullptr)76return inOther.mGroupFilter->CanCollide(inOther, *this);77else78return true;79}8081/// Saves the state of this object in binary form to inStream. Does not save group filter.82void SaveBinaryState(StreamOut &inStream) const;8384/// Restore the state of this object from inStream. Does not save group filter.85void RestoreBinaryState(StreamIn &inStream);8687/// An invalid collision group88static const CollisionGroup sInvalid;8990private:91RefConst<GroupFilter> mGroupFilter;92GroupID mGroupID = cInvalidGroup;93SubGroupID mSubGroupID = cInvalidSubGroup;94};9596JPH_NAMESPACE_END979899