diff --git a/Source/Engine/Level/Actors/Ragdoll.cpp b/Source/Engine/Level/Actors/Ragdoll.cpp index 1e594746c..8259c61b4 100644 --- a/Source/Engine/Level/Actors/Ragdoll.cpp +++ b/Source/Engine/Level/Actors/Ragdoll.cpp @@ -27,6 +27,28 @@ float Ragdoll::GetTotalMass() const return result; } +void Ragdoll::SetLinearVelocity(const Vector3& value) const +{ + for (auto child : Children) + { + const auto rigidBody = Cast(child); + if (!rigidBody || !rigidBody->IsActiveInHierarchy()) + continue; + rigidBody->SetLinearVelocity(value); + } +} + +void Ragdoll::SetAngularVelocity(const Vector3& value) const +{ + for (auto child : Children) + { + const auto rigidBody = Cast(child); + if (!rigidBody || !rigidBody->IsActiveInHierarchy()) + continue; + rigidBody->SetAngularVelocity(value); + } +} + float Ragdoll::InitBone(RigidBody* rigidBody, int32& nodeIndex, Transform& localOffset) { // Bones with 0 weight are non-simulated (kinematic) diff --git a/Source/Engine/Level/Actors/Ragdoll.h b/Source/Engine/Level/Actors/Ragdoll.h index 2a8f1a0c3..9679a41aa 100644 --- a/Source/Engine/Level/Actors/Ragdoll.h +++ b/Source/Engine/Level/Actors/Ragdoll.h @@ -59,6 +59,16 @@ public: /// API_PROPERTY() float GetTotalMass() const; + /// + /// Sets the linear velocity of all rigidbodies in the ragdoll. + /// + API_FUNCTION() void SetLinearVelocity(const Vector3& value) const; + + /// + /// Sets the angular velocity of all rigidbodies in the ragdoll (in radians per second). + /// + API_FUNCTION() void SetAngularVelocity(const Vector3& value) const; + private: float InitBone(RigidBody* rigidBody, int32& nodeIndex, Transform& localPose);