11 #ifndef hifi_AnimTwoBoneIK_h
12 #define hifi_AnimTwoBoneIK_h
15 #include "AnimChain.h"
18 class AnimTwoBoneIK :
public AnimNode {
20 friend class AnimTests;
22 AnimTwoBoneIK(
const QString&
id,
float alpha,
bool enabled,
float interpDuration,
23 const QString& baseJointName,
const QString& midJointName,
24 const QString& tipJointName,
const glm::vec3& midHingeAxis,
25 const QString& alphaVar,
const QString& enabledVar,
26 const QString& endEffectorRotationVarVar,
const QString& endEffectorPositionVarVar);
27 virtual ~AnimTwoBoneIK()
override;
29 virtual const AnimPoseVec& evaluate(
const AnimVariantMap& animVars,
const AnimContext& context,
float dt, AnimVariantMap& triggersOut)
override;
33 enum class InterpType {
41 virtual const AnimPoseVec& getPosesInternal()
const override;
42 virtual void setSkeletonInternal(AnimSkeleton::ConstPointer skeleton)
override;
45 void beginInterp(InterpType interpType,
const AnimChain& chain);
51 float _interpDuration;
52 QString _baseJointName;
53 QString _midJointName;
54 QString _tipJointName;
55 glm::vec3 _midHingeAxis;
57 int _baseParentJointIndex { -1 };
58 int _baseJointIndex { -1 };
59 int _midJointIndex { -1 };
60 int _tipJointIndex { -1 };
64 QString _endEffectorRotationVarVar;
65 QString _endEffectorPositionVarVar;
67 QString _prevEndEffectorRotationVar;
68 QString _prevEndEffectorPositionVar;
70 InterpType _interpType { InterpType::None };
71 float _interpAlphaVel { 0.0f };
72 float _interpAlpha { 0.0f };
74 AnimChain _snapshotChain;
76 bool _lastEnableDebugDrawIKTargets {
false };
79 AnimTwoBoneIK(
const AnimTwoBoneIK&) =
delete;
80 AnimTwoBoneIK& operator=(
const AnimTwoBoneIK&) =
delete;