Browse Source

Added Get/SetCollisionGroup on BodyInterface (#1527)

Jorrit Rouwe 5 months ago
parent
commit
70865d5034

+ 16 - 0
Jolt/Physics/Body/BodyInterface.cpp

@@ -990,6 +990,22 @@ bool BodyInterface::GetUseManifoldReduction(const BodyID &inBodyID) const
 		return true;
 }
 
+void BodyInterface::SetCollisionGroup(const BodyID &inBodyID, const CollisionGroup &inCollisionGroup)
+{
+	BodyLockWrite lock(*mBodyLockInterface, inBodyID);
+	if (lock.Succeeded())
+		lock.GetBody().SetCollisionGroup(inCollisionGroup);
+}
+
+const CollisionGroup &BodyInterface::GetCollisionGroup(const BodyID &inBodyID) const
+{
+	BodyLockRead lock(*mBodyLockInterface, inBodyID);
+	if (lock.Succeeded())
+		return lock.GetBody().GetCollisionGroup();
+	else
+		return CollisionGroup::sInvalid;
+}
+
 TransformedShape BodyInterface::GetTransformedShape(const BodyID &inBodyID) const
 {
 	BodyLockRead lock(*mBodyLockInterface, inBodyID);

+ 7 - 0
Jolt/Physics/Body/BodyInterface.h

@@ -28,6 +28,7 @@ class TwoBodyConstraintSettings;
 class TwoBodyConstraint;
 class BroadPhaseLayerFilter;
 class AABox;
+class CollisionGroup;
 
 /// Class that provides operations on bodies using a body ID. Note that if you need to do multiple operations on a single body, it is more efficient to lock the body once and combine the operations.
 /// All quantities are in world space unless otherwise specified.
@@ -273,6 +274,12 @@ public:
 	bool						GetUseManifoldReduction(const BodyID &inBodyID) const;
 	///@}
 
+	///@name Collision group
+	///@{
+	void						SetCollisionGroup(const BodyID &inBodyID, const CollisionGroup &inCollisionGroup);
+	const CollisionGroup &		GetCollisionGroup(const BodyID &inBodyID) const;
+	///@}
+
 	/// Get transform and shape for this body, used to perform collision detection
 	TransformedShape			GetTransformedShape(const BodyID &inBodyID) const;
 

+ 2 - 0
Jolt/Physics/Collision/CollisionGroup.cpp

@@ -18,6 +18,8 @@ JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(CollisionGroup)
 	JPH_ADD_ATTRIBUTE(CollisionGroup, mSubGroupID)
 }
 
+const CollisionGroup CollisionGroup::sInvalid;
+
 void CollisionGroup::SaveBinaryState(StreamOut &inStream) const
 {
 	inStream.Write(mGroupID);

+ 3 - 0
Jolt/Physics/Collision/CollisionGroup.h

@@ -85,6 +85,9 @@ public:
 	/// Restore the state of this object from inStream. Does not save group filter.
 	void					RestoreBinaryState(StreamIn &inStream);
 
+	/// An invalid collision group
+	static const CollisionGroup	sInvalid;
+
 private:
 	RefConst<GroupFilter>	mGroupFilter;
 	GroupID					mGroupID = cInvalidGroup;