From ddbc76cc7d741c6844f3a826deef4bee156e6be7 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Sat, 6 Nov 2021 13:48:53 +0100 Subject: [PATCH] Add utility `SetLinearVelocity` and `SetAngularVelocity` for a whole ragdoll --- Source/Engine/Level/Actors/Ragdoll.cpp | 22 ++++++++++++++++++++++ Source/Engine/Level/Actors/Ragdoll.h | 10 ++++++++++ 2 files changed, 32 insertions(+) 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);