Răsfoiți Sursa

Added user data for constraints (#475)

Also fixed setting user data in GetBodyCreationSettings
Jorrit Rouwe 2 ani în urmă
părinte
comite
352550fdd5

+ 1 - 0
Jolt/Physics/Body/Body.cpp

@@ -319,6 +319,7 @@ BodyCreationSettings Body::GetBodyCreationSettings() const
 	result.mLinearVelocity = mMotionProperties != nullptr? mMotionProperties->GetLinearVelocity() : Vec3::sZero();
 	result.mAngularVelocity = mMotionProperties != nullptr? mMotionProperties->GetAngularVelocity() : Vec3::sZero();
 	result.mObjectLayer = GetObjectLayer();
+	result.mUserData = mUserData;
 	result.mCollisionGroup = GetCollisionGroup();
 	result.mMotionType = GetMotionType();
 	result.mAllowDynamicOrKinematic = mMotionProperties != nullptr;

+ 2 - 0
Jolt/Physics/Constraints/Constraint.cpp

@@ -21,6 +21,7 @@ JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(ConstraintSettings)
 	JPH_ADD_ATTRIBUTE(ConstraintSettings, mDrawConstraintSize)
 	JPH_ADD_ATTRIBUTE(ConstraintSettings, mNumVelocityStepsOverride)
 	JPH_ADD_ATTRIBUTE(ConstraintSettings, mNumPositionStepsOverride)
+	JPH_ADD_ATTRIBUTE(ConstraintSettings, mUserData)
 }
 
 void ConstraintSettings::SaveBinaryState(StreamOut &inStream) const
@@ -90,6 +91,7 @@ void Constraint::ToConstraintSettings(ConstraintSettings &outSettings) const
 	outSettings.mEnabled = mEnabled;
 	outSettings.mNumVelocityStepsOverride = mNumVelocityStepsOverride;
 	outSettings.mNumPositionStepsOverride = mNumPositionStepsOverride;
+	outSettings.mUserData = mUserData;
 #ifdef JPH_DEBUG_RENDERER
 	outSettings.mDrawConstraintSize = mDrawConstraintSize;
 #endif // JPH_DEBUG_RENDERER

+ 12 - 1
Jolt/Physics/Constraints/Constraint.h

@@ -85,6 +85,9 @@ public:
 	/// Size of constraint when drawing it through the debug renderer
 	float						mDrawConstraintSize = 1.0f;
 
+	/// User data value (can be used by application)
+	uint64						mUserData = 0;
+
 protected:
 	/// This function should not be called directly, it is used by sRestoreFromBinaryState.
 	virtual void				RestoreBinaryState(StreamIn &inStream);
@@ -103,7 +106,8 @@ public:
 #endif // JPH_DEBUG_RENDERER
 		mNumVelocityStepsOverride(inSettings.mNumVelocityStepsOverride),
 		mNumPositionStepsOverride(inSettings.mNumPositionStepsOverride),
-		mEnabled(inSettings.mEnabled)
+		mEnabled(inSettings.mEnabled),
+		mUserData(inSettings.mUserData)
 	{
 	}
 
@@ -133,6 +137,10 @@ public:
 	/// Test if a constraint is enabled.
 	bool						GetEnabled() const							{ return mEnabled; }
 
+	/// Access to the user data, can be used for anything by the application
+	uint64						GetUserData() const							{ return mUserData; }
+	void						SetUserData(uint64 inUserData)				{ mUserData = inUserData; }
+
 	///@name Solver interface
 	///@{
 	virtual bool				IsActive() const							{ return mEnabled; }
@@ -194,6 +202,9 @@ private:
 
 	/// If this constraint is currently enabled
 	bool						mEnabled = true;
+
+	/// User data value (can be used by application)
+	uint64						mUserData;
 };
 
 JPH_NAMESPACE_END

+ 27 - 0
UnitTests/Physics/PhysicsTests.cpp

@@ -10,6 +10,7 @@
 #include <Jolt/Physics/Collision/Shape/BoxShape.h>
 #include <Jolt/Physics/Collision/Shape/RotatedTranslatedShape.h>
 #include <Jolt/Physics/Body/BodyLockMulti.h>
+#include <Jolt/Physics/Constraints/PointConstraint.h>
 
 TEST_SUITE("PhysicsTests")
 {
@@ -264,6 +265,32 @@ TEST_SUITE("PhysicsTests")
 		// Change the user data
 		body->SetUserData(0x5678123443218765);
 		CHECK(body->GetUserData() == 0x5678123443218765);
+
+		// Convert back to body settings
+		BodyCreationSettings body_settings2 = body->GetBodyCreationSettings();
+		CHECK(body_settings2.mUserData == 0x5678123443218765);
+	}
+
+	TEST_CASE("TestPhysicsConstraintUserData")
+	{
+		PhysicsTestContext c(1.0f / 60.0f, 1, 1);
+
+		// Create a body
+		Body &body = c.CreateBox(RVec3::sZero(), Quat::sIdentity(), EMotionType::Dynamic, EMotionQuality::Discrete, Layers::MOVING, Vec3::sReplicate(1.0f));
+
+		// Create constraint with user data
+		PointConstraintSettings constraint_settings;
+		constraint_settings.mUserData = 0x1234567887654321;
+		Ref<Constraint> constraint = constraint_settings.Create(body, Body::sFixedToWorld);
+		CHECK(constraint->GetUserData() == 0x1234567887654321);
+
+		// Change the user data
+		constraint->SetUserData(0x5678123443218765);
+		CHECK(constraint->GetUserData() == 0x5678123443218765);
+
+		// Convert back to constraint settings
+		Ref<ConstraintSettings> constraint_settings2 = constraint->GetConstraintSettings();
+		CHECK(constraint_settings2->mUserData == 0x5678123443218765);
 	}
 
 	TEST_CASE("TestPhysicsPosition")