Overte C++ Documentation
AnimSplineIK.h
1 //
2 // AnimSplineIK.h
3 //
4 // Created by Angus Antley on 1/7/19.
5 // Copyright (c) 2019 High Fidelity, Inc. All rights reserved.
6 //
7 // Distributed under the Apache License, Version 2.0.
8 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9 //
10 
11 #ifndef hifi_AnimSplineIK_h
12 #define hifi_AnimSplineIK_h
13 
14 #include "AnimNode.h"
15 #include "IKTarget.h"
16 #include "AnimChain.h"
17 
18 static const int MAX_NUMBER_FLEX_VARIABLES = 10;
19 
20 // Spline IK for the spine
21 class AnimSplineIK : public AnimNode {
22 public:
23  AnimSplineIK(const QString& id, float alpha, bool enabled, float interpDuration,
24  const QString& baseJointName, const QString& midJointName, const QString& tipJointName,
25  const QString& basePositionVar, const QString& baseRotationVar,
26  const QString& midPositionVar, const QString& midRotationVar,
27  const QString& tipPositionVar, const QString& tipRotationVar,
28  const QString& alphaVar, const QString& enabledVar,
29  const std::vector<float> tipTargetFlexCoefficients,
30  const std::vector<float> midTargetFlexCoefficients);
31 
32  virtual ~AnimSplineIK() override;
33  virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, AnimVariantMap& triggersOut) override;
34 
35 protected:
36 
37  enum class InterpType {
38  None = 0,
39  SnapshotToUnderPoses,
40  SnapshotToSolve,
41  NumTypes
42  };
43 
44  void computeAbsolutePoses(AnimPoseVec& absolutePoses) const;
45  void loadPoses(const AnimPoseVec& poses);
46 
47  // for AnimDebugDraw rendering
48  virtual const AnimPoseVec& getPosesInternal() const override;
49  virtual void setSkeletonInternal(AnimSkeleton::ConstPointer skeleton) override;
50 
51  void lookUpIndices();
52  void beginInterp(InterpType interpType, const AnimChain& chain);
53 
54  AnimPoseVec _poses;
55 
56  float _alpha;
57  bool _enabled;
58  float _interpDuration;
59  QString _baseJointName;
60  QString _midJointName;
61  QString _tipJointName;
62  QString _basePositionVar;
63  QString _baseRotationVar;
64  QString _midPositionVar;
65  QString _midRotationVar;
66  QString _tipPositionVar;
67  QString _tipRotationVar;
68  QString _alphaVar; // float - (0, 1) 0 means underPoses only, 1 means IK only.
69  QString _enabledVar;
70 
71  float _tipTargetFlexCoefficients[MAX_NUMBER_FLEX_VARIABLES];
72  float _midTargetFlexCoefficients[MAX_NUMBER_FLEX_VARIABLES];
73  int _numTipTargetFlexCoefficients { 0 };
74  int _numMidTargetFlexCoefficients { 0 };
75 
76  int _baseJointIndex { -1 };
77  int _midJointIndex { -1 };
78  int _tipJointIndex { -1 };
79 
80  bool _previousEnableDebugIKTargets { false };
81 
82  InterpType _interpType{ InterpType::None };
83  float _interpAlphaVel{ 0.0f };
84  float _interpAlpha{ 0.0f };
85  AnimChain _snapshotChain;
86 
87  // used to pre-compute information about each joint influenced by a spline IK target.
88  struct SplineJointInfo {
89  int jointIndex; // joint in the skeleton that this information pertains to.
90  float ratio; // percentage (0..1) along the spline for this joint.
91  AnimPose offsetPose; // local offset from the spline to the joint.
92  };
93 
94  void solveTargetWithSpline(const AnimContext& context, int base, const IKTarget& target, const AnimPoseVec& absolutePoses, bool debug, AnimChain& chainInfoOut) const;
95  void computeAndCacheSplineJointInfosForIKTarget(const AnimContext& context, int base, const IKTarget& target) const;
96  const std::vector<SplineJointInfo>* findOrCreateSplineJointInfo(const AnimContext& context, int base, const IKTarget& target) const;
97  mutable std::map<int, std::vector<SplineJointInfo>> _splineJointInfoMap;
98 
99  // no copies
100  AnimSplineIK(const AnimSplineIK&) = delete;
101  AnimSplineIK& operator=(const AnimSplineIK&) = delete;
102 
103 };
104 #endif // hifi_AnimSplineIK_h