Merge branch 'fix-root-motion' of https://github.com/nothingTVatYT/FlaxEngine into nothingTVatYT-fix-root-motion

This commit is contained in:
Wojtek Figat
2024-02-06 16:10:20 +01:00
2 changed files with 39 additions and 0 deletions

View File

@@ -300,6 +300,44 @@ void RigidBody::ClosestPoint(const Vector3& position, Vector3& result) const
}
}
void RigidBody::AddMovement(const Vector3& translation, const Quaternion& rotation)
{
// filter rotation according to constraints
Quaternion allowedRotation;
if (EnumHasAllFlags(GetConstraints(), RigidbodyConstraints::LockRotation))
allowedRotation = Quaternion::Identity;
else
{
Float3 euler = rotation.GetEuler();
if (EnumHasAnyFlags(GetConstraints(), RigidbodyConstraints::LockRotationX))
euler.X = 0;
if (EnumHasAnyFlags(GetConstraints(), RigidbodyConstraints::LockRotationY))
euler.Y = 0;
if (EnumHasAnyFlags(GetConstraints(), RigidbodyConstraints::LockRotationZ))
euler.Z = 0;
allowedRotation = Quaternion::Euler(euler);
}
// filter translation according to the constraints
auto allowedTranslation = translation;
if (EnumHasAllFlags(GetConstraints(), RigidbodyConstraints::LockPosition))
allowedTranslation = Vector3::Zero;
else
{
if (EnumHasAnyFlags(GetConstraints(), RigidbodyConstraints::LockPositionX))
allowedTranslation.X = 0;
if (EnumHasAnyFlags(GetConstraints(), RigidbodyConstraints::LockPositionY))
allowedTranslation.Y = 0;
if (EnumHasAnyFlags(GetConstraints(), RigidbodyConstraints::LockPositionZ))
allowedTranslation.Z = 0;
}
Transform t;
t.Translation = _transform.Translation + allowedTranslation;
t.Orientation = _transform.Orientation * allowedRotation;
t.Scale = _transform.Scale;
SetTransform(t);
}
void RigidBody::OnCollisionEnter(const Collision& c)
{
CollisionEnter(c);

View File

@@ -486,6 +486,7 @@ public:
// [Actor]
void Serialize(SerializeStream& stream, const void* otherObj) override;
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override;
void AddMovement(const Vector3& translation, const Quaternion& rotation) override;
// [IPhysicsActor]
void* GetPhysicsActor() const override;