diff options
| author | Léo Lam <leo@leolam.fr> | 2022-12-20 23:25:21 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2022-12-21 12:25:49 +0100 |
| commit | 25427f1b4cd1da799b392ceed1dd778fdc5daa4a (patch) | |
| tree | e0806b295db0c03c095d96274dc1fc63b9d7f990 /lib | |
| parent | 3fc168ab9953a0ab20fa3660f4f73dd361419fb9 (diff) | |
ksys/phys: Add RagdollController (the real one, not RagdollInstance)
Diffstat (limited to 'lib')
3 files changed, 118 insertions, 0 deletions
diff --git a/lib/hkStubs/CMakeLists.txt b/lib/hkStubs/CMakeLists.txt index 616d12a2..2620fa6a 100644 --- a/lib/hkStubs/CMakeLists.txt +++ b/lib/hkStubs/CMakeLists.txt @@ -12,6 +12,8 @@ add_library(hkStubs OBJECT Havok/Animation/Animation/Rig/hkaBoneAttachment.h Havok/Animation/Animation/Rig/hkaSkeleton.h Havok/Animation/Animation/Rig/hkaPose.h + Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaKeyFrameHierarchyUtility.h + Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaRagdollRigidBodyController.h Havok/Animation/Physics2012Bridge/Instance/hkaRagdollInstance.h Havok/Common/Base/hkBase.h diff --git a/lib/hkStubs/Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaKeyFrameHierarchyUtility.h b/lib/hkStubs/Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaKeyFrameHierarchyUtility.h new file mode 100644 index 00000000..d2bb5a59 --- /dev/null +++ b/lib/hkStubs/Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaKeyFrameHierarchyUtility.h @@ -0,0 +1,82 @@ +#pragma once + +#include <Havok/Common/Base/hkBase.h> + +class hkpRigidBody; + +class hkaKeyFrameHierarchyUtility { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkaKeyFrameHierarchyUtility) + HK_DECLARE_REFLECTION() + + struct ControlData { + HK_DECLARE_CLASS_ALLOCATOR(ControlData) + HK_DECLARE_REFLECTION() + + hkReal m_hierarchyGain; + hkReal m_velocityDamping; + hkReal m_accelerationGain; + hkReal m_velocityGain; + hkReal m_positionGain; + hkReal m_positionMaxLinearVelocity; + hkReal m_positionMaxAngularVelocity; + hkReal m_snapGain; + hkReal m_snapMaxLinearVelocity; + hkReal m_snapMaxAngularVelocity; + hkReal m_snapMaxLinearDistance; + hkReal m_snapMaxAngularDistance; + + ControlData() + : m_hierarchyGain(hkReal(0.17f)), m_velocityDamping(0), m_accelerationGain(1), + m_velocityGain(hkReal(0.6f)), m_positionGain(hkReal(0.05f)), + m_positionMaxLinearVelocity(hkReal(1.4f)), m_positionMaxAngularVelocity(hkReal(1.8f)), + m_snapGain(hkReal(0.1f)), m_snapMaxLinearVelocity(hkReal(0.3f)), + m_snapMaxAngularVelocity(hkReal(0.3f)), m_snapMaxLinearDistance(hkReal(0.03f)), + m_snapMaxAngularDistance(hkReal(0.1f)) {} + + explicit ControlData(hkFinishLoadedObjectFlag flag) {} + + hkBool isValid() const; + }; + + struct WorkElem { + HK_DECLARE_CLASS_ALLOCATOR(WorkElem) + + hkVector4 m_prevPosition; + hkQuaternion m_prevRotation; + hkVector4 m_prevLinearVelocity; + hkVector4 m_prevAngularVelocity; + }; + + struct KeyFrameData { + HK_DECLARE_CLASS_ALLOCATOR(KeyFrameData) + + hkQsTransform m_worldFromRoot; + /// The desired pose in local space, one transform for each rigid body + const hkQsTransform* m_desiredPoseLocalSpace; + WorkElem* m_internalReferencePose; + }; + + struct BodyData { + HK_DECLARE_CLASS_ALLOCATOR(BodyData) + + int m_numRigidBodies; + hkpRigidBody* const* m_rigidBodies; + const hkInt16* m_parentIndices; + int* m_controlDataIndices = nullptr; + const hkReal* m_boneWeights = nullptr; + }; + + struct Output { + HK_DECLARE_CLASS_ALLOCATOR(Output) + + hkReal m_stressSquared; + }; + + static void initialize(const hkpRigidBody* rb, WorkElem& workElem); + + static void initialize(const BodyData& bodies, WorkElem* internalReferencePose); + + static void applyKeyFrame(hkReal m_deltaTime, const KeyFrameData& pose, const BodyData& body, + const ControlData* controlPalette, Output* outputArray = nullptr); +}; diff --git a/lib/hkStubs/Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaRagdollRigidBodyController.h b/lib/hkStubs/Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaRagdollRigidBodyController.h new file mode 100644 index 00000000..a97216a4 --- /dev/null +++ b/lib/hkStubs/Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaRagdollRigidBodyController.h @@ -0,0 +1,34 @@ +#pragma once + +#include <Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaKeyFrameHierarchyUtility.h> +#include <Havok/Common/Base/hkBase.h> + +class hkaRagdollInstance; + +class hkaRagdollRigidBodyController { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkaRagdollRigidBodyController) + + explicit hkaRagdollRigidBodyController(hkaRagdollInstance* ragdoll); + ~hkaRagdollRigidBodyController(); + + void driveToPose(hkReal deltaTime, const hkQsTransform* poseLocalSpace, + const hkQsTransform& worldFromModel, + hkaKeyFrameHierarchyUtility::Output* stressOut); + + void reinitialize(); + void reinitialize(int boneIndex); + + const hkaRagdollInstance* getRagdollInstance() const; + + void setBoneWeights(const hkReal* boneWeights); + + hkArray<hkaKeyFrameHierarchyUtility::ControlData> m_controlDataPalette; + hkArray<int> m_bodyIndexToPaletteIndex; + +protected: + hkaKeyFrameHierarchyUtility::BodyData m_bodyData; + hkArray<hkaKeyFrameHierarchyUtility::WorkElem> m_internalData; + hkaRagdollInstance* m_ragdollInstance; + hkArray<hkInt16> m_rbParentIndices; +}; |
