Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Collision/CollisionGroup.h
9912 views
1
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3
// SPDX-License-Identifier: MIT
4
5
#pragma once
6
7
#include <Jolt/Physics/Collision/GroupFilter.h>
8
#include <Jolt/ObjectStream/SerializableObject.h>
9
10
JPH_NAMESPACE_BEGIN
11
12
class StreamIn;
13
class StreamOut;
14
15
/// Two objects collide with each other if:
16
/// - Both don't have a group filter
17
/// - The first group filter says that the objects can collide
18
/// - Or if there's no filter for the first object, the second group filter says the objects can collide
19
class JPH_EXPORT CollisionGroup
20
{
21
JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL(JPH_EXPORT, CollisionGroup)
22
23
public:
24
using GroupID = uint32;
25
using SubGroupID = uint32;
26
27
static const GroupID cInvalidGroup = ~GroupID(0);
28
static const SubGroupID cInvalidSubGroup = ~SubGroupID(0);
29
30
/// Default constructor
31
CollisionGroup() = default;
32
33
/// Construct with all properties
34
CollisionGroup(const GroupFilter *inFilter, GroupID inGroupID, SubGroupID inSubGroupID) : mGroupFilter(inFilter), mGroupID(inGroupID), mSubGroupID(inSubGroupID) { }
35
36
/// Set the collision group filter
37
inline void SetGroupFilter(const GroupFilter *inFilter)
38
{
39
mGroupFilter = inFilter;
40
}
41
42
/// Get the collision group filter
43
inline const GroupFilter *GetGroupFilter() const
44
{
45
return mGroupFilter;
46
}
47
48
/// Set the main group id for this object
49
inline void SetGroupID(GroupID inID)
50
{
51
mGroupID = inID;
52
}
53
54
inline GroupID GetGroupID() const
55
{
56
return mGroupID;
57
}
58
59
/// Add this object to a sub group
60
inline void SetSubGroupID(SubGroupID inID)
61
{
62
mSubGroupID = inID;
63
}
64
65
inline SubGroupID GetSubGroupID() const
66
{
67
return mSubGroupID;
68
}
69
70
/// Check if this object collides with another object
71
bool CanCollide(const CollisionGroup &inOther) const
72
{
73
// Call the CanCollide function of the first group filter that's not null
74
if (mGroupFilter != nullptr)
75
return mGroupFilter->CanCollide(*this, inOther);
76
else if (inOther.mGroupFilter != nullptr)
77
return inOther.mGroupFilter->CanCollide(inOther, *this);
78
else
79
return true;
80
}
81
82
/// Saves the state of this object in binary form to inStream. Does not save group filter.
83
void SaveBinaryState(StreamOut &inStream) const;
84
85
/// Restore the state of this object from inStream. Does not save group filter.
86
void RestoreBinaryState(StreamIn &inStream);
87
88
/// An invalid collision group
89
static const CollisionGroup sInvalid;
90
91
private:
92
RefConst<GroupFilter> mGroupFilter;
93
GroupID mGroupID = cInvalidGroup;
94
SubGroupID mSubGroupID = cInvalidSubGroup;
95
};
96
97
JPH_NAMESPACE_END
98
99