22 #include <JointData.h>
23 #include <QReadWriteLock>
24 #include <ScriptValue.h>
27 #include "AnimNodeLoader.h"
28 #include "SimpleMovingAverage.h"
31 #include "AvatarConstants.h"
34 class AnimInverseKinematics;
39 class Rig :
public QObject {
43 AnimVariantMap results;
44 QStringList propertyNames;
45 std::shared_ptr<ScriptValue>
function;
49 enum PrimaryControllerType {
50 PrimaryControllerType_Head = 0,
51 PrimaryControllerType_LeftHand,
52 PrimaryControllerType_RightHand,
53 PrimaryControllerType_Hips,
54 PrimaryControllerType_LeftFoot,
55 PrimaryControllerType_RightFoot,
56 PrimaryControllerType_Spine2,
57 NumPrimaryControllerTypes
61 enum SecondaryControllerType {
62 SecondaryControllerType_LeftShoulder = 0,
63 SecondaryControllerType_RightShoulder,
64 SecondaryControllerType_LeftArm,
65 SecondaryControllerType_RightArm,
66 SecondaryControllerType_LeftForeArm,
67 SecondaryControllerType_RightForeArm,
68 SecondaryControllerType_LeftUpLeg,
69 SecondaryControllerType_RightUpLeg,
70 SecondaryControllerType_LeftLeg,
71 SecondaryControllerType_RightLeg,
72 SecondaryControllerType_LeftToeBase,
73 SecondaryControllerType_RightToeBase,
74 NumSecondaryControllerTypes
77 enum class ControllerFlags : uint8_t {
82 struct ControllerParameters {
83 ControllerParameters() {
84 memset(primaryControllerFlags, 0, NumPrimaryControllerTypes);
85 memset(secondaryControllerFlags, 0, NumPrimaryControllerTypes);
87 glm::mat4 rigToSensorMatrix;
88 AnimPose primaryControllerPoses[NumPrimaryControllerTypes];
89 uint8_t primaryControllerFlags[NumPrimaryControllerTypes];
90 AnimPose secondaryControllerPoses[NumSecondaryControllerTypes];
91 uint8_t secondaryControllerFlags[NumSecondaryControllerTypes];
95 bool reactionEnabledFlags[NUM_AVATAR_BEGIN_END_REACTIONS];
96 bool reactionTriggers[NUM_AVATAR_TRIGGER_REACTIONS];
97 HFMJointShapeInfo hipsShapeInfo;
98 HFMJointShapeInfo spineShapeInfo;
99 HFMJointShapeInfo spine1ShapeInfo;
100 HFMJointShapeInfo spine2ShapeInfo;
103 struct EyeParameters {
104 glm::vec3 eyeLookAt = glm::vec3();
105 glm::vec3 eyeSaccade = glm::vec3();
106 glm::vec3 modelTranslation = glm::vec3();
107 glm::quat modelRotation = glm::quat();
108 int leftEyeJointIndex = -1;
109 int rightEyeJointIndex = -1;
112 enum class CharacterControllerState {
123 void destroyAnimGraph();
125 void overrideAnimation(
const QString& url,
float fps,
bool loop,
float firstFrame,
float lastFrame);
126 bool isPlayingOverrideAnimation()
const {
return _userAnimState.clipNodeEnum != UserAnimState::None; };
127 void restoreAnimation();
129 void overrideHandAnimation(
bool isLeft,
const QString& url,
float fps,
bool loop,
float firstFrame,
float lastFrame);
130 void restoreHandAnimation(
bool isLeft);
132 void overrideNetworkAnimation(
const QString& url,
float fps,
bool loop,
float firstFrame,
float lastFrame);
133 void triggerNetworkRole(
const QString& role);
134 void restoreNetworkAnimation();
136 QStringList getAnimationRoles()
const;
137 void overrideRoleAnimation(
const QString& role,
const QString& url,
float fps,
bool loop,
float firstFrame,
float lastFrame);
138 void restoreRoleAnimation(
const QString& role);
140 void initJointStates(
const HFMModel& hfmModel,
const glm::mat4& modelOffset);
141 void reset(
const HFMModel& hfmModel);
142 bool jointStatesEmpty()
const;
143 int getJointStateCount()
const;
144 int indexOfJoint(
const QString& jointName)
const;
145 QString nameOfJoint(
int jointIndex)
const;
147 void setModelOffset(
const glm::mat4& modelOffsetMat);
149 void clearJointState(
int index);
150 void clearJointStates();
151 void clearJointAnimationPriority(
int index);
153 std::shared_ptr<AnimInverseKinematics> getAnimInverseKinematicsNode()
const;
155 void clearIKJointLimitHistory();
156 void setMaxHipsOffsetLength(
float maxLength);
157 float getMaxHipsOffsetLength()
const;
159 float getIKErrorOnLastSolve()
const;
161 int getJointParentIndex(
int childIndex)
const;
164 void setJointState(
int index,
bool valid,
const glm::quat& rotation,
const glm::vec3& translation,
float priority);
167 void setJointTranslation(
int index,
bool valid,
const glm::vec3& translation,
float priority);
168 void setJointRotation(
int index,
bool valid,
const glm::quat& rotation,
float priority);
170 bool getIsJointOverridden(
int jointIndex)
const;
173 bool getJointPositionInWorldFrame(
int jointIndex, glm::vec3& position,
174 glm::vec3 translation, glm::quat rotation)
const;
177 bool getJointPosition(
int jointIndex, glm::vec3& position)
const;
180 bool getJointRotationInWorldFrame(
int jointIndex, glm::quat& result,
const glm::quat& rotation)
const;
183 bool getJointRotation(
int jointIndex, glm::quat& rotation)
const;
184 bool getJointTranslation(
int jointIndex, glm::vec3& translation)
const;
187 bool getAbsoluteJointRotationInRigFrame(
int jointIndex, glm::quat& rotation)
const;
188 bool getAbsoluteJointTranslationInRigFrame(
int jointIndex, glm::vec3& translation)
const;
189 bool getAbsoluteJointPoseInRigFrame(
int jointIndex, AnimPose& returnPose)
const;
192 glm::mat4 getJointTransform(
int jointIndex)
const;
193 AnimPose getJointPose(
int jointIndex)
const;
196 void computeMotionAnimationState(
float deltaTime,
const glm::vec3& worldPosition,
const glm::vec3& worldVelocity,
197 const glm::quat& worldRotation, CharacterControllerState ccState,
float sensorToWorldScale);
200 void updateAnimations(
float deltaTime,
const glm::mat4& rootTransform,
const glm::mat4& rigToWorldTransform);
202 void updateFromControllerParameters(
const ControllerParameters& params,
float dt);
203 void updateFromEyeParameters(
const EyeParameters& params);
205 void initAnimGraph(
const QUrl& url);
207 AnimNode::ConstPointer getAnimNode()
const {
return _animNode; }
208 AnimNode::ConstPointer findAnimNodeByName(
const QString& name)
const;
209 AnimSkeleton::ConstPointer getAnimSkeleton()
const {
return _animSkeleton; }
211 void removeAnimationStateHandler(
const ScriptValue& handler);
212 void animationStateHandlerResult(
int identifier,
const ScriptValue& result);
215 bool getModelRegistrationPoint(glm::vec3& modelRegistrationPointOut)
const;
218 AnimPose getAbsoluteDefaultPose(
int index)
const;
221 const AnimPoseVec& getAbsoluteDefaultPoses()
const;
224 bool getRelativeDefaultJointRotation(
int index, glm::quat& rotationOut)
const;
225 bool getRelativeDefaultJointTranslation(
int index, glm::vec3& translationOut)
const;
227 void copyJointsIntoJointData(QVector<JointData>& jointDataVec)
const;
228 void copyJointsFromJointData(
const QVector<JointData>& jointDataVec);
229 void computeExternalPoses(
const glm::mat4& modelOffsetMat);
231 void computeAvatarBoundingCapsule(
const HFMModel& hfmModel,
float& radiusOut,
float& heightOut, glm::vec3& offsetOut)
const;
233 void setEnableInverseKinematics(
bool enable);
234 void setEnableAnimations(
bool enable);
236 const glm::mat4& getGeometryToRigTransform()
const {
return _geometryToRigTransform; }
238 const AnimPose& getModelOffsetPose()
const {
return _modelOffset; }
239 const AnimPose& getGeometryOffsetPose()
const {
return _geometryOffset; }
241 void setEnableDebugDrawIKTargets(
bool enableDebugDrawIKTargets) { _enableDebugDrawIKTargets = enableDebugDrawIKTargets; }
242 void setEnableDebugDrawIKConstraints(
bool enableDebugDrawIKConstraints) { _enableDebugDrawIKConstraints = enableDebugDrawIKConstraints; }
243 void setEnableDebugDrawIKChains(
bool enableDebugDrawIKChains) { _enableDebugDrawIKChains = enableDebugDrawIKChains; }
246 void computeHeadFromHMD(
const AnimPose& hmdPose, glm::vec3& headPositionOut, glm::quat& headOrientationOut)
const;
249 const AnimContext::DebugAlphaMap& getDebugAlphaMap()
const {
return _lastContext.getDebugAlphaMap(); }
250 const AnimVariantMap& getAnimVars()
const {
return _lastAnimVars; }
251 const AnimContext::DebugStateMachineMap& getStateMachineMap()
const {
return _lastContext.getStateMachineMap(); }
252 void initFlow(
bool isActive);
253 Flow& getFlow() {
return _internalFlow; }
255 float getUnscaledEyeHeight()
const;
256 float getUnscaledHipsHeight()
const;
257 void buildAbsoluteRigPoses(
const AnimPoseVec& relativePoses, AnimPoseVec& absolutePosesOut)
const;
259 int getOverrideJointCount()
const;
260 bool getFlowActive()
const;
261 bool getNetworkGraphActive()
const;
262 void setDirectionalBlending(
const QString& targetName,
const glm::vec3& blendingTarget,
const QString& alphaName,
float alpha);
265 float GetScaleFactorGeometryToUnscaledRig()
const;
268 void onLoadComplete();
272 bool isIndexValid(
int index)
const {
return _animSkeleton && index >= 0 && index < _animSkeleton->getNumJoints(); }
273 void updateAnimationStateHandlers();
274 void applyOverridePoses();
276 void updateHead(
bool headEnabled,
bool hipsEnabled,
const AnimPose& headMatrix);
277 void updateHands(
bool leftHandEnabled,
bool rightHandEnabled,
bool hipsEnabled,
bool hipsEstimated,
278 bool leftArmEnabled,
bool rightArmEnabled,
bool headEnabled,
float dt,
279 const AnimPose& leftHandPose,
const AnimPose& rightHandPose,
280 const HFMJointShapeInfo& hipsShapeInfo,
const HFMJointShapeInfo& spineShapeInfo,
281 const HFMJointShapeInfo& spine1ShapeInfo,
const HFMJointShapeInfo& spine2ShapeInfo,
282 const glm::mat4& rigToSensorMatrix,
const glm::mat4& sensorToRigMatrix);
283 void updateFeet(
bool leftFootEnabled,
bool rightFootEnabled,
bool headEnabled,
284 const AnimPose& leftFootPose,
const AnimPose& rightFootPose,
285 const glm::mat4& rigToSensorMatrix,
const glm::mat4& sensorToRigMatrix);
286 void updateReactions(
const ControllerParameters& params);
288 void updateEyeJoint(
int index,
const glm::vec3& modelTranslation,
const glm::quat& modelRotation,
const glm::vec3& lookAt,
const glm::vec3& saccade);
289 void calcAnimAlpha(
float speed,
const std::vector<float>& referenceSpeeds,
float* alphaOut)
const;
291 bool calculateElbowPoleVector(
int handIndex,
int elbowIndex,
int armIndex,
int oppositeArmIndex, glm::vec3& poleVector)
const;
292 glm::vec3 calculateKneePoleVector(
int footJointIndex,
int kneeJoint,
int upLegIndex,
int hipsIndex,
const AnimPose& targetFootPose)
const;
293 glm::vec3 deflectHandFromTorso(
const glm::vec3& handPosition,
const HFMJointShapeInfo& hipsShapeInfo,
const HFMJointShapeInfo& spineShapeInfo,
294 const HFMJointShapeInfo& spine1ShapeInfo,
const HFMJointShapeInfo& spine2ShapeInfo)
const;
297 static constexpr
float GEOMETRY_GROUND_Y = 0.0f;
299 AnimPose _modelOffset;
300 AnimPose _geometryOffset;
301 AnimPose _invGeometryOffset;
304 AnimPoseVec _relativePoses;
305 AnimPoseVec _absolutePoses;
306 AnimPoseVec _overridePoses;
307 std::vector<bool> _overrideFlags;
311 PoseSet _internalPoseSet;
312 PoseSet _networkPoseSet;
315 PoseSet _externalPoseSet;
316 mutable QReadWriteLock _externalPoseSetLock;
318 AnimPoseVec _absoluteDefaultPoses;
320 glm::mat4 _geometryToRigTransform;
321 glm::mat4 _rigToGeometryTransform;
323 int _rootJointIndex { -1 };
325 int _leftEyeJointIndex { -1 };
326 int _rightEyeJointIndex { -1 };
327 std::vector<int> _leftEyeJointChildren;
328 std::vector<int> _rightEyeJointChildren;
330 int _leftHandJointIndex { -1 };
331 int _leftElbowJointIndex { -1 };
332 int _leftShoulderJointIndex { -1 };
334 int _rightHandJointIndex { -1 };
335 int _rightElbowJointIndex { -1 };
336 int _rightShoulderJointIndex { -1 };
338 glm::vec3 _lastForward;
339 glm::vec3 _lastPosition;
340 glm::vec3 _lastVelocity;
341 bool _isMovingWithMomentum{
false };
344 std::shared_ptr<AnimNode> _animNode;
345 std::shared_ptr<AnimNode> _networkNode;
346 std::shared_ptr<AnimSkeleton> _animSkeleton;
347 std::unique_ptr<AnimNodeLoader> _animLoader;
348 std::unique_ptr<AnimNodeLoader> _networkLoader;
349 AnimVariantMap _animVars;
350 AnimVariantMap _networkVars;
361 RigRole _state { RigRole::Idle };
362 RigRole _desiredState { RigRole::Idle };
363 float _desiredStateAge { 0.0f };
365 struct NetworkAnimState {
374 NetworkAnimState() : clipNodeEnum(NetworkAnimState::None), fps(30.0f), loop(false), firstFrame(0.0f), lastFrame(0.0f), blendTime(FLT_MAX) {}
375 NetworkAnimState(ClipNodeEnum clipNodeEnumIn,
const QString& urlIn,
float fpsIn,
bool loopIn,
float firstFrameIn,
float lastFrameIn) :
376 clipNodeEnum(clipNodeEnumIn), url(urlIn), fps(fpsIn), loop(loopIn), firstFrame(firstFrameIn), lastFrame(lastFrameIn), blendTime(FLT_MAX) {}
378 ClipNodeEnum clipNodeEnum;
387 struct HandAnimState {
394 HandAnimState() : clipNodeEnum(HandAnimState::None) {}
395 HandAnimState(ClipNodeEnum clipNodeEnumIn,
const QString& urlIn,
float fpsIn,
bool loopIn,
float firstFrameIn,
float lastFrameIn) :
396 clipNodeEnum(clipNodeEnumIn), url(urlIn), fps(fpsIn), loop(loopIn), firstFrame(firstFrameIn), lastFrame(lastFrameIn) {
400 ClipNodeEnum clipNodeEnum;
408 struct UserAnimState {
415 UserAnimState() : clipNodeEnum(UserAnimState::None) {}
416 UserAnimState(ClipNodeEnum clipNodeEnumIn,
const QString& urlIn,
float fpsIn,
bool loopIn,
float firstFrameIn,
float lastFrameIn) :
417 clipNodeEnum(clipNodeEnumIn), url(urlIn), fps(fpsIn), loop(loopIn), firstFrame(firstFrameIn), lastFrame(lastFrameIn) {}
419 ClipNodeEnum clipNodeEnum;
427 struct RoleAnimState {
429 RoleAnimState(
const QString& roleId,
const QString& urlIn,
float fpsIn,
bool loopIn,
float firstFrameIn,
float lastFrameIn) :
430 role(roleId), url(urlIn), fps(fpsIn), loop(loopIn), firstFrame(firstFrameIn), lastFrame(lastFrameIn) {}
440 UserAnimState _userAnimState;
441 NetworkAnimState _networkAnimState;
442 HandAnimState _rightHandAnimState;
443 HandAnimState _leftHandAnimState;
444 std::map<QString, RoleAnimState> _roleAnimStates;
445 int _evaluationCount{ 0 };
447 float _leftHandOverlayAlpha { 0.0f };
448 float _rightHandOverlayAlpha { 0.0f };
449 float _talkIdleInterpTime { 0.0f };
450 bool _previousIsTalking {
false };
452 SimpleMovingAverage _averageForwardSpeed { 10 };
453 SimpleMovingAverage _averageLateralSpeed { 10 };
455 std::map<QString, AnimNode::Pointer> _origRoleAnimations;
457 int32_t _numOverrides { 0 };
458 bool _lastEnableInverseKinematics {
true };
459 bool _enableInverseKinematics {
true };
460 bool _enabledAnimations {
true };
462 mutable uint32_t _jointNameWarningCount { 0 };
464 bool _enableDebugDrawIKTargets {
false };
465 bool _enableDebugDrawIKConstraints {
false };
466 bool _enableDebugDrawIKChains {
false };
468 QMap<int, StateHandler> _stateHandlers;
469 int _nextStateHandlerId { 0 };
472 glm::vec3 _prevRightFootPoleVector { Vectors::UNIT_Z };
473 bool _prevRightFootPoleVectorValid {
false };
475 glm::vec3 _prevLeftFootPoleVector { Vectors::UNIT_Z };
476 bool _prevLeftFootPoleVectorValid {
false };
479 bool _headEnabled {
false };
480 bool _computeNetworkAnimation {
false };
481 bool _sendNetworkNode {
false };
483 AnimContext _lastContext;
484 AnimVariantMap _lastAnimVars;
486 SnapshotBlendPoseHelper _hipsBlendHelper;
487 ControllerParameters _previousControllerParameters;
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40
The runtime model format.
Definition: HFM.h:302