Răsfoiți Sursa

Added functions to get the character settings from a character (#1662)

Also provided copy constructors for the character settings

See #1655
Jorrit Rouwe 1 lună în urmă
părinte
comite
3ed3a7d6d8

+ 21 - 0
Jolt/Physics/Character/Character.cpp

@@ -330,4 +330,25 @@ TransformedShape Character::GetTransformedShape(bool inLockBodies) const
 	return sCharacterGetBodyInterface(mSystem, inLockBodies).GetTransformedShape(mBodyID);
 }
 
+CharacterSettings Character::GetCharacterSettings(bool inLockBodies) const
+{
+	BodyLockRead lock(sCharacterGetBodyLockInterface(mSystem, inLockBodies), mBodyID);
+	JPH_ASSERT(lock.Succeeded());
+	const Body &body = lock.GetBody();
+
+	CharacterSettings settings;
+	settings.mUp = mUp;
+	settings.mSupportingVolume = mSupportingVolume;
+	settings.mMaxSlopeAngle = ACos(mCosMaxSlopeAngle);
+	settings.mEnhancedInternalEdgeRemoval = body.GetEnhancedInternalEdgeRemoval();
+	settings.mShape = mShape;
+	settings.mLayer = mLayer;
+	const MotionProperties *mp = body.GetMotionProperties();
+	settings.mMass = 1.0f / mp->GetInverseMass();
+	settings.mFriction = body.GetFriction();
+	settings.mGravityFactor = mp->GetGravityFactor();
+	settings.mAllowedDOFs = mp->GetAllowedDOFs();
+	return settings;
+}
+
 JPH_NAMESPACE_END

+ 8 - 0
Jolt/Physics/Character/Character.h

@@ -18,6 +18,11 @@ class JPH_EXPORT CharacterSettings : public CharacterBaseSettings
 public:
 	JPH_OVERRIDE_NEW_DELETE
 
+	/// Constructor
+										CharacterSettings() = default;
+										CharacterSettings(const CharacterSettings &) = default;
+	CharacterSettings &					operator = (const CharacterSettings &) = default;
+
 	/// Layer that this character will be added to
 	ObjectLayer							mLayer = 0;
 
@@ -134,6 +139,9 @@ public:
 	/// @param inLockBodies If the collision query should use the locking body interface (true) or the non locking body interface (false)
 	void								CheckCollision(RVec3Arg inPosition, QuatArg inRotation, Vec3Arg inMovementDirection, float inMaxSeparationDistance, const Shape *inShape, RVec3Arg inBaseOffset, CollideShapeCollector &ioCollector, bool inLockBodies = true) const;
 
+	/// Get the character settings that can recreate this character
+	CharacterSettings					GetCharacterSettings(bool inLockBodies = true) const;
+
 private:
 	/// Check collisions between inShape and the world using the center of mass transform
 	void								CheckCollision(RMat44Arg inCenterOfMassTransform, Vec3Arg inMovementDirection, float inMaxSeparationDistance, const Shape *inShape, RVec3Arg inBaseOffset, CollideShapeCollector &ioCollector, bool inLockBodies) const;

+ 2 - 2
Jolt/Physics/Character/CharacterBase.h

@@ -24,8 +24,8 @@ public:
 
 	/// Constructor
 										CharacterBaseSettings() = default;
-										CharacterBaseSettings(const CharacterBaseSettings &inSettings) = default;
-	CharacterBaseSettings &				operator = (const CharacterBaseSettings &inSettings) = default;
+										CharacterBaseSettings(const CharacterBaseSettings &) = default;
+	CharacterBaseSettings &				operator = (const CharacterBaseSettings &) = default;
 
 	/// Virtual destructor
 	virtual								~CharacterBaseSettings() = default;

+ 33 - 0
Jolt/Physics/Character/CharacterVirtual.cpp

@@ -1888,4 +1888,37 @@ void CharacterVirtual::RestoreState(StateRecorder &inStream)
 		c.RestoreState(inStream);
 }
 
+CharacterVirtualSettings CharacterVirtual::GetCharacterVirtualSettings() const
+{
+	CharacterVirtualSettings settings;
+	settings.mUp = mUp;
+	settings.mSupportingVolume = mSupportingVolume;
+	settings.mMaxSlopeAngle = ACos(mCosMaxSlopeAngle);
+	settings.mEnhancedInternalEdgeRemoval = mEnhancedInternalEdgeRemoval;
+	settings.mShape = mShape;
+	settings.mID = mID;
+	settings.mMass = mMass;
+	settings.mMaxStrength = mMaxStrength;
+	settings.mShapeOffset = mShapeOffset;
+	settings.mBackFaceMode = mBackFaceMode;
+	settings.mPredictiveContactDistance = mPredictiveContactDistance;
+	settings.mMaxCollisionIterations = mMaxCollisionIterations;
+	settings.mMaxConstraintIterations = mMaxConstraintIterations;
+	settings.mMinTimeRemaining = mMinTimeRemaining;
+	settings.mCollisionTolerance = mCollisionTolerance;
+	settings.mCharacterPadding = mCharacterPadding;
+	settings.mMaxNumHits = mMaxNumHits;
+	settings.mHitReductionCosMaxAngle = mHitReductionCosMaxAngle;
+	settings.mPenetrationRecoverySpeed = mPenetrationRecoverySpeed;
+	BodyLockRead lock(mSystem->GetBodyLockInterface(), mInnerBodyID);
+	if (lock.Succeeded())
+	{
+		const Body &body = lock.GetBody();
+		settings.mInnerBodyShape = body.GetShape();
+		settings.mInnerBodyIDOverride = body.GetID();
+		settings.mInnerBodyLayer = body.GetObjectLayer();
+	}
+	return settings;
+}
+
 JPH_NAMESPACE_END

+ 8 - 0
Jolt/Physics/Character/CharacterVirtual.h

@@ -24,6 +24,11 @@ class JPH_EXPORT CharacterVirtualSettings : public CharacterBaseSettings
 public:
 	JPH_OVERRIDE_NEW_DELETE
 
+	/// Constructor
+										CharacterVirtualSettings() = default;
+										CharacterVirtualSettings(const CharacterVirtualSettings &) = default;
+	CharacterVirtualSettings &			operator = (const CharacterVirtualSettings &) = default;
+
 	/// ID to give to this character. This is used for deterministically sorting and as an identifier to represent the character in the contact removal callback.
 	CharacterID							mID = CharacterID::sNextCharacterID();
 
@@ -419,6 +424,9 @@ public:
 	/// @param inShapeFilter Filter that is used to check if a character collides with a subshape.
 	void								CheckCollision(RVec3Arg inPosition, QuatArg inRotation, Vec3Arg inMovementDirection, float inMaxSeparationDistance, const Shape *inShape, RVec3Arg inBaseOffset, CollideShapeCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter, const BodyFilter &inBodyFilter, const ShapeFilter &inShapeFilter) const;
 
+	/// Get the character settings that can recreate this character
+	CharacterVirtualSettings			GetCharacterVirtualSettings() const;
+
 	// Saving / restoring state for replay
 	virtual void						SaveState(StateRecorder &inStream) const override;
 	virtual void						RestoreState(StateRecorder &inStream) override;