瀏覽代碼

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

Also provided copy constructors for the character settings

See #1655
Jorrit Rouwe 1 月之前
父節點
當前提交
3ed3a7d6d8

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

@@ -330,4 +330,25 @@ TransformedShape Character::GetTransformedShape(bool inLockBodies) const
 	return sCharacterGetBodyInterface(mSystem, inLockBodies).GetTransformedShape(mBodyID);
 	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
 JPH_NAMESPACE_END

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

@@ -18,6 +18,11 @@ class JPH_EXPORT CharacterSettings : public CharacterBaseSettings
 public:
 public:
 	JPH_OVERRIDE_NEW_DELETE
 	JPH_OVERRIDE_NEW_DELETE
 
 
+	/// Constructor
+										CharacterSettings() = default;
+										CharacterSettings(const CharacterSettings &) = default;
+	CharacterSettings &					operator = (const CharacterSettings &) = default;
+
 	/// Layer that this character will be added to
 	/// Layer that this character will be added to
 	ObjectLayer							mLayer = 0;
 	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)
 	/// @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;
 	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:
 private:
 	/// Check collisions between inShape and the world using the center of mass transform
 	/// 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;
 	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
 	/// Constructor
 										CharacterBaseSettings() = default;
 										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 destructor
 	virtual								~CharacterBaseSettings() = default;
 	virtual								~CharacterBaseSettings() = default;

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

@@ -1888,4 +1888,37 @@ void CharacterVirtual::RestoreState(StateRecorder &inStream)
 		c.RestoreState(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
 JPH_NAMESPACE_END

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

@@ -24,6 +24,11 @@ class JPH_EXPORT CharacterVirtualSettings : public CharacterBaseSettings
 public:
 public:
 	JPH_OVERRIDE_NEW_DELETE
 	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.
 	/// 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();
 	CharacterID							mID = CharacterID::sNextCharacterID();
 
 
@@ -419,6 +424,9 @@ public:
 	/// @param inShapeFilter Filter that is used to check if a character collides with a subshape.
 	/// @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;
 	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
 	// Saving / restoring state for replay
 	virtual void						SaveState(StateRecorder &inStream) const override;
 	virtual void						SaveState(StateRecorder &inStream) const override;
 	virtual void						RestoreState(StateRecorder &inStream) override;
 	virtual void						RestoreState(StateRecorder &inStream) override;