Plasma Engine  2.0
Loading...
Searching...
No Matches
AnimPoseGenerator.h
1#pragma once
2
3#include <Core/ResourceManager/ResourceHandle.h>
4#include <Foundation/Containers/ArrayMap.h>
5#include <Foundation/Types/UniquePtr.h>
6#include <RendererCore/RendererCoreDLL.h>
7
8#include <ozz/animation/runtime/sampling_job.h>
9#include <ozz/base/maths/soa_float.h>
10#include <ozz/base/maths/soa_transform.h>
11
12PL_DEFINE_AS_POD_TYPE(ozz::math::SoaTransform);
13
16class plGameObject;
17
19
20using plAnimPoseGeneratorLocalPoseID = plUInt32;
21using plAnimPoseGeneratorModelPoseID = plUInt32;
22using plAnimPoseGeneratorCommandID = plUInt32;
23
25enum class plAnimPoseGeneratorCommandType
26{
27 Invalid,
28 SampleTrack,
29 RestPose,
30 CombinePoses,
31 LocalToModelPose,
32 SampleEventTrack,
33 AimIK,
34 TwoBoneIK,
35};
36
37enum class plAnimPoseEventTrackSampleMode : plUInt8
38{
39 None,
40 OnlyBetween,
41 LoopAtEnd,
42 LoopAtStart,
43 BounceAtEnd,
44 BounceAtStart
45};
46
56struct PL_RENDERERCORE_DLL plAnimPoseGeneratorCommand
57{
59
60 plAnimPoseGeneratorCommandID GetCommandID() const { return m_CommandID; }
61 plAnimPoseGeneratorCommandType GetType() const { return m_Type; }
62
63private:
64 friend class plAnimPoseGenerator;
65
66 bool m_bExecuted = false;
67 plAnimPoseGeneratorCommandID m_CommandID = plInvalidIndex;
68 plAnimPoseGeneratorCommandType m_Type = plAnimPoseGeneratorCommandType::Invalid;
69};
70
76struct PL_RENDERERCORE_DLL plAnimPoseGeneratorCommandRestPose final : public plAnimPoseGeneratorCommand
77{
78private:
79 friend class plAnimPoseGenerator;
80
81 plAnimPoseGeneratorLocalPoseID m_LocalPoseOutput = plInvalidIndex;
82};
83
94{
95 plAnimationClipResourceHandle m_hAnimationClip;
96 float m_fNormalizedSamplePos;
97 float m_fPreviousNormalizedSamplePos;
98
99 plAnimPoseEventTrackSampleMode m_EventSampling = plAnimPoseEventTrackSampleMode::None;
100
101private:
102 friend class plAnimPoseGenerator;
103
104 bool m_bAdditive = false;
105 plUInt32 m_uiUniqueID = 0;
106 plAnimPoseGeneratorLocalPoseID m_LocalPoseOutput = plInvalidIndex;
107};
108
119{
120 plHybridArray<float, 4> m_InputWeights;
122
123private:
124 friend class plAnimPoseGenerator;
125
126 plAnimPoseGeneratorLocalPoseID m_LocalPoseOutput = plInvalidIndex;
127};
128
137{
138 plAnimationClipResourceHandle m_hAnimationClip;
139 float m_fNormalizedSamplePos;
140 float m_fPreviousNormalizedSamplePos;
141
142 plAnimPoseEventTrackSampleMode m_EventSampling = plAnimPoseEventTrackSampleMode::None;
143
144private:
145 friend class plAnimPoseGenerator;
146
147 plUInt32 m_uiUniqueID = 0;
148};
149
151{
152protected:
153 friend class plAnimPoseGenerator;
154
155 plAnimPoseGeneratorModelPoseID m_ModelPoseOutput = plInvalidIndex;
156 plAnimPoseGeneratorLocalPoseID m_LocalPoseOutput = plInvalidIndex;
157};
158
166{
167 plGameObject* m_pSendLocalPoseMsgTo = nullptr;
168};
169
171{
172 plVec3 m_vTargetPosition;
173 plTempHashedString m_sJointName;
174 float m_fWeight = 1.0f;
175 plVec3 m_vForwardVector = plVec3::MakeAxisX();
176 plVec3 m_vUpVector = plVec3::MakeAxisZ();
177 plVec3 m_vPoleVector = plVec3::MakeAxisY();
178};
179
181{
182 plVec3 m_vTargetPosition;
183 plTempHashedString m_sJointNameStart;
184 plTempHashedString m_sJointNameMiddle;
185 plTempHashedString m_sJointNameEnd;
186 plVec3 m_vMidAxis = plVec3::MakeAxisZ();
187 plVec3 m_vPoleVector = plVec3::MakeAxisY();
188 float m_fWeight = 1.0f;
189 float m_fSoften = 1.0f;
190 plAngle m_TwistAngle;
191};
192
193class PL_RENDERERCORE_DLL plAnimPoseGenerator final
194{
195public:
198
199 void Reset(const plSkeletonResource* pSkeleton);
200
201 plAnimPoseGeneratorCommandSampleTrack& AllocCommandSampleTrack(plUInt32 uiDeterministicID);
202 plAnimPoseGeneratorCommandRestPose& AllocCommandRestPose();
203 plAnimPoseGeneratorCommandCombinePoses& AllocCommandCombinePoses();
204 plAnimPoseGeneratorCommandLocalToModelPose& AllocCommandLocalToModelPose();
205 plAnimPoseGeneratorCommandSampleEventTrack& AllocCommandSampleEventTrack();
206 plAnimPoseGeneratorCommandAimIK& AllocCommandAimIK();
207 plAnimPoseGeneratorCommandTwoBoneIK& AllocCommandTwoBoneIK();
208
209 const plAnimPoseGeneratorCommand& GetCommand(plAnimPoseGeneratorCommandID id) const;
210 plAnimPoseGeneratorCommand& GetCommand(plAnimPoseGeneratorCommandID id);
211
212 plArrayPtr<plMat4> GeneratePose(const plGameObject* pSendAnimationEventsTo);
213
214 void SetFinalCommand(plAnimPoseGeneratorCommandID cmdId) { m_FinalCommand = cmdId; }
215 plAnimPoseGeneratorCommandID GetFinalCommand() const { return m_FinalCommand; }
216
217 plArrayPtr<plMat4> GetCurrentPose() const { return m_OutputPose; }
218
219 const plSkeletonResource* GetSkeleton() const { return m_pSkeleton; }
220
221private:
222 void Validate() const;
223
224 void Execute(plAnimPoseGeneratorCommand& cmd, const plGameObject* pSendAnimationEventsTo);
225 void ExecuteCmd(plAnimPoseGeneratorCommandSampleTrack& cmd, const plGameObject* pSendAnimationEventsTo);
226 void ExecuteCmd(plAnimPoseGeneratorCommandRestPose& cmd);
227 void ExecuteCmd(plAnimPoseGeneratorCommandCombinePoses& cmd);
228 void ExecuteCmd(plAnimPoseGeneratorCommandLocalToModelPose& cmd, const plGameObject* pSendAnimationEventsTo);
229 void ExecuteCmd(plAnimPoseGeneratorCommandSampleEventTrack& cmd, const plGameObject* pSendAnimationEventsTo);
230 void ExecuteCmd(plAnimPoseGeneratorCommandAimIK& cmd);
231 void ExecuteCmd(plAnimPoseGeneratorCommandTwoBoneIK& cmd);
232 void SampleEventTrack(const plAnimationClipResource* pResource, plAnimPoseEventTrackSampleMode mode, const plGameObject* pSendAnimationEventsTo, float fPrevPos, float fCurPos);
233
234 plArrayPtr<ozz::math::SoaTransform> AcquireLocalPoseTransforms(plAnimPoseGeneratorLocalPoseID id);
235 plArrayPtr<plMat4> AcquireModelPoseTransforms(plAnimPoseGeneratorModelPoseID id);
236
237 const plSkeletonResource* m_pSkeleton = nullptr;
238
239 plArrayPtr<plMat4> m_OutputPose;
240
241 plAnimPoseGeneratorLocalPoseID m_LocalPoseCounter = 0;
242 plAnimPoseGeneratorModelPoseID m_ModelPoseCounter = 0;
243
244 plAnimPoseGeneratorCommandID m_FinalCommand = 0;
245
248
256
258};
Float wrapper struct for a safe usage and conversions of angles.
Definition Angle.h:10
Definition AnimPoseGenerator.h:194
Definition AnimationClipResource.h:100
See plArrayMapBase for details.
Definition ArrayMap.h:149
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
This class represents an object inside the world.
Definition GameObject.h:32
@ None
Only sets the local transform, does not update.
A hybrid array uses in-place storage to handle the first few elements without any allocation....
Definition HybridArray.h:12
Definition SkeletonResource.h:47
A class to use together with plHashedString for quick comparisons with temporary strings that need no...
Definition HashedString.h:151
static plVec3Template< float > MakeAxisX()
Definition Vec3.h:41
static plVec3Template< float > MakeAxisY()
Definition Vec3.h:44
static plVec3Template< float > MakeAxisZ()
Definition Vec3.h:47
Definition AnimPoseGenerator.h:171
Combines all the local space poses that are given as input into one local pose.
Definition AnimPoseGenerator.h:119
Base class for all pose generator commands.
Definition AnimPoseGenerator.h:57
Accepts a single input in local space and converts it to model space.
Definition AnimPoseGenerator.h:166
Definition AnimPoseGenerator.h:151
Returns the rest pose (also often called 'bind pose').
Definition AnimPoseGenerator.h:77
Samples the event track of an animation clip but doesn't generate an animation pose.
Definition AnimPoseGenerator.h:137
Samples an animation clip at a given time and optionally also its event track.
Definition AnimPoseGenerator.h:94
Definition AnimPoseGenerator.h:181