11 #ifndef hifi_AnimSplineIK_h
12 #define hifi_AnimSplineIK_h
16 #include "AnimChain.h"
18 static const int MAX_NUMBER_FLEX_VARIABLES = 10;
21 class AnimSplineIK :
public AnimNode {
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);
32 virtual ~AnimSplineIK()
override;
33 virtual const AnimPoseVec& evaluate(
const AnimVariantMap& animVars,
const AnimContext& context,
float dt, AnimVariantMap& triggersOut)
override;
37 enum class InterpType {
44 void computeAbsolutePoses(AnimPoseVec& absolutePoses)
const;
45 void loadPoses(
const AnimPoseVec& poses);
48 virtual const AnimPoseVec& getPosesInternal()
const override;
49 virtual void setSkeletonInternal(AnimSkeleton::ConstPointer skeleton)
override;
52 void beginInterp(InterpType interpType,
const AnimChain& chain);
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;
71 float _tipTargetFlexCoefficients[MAX_NUMBER_FLEX_VARIABLES];
72 float _midTargetFlexCoefficients[MAX_NUMBER_FLEX_VARIABLES];
73 int _numTipTargetFlexCoefficients { 0 };
74 int _numMidTargetFlexCoefficients { 0 };
76 int _baseJointIndex { -1 };
77 int _midJointIndex { -1 };
78 int _tipJointIndex { -1 };
80 bool _previousEnableDebugIKTargets {
false };
82 InterpType _interpType{ InterpType::None };
83 float _interpAlphaVel{ 0.0f };
84 float _interpAlpha{ 0.0f };
85 AnimChain _snapshotChain;
88 struct SplineJointInfo {
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;
100 AnimSplineIK(
const AnimSplineIK&) =
delete;
101 AnimSplineIK& operator=(
const AnimSplineIK&) =
delete;