Merge branch 'fix-root-motion' of https://github.com/nothingTVatYT/FlaxEngine into nothingTVatYT-fix-root-motion
This commit is contained in:
@@ -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)
|
void RigidBody::OnCollisionEnter(const Collision& c)
|
||||||
{
|
{
|
||||||
CollisionEnter(c);
|
CollisionEnter(c);
|
||||||
|
|||||||
@@ -486,6 +486,7 @@ public:
|
|||||||
// [Actor]
|
// [Actor]
|
||||||
void Serialize(SerializeStream& stream, const void* otherObj) override;
|
void Serialize(SerializeStream& stream, const void* otherObj) override;
|
||||||
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override;
|
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override;
|
||||||
|
void AddMovement(const Vector3& translation, const Quaternion& rotation) override;
|
||||||
|
|
||||||
// [IPhysicsActor]
|
// [IPhysicsActor]
|
||||||
void* GetPhysicsActor() const override;
|
void* GetPhysicsActor() const override;
|
||||||
|
|||||||
Reference in New Issue
Block a user