Преглед на файлове

Ability to specify constraint position for body 1 and 2 separately (#72)

Jorrit Rouwe преди 3 години
родител
ревизия
066dfb8940

+ 8 - 5
Jolt/Physics/Constraints/PointConstraint.cpp

@@ -18,21 +18,24 @@ JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(PointConstraintSettings)
 {
 {
 	JPH_ADD_BASE_CLASS(PointConstraintSettings, TwoBodyConstraintSettings)
 	JPH_ADD_BASE_CLASS(PointConstraintSettings, TwoBodyConstraintSettings)
 
 
-	JPH_ADD_ATTRIBUTE(PointConstraintSettings, mCommonPoint)
+	JPH_ADD_ATTRIBUTE(PointConstraintSettings, mPoint1)
+	JPH_ADD_ATTRIBUTE(PointConstraintSettings, mPoint2)
 }
 }
 
 
 void PointConstraintSettings::SaveBinaryState(StreamOut &inStream) const
 void PointConstraintSettings::SaveBinaryState(StreamOut &inStream) const
 { 
 { 
 	ConstraintSettings::SaveBinaryState(inStream);
 	ConstraintSettings::SaveBinaryState(inStream);
 
 
-	inStream.Write(mCommonPoint);	
+	inStream.Write(mPoint1);	
+	inStream.Write(mPoint2);
 }
 }
 
 
 void PointConstraintSettings::RestoreBinaryState(StreamIn &inStream)
 void PointConstraintSettings::RestoreBinaryState(StreamIn &inStream)
 {
 {
 	ConstraintSettings::RestoreBinaryState(inStream);
 	ConstraintSettings::RestoreBinaryState(inStream);
 
 
-	inStream.Read(mCommonPoint);
+	inStream.Read(mPoint1);
+	inStream.Read(mPoint2);
 }
 }
 
 
 TwoBodyConstraint *PointConstraintSettings::Create(Body &inBody1, Body &inBody2) const
 TwoBodyConstraint *PointConstraintSettings::Create(Body &inBody1, Body &inBody2) const
@@ -44,8 +47,8 @@ PointConstraint::PointConstraint(Body &inBody1, Body &inBody2, const PointConstr
 	TwoBodyConstraint(inBody1, inBody2, inSettings)
 	TwoBodyConstraint(inBody1, inBody2, inSettings)
 {
 {
 	// Store local positions
 	// Store local positions
-	mLocalSpacePosition1 = inBody1.GetInverseCenterOfMassTransform() * inSettings.mCommonPoint;
-	mLocalSpacePosition2 = inBody2.GetInverseCenterOfMassTransform() * inSettings.mCommonPoint;
+	mLocalSpacePosition1 = inBody1.GetInverseCenterOfMassTransform() * inSettings.mPoint1;
+	mLocalSpacePosition2 = inBody2.GetInverseCenterOfMassTransform() * inSettings.mPoint2;
 }
 }
 
 
 void PointConstraint::CalculateConstraintProperties()
 void PointConstraint::CalculateConstraintProperties()

+ 6 - 2
Jolt/Physics/Constraints/PointConstraint.h

@@ -20,8 +20,12 @@ public:
 	/// Create an an instance of this constraint
 	/// Create an an instance of this constraint
 	virtual TwoBodyConstraint *	Create(Body &inBody1, Body &inBody2) const override;
 	virtual TwoBodyConstraint *	Create(Body &inBody1, Body &inBody2) const override;
 
 
-	/// Constraint is placed at mCommonPoint (world space position).
-	Vec3						mCommonPoint = Vec3::sZero();
+	/// Body 1 constraint position (world space position).
+	Vec3						mPoint1 = Vec3::sZero();
+
+	/// Body 2 constraint position (world space position).
+	/// Note: Normally you would set mPoint1 = mPoint2 if the bodies are already placed how you want to constrain them.
+	Vec3						mPoint2 = Vec3::sZero();
 
 
 protected:
 protected:
 	// See: ConstraintSettings::RestoreBinaryState
 	// See: ConstraintSettings::RestoreBinaryState

+ 1 - 1
Samples/Tests/Constraints/PointConstraintTest.cpp

@@ -46,7 +46,7 @@ void PointConstraintTest::Initialize()
 		mBodyInterface->AddBody(segment.GetID(), EActivation::Activate);
 		mBodyInterface->AddBody(segment.GetID(), EActivation::Activate);
 
 
 		PointConstraintSettings settings;
 		PointConstraintSettings settings;
-		settings.mCommonPoint = position + Vec3(-half_cylinder_height, 0, 0);
+		settings.mPoint1 = settings.mPoint2 = position + Vec3(-half_cylinder_height, 0, 0);
 		mPhysicsSystem->AddConstraint(settings.Create(*prev, segment));
 		mPhysicsSystem->AddConstraint(settings.Create(*prev, segment));
 
 
 		prev = &segment;
 		prev = &segment;

+ 1 - 1
Samples/Utils/RagdollLoader.cpp

@@ -42,7 +42,7 @@ RagdollSettings *RagdollLoader::sLoad(const char *inFileName, EMotionType inMoti
 			case EConstraintOverride::TypePoint:
 			case EConstraintOverride::TypePoint:
 				{
 				{
 					PointConstraintSettings *settings = new PointConstraintSettings();
 					PointConstraintSettings *settings = new PointConstraintSettings();
-					settings->mCommonPoint = original->mPosition1;
+					settings->mPoint1 = settings->mPoint2 = original->mPosition1;
 					p.mToParent = settings;
 					p.mToParent = settings;
 					break;
 					break;
 				}
 				}