summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2022-12-20 23:25:21 +0100
committerLéo Lam <leo@leolam.fr>2022-12-21 12:25:49 +0100
commit25427f1b4cd1da799b392ceed1dd778fdc5daa4a (patch)
treee0806b295db0c03c095d96274dc1fc63b9d7f990 /lib
parent3fc168ab9953a0ab20fa3660f4f73dd361419fb9 (diff)
ksys/phys: Add RagdollController (the real one, not RagdollInstance)
Diffstat (limited to 'lib')
-rw-r--r--lib/hkStubs/CMakeLists.txt2
-rw-r--r--lib/hkStubs/Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaKeyFrameHierarchyUtility.h82
-rw-r--r--lib/hkStubs/Havok/Animation/Physics2012Bridge/Controller/RigidBody/hkaRagdollRigidBodyController.h34
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;
+};