diff --git a/interface/resources/avatar/avatar-animation_withIKNode.json b/interface/resources/avatar/avatar-animation_withIKNode.json index 04ed593755..13c102a5f1 100644 --- a/interface/resources/avatar/avatar-animation_withIKNode.json +++ b/interface/resources/avatar/avatar-animation_withIKNode.json @@ -193,7 +193,9 @@ "alphaVar": "splineIKAlpha", "enabledVar": "splineIKEnabled", "endEffectorRotationVarVar": "splineIKRotationVar", - "endEffectorPositionVarVar": "splineIKPositionVar" + "endEffectorPositionVarVar": "splineIKPositionVar", + "primaryFlexCoefficients": "1, 0.5, 0.25, 0.2, 0.1", + "secondaryFlexCoefficients": "1.0, 0.5, 0.25" }, "children": [ { diff --git a/libraries/animation/src/AnimNodeLoader.cpp b/libraries/animation/src/AnimNodeLoader.cpp index ebe9dbe3ba..c5d17e8884 100644 --- a/libraries/animation/src/AnimNodeLoader.cpp +++ b/libraries/animation/src/AnimNodeLoader.cpp @@ -596,12 +596,15 @@ static AnimNode::Pointer loadSplineIKNode(const QJsonObject& jsonObj, const QStr READ_STRING(enabledVar, jsonObj, id, jsonUrl, nullptr); READ_STRING(endEffectorRotationVarVar, jsonObj, id, jsonUrl, nullptr); READ_STRING(endEffectorPositionVarVar, jsonObj, id, jsonUrl, nullptr); + READ_STRING(primaryFlexCoefficients, jsonObj, id, jsonUrl, nullptr); + READ_STRING(secondaryFlexCoefficients, jsonObj, id, jsonUrl, nullptr); auto node = std::make_shared(id, alpha, enabled, interpDuration, baseJointName, tipJointName, alphaVar, enabledVar, endEffectorRotationVarVar, endEffectorPositionVarVar, basePositionVar, baseRotationVar, - tipPositionVar, tipRotationVar, secondaryTargetJointName, secondaryTargetPositionVar, secondaryTargetRotationVar); + tipPositionVar, tipRotationVar, secondaryTargetJointName, secondaryTargetPositionVar, + secondaryTargetRotationVar, primaryFlexCoefficients, secondaryFlexCoefficients); return node; } diff --git a/libraries/animation/src/AnimSplineIK.cpp b/libraries/animation/src/AnimSplineIK.cpp index bb3ec654f5..658fa2cf6a 100644 --- a/libraries/animation/src/AnimSplineIK.cpp +++ b/libraries/animation/src/AnimSplineIK.cpp @@ -28,7 +28,9 @@ AnimSplineIK::AnimSplineIK(const QString& id, float alpha, bool enabled, float i const QString& tipRotationVar, const QString& secondaryTargetJointName, const QString& secondaryTargetPositionVar, - const QString& secondaryTargetRotationVar) : + const QString& secondaryTargetRotationVar, + const QString& primaryFlexCoefficients, + const QString& secondaryFlexCoefficients) : AnimNode(AnimNode::Type::SplineIK, id), _alpha(alpha), _enabled(enabled), @@ -47,8 +49,25 @@ AnimSplineIK::AnimSplineIK(const QString& id, float alpha, bool enabled, float i _tipRotationVar(tipRotationVar), _secondaryTargetJointName(secondaryTargetJointName), _secondaryTargetPositionVar(secondaryTargetPositionVar), - _secondaryTargetRotationVar(secondaryTargetRotationVar) + _secondaryTargetRotationVar(secondaryTargetRotationVar) { + + QStringList flexCoefficientsValues = primaryFlexCoefficients.split(',', QString::SkipEmptyParts); + for (int i = 0; i < flexCoefficientsValues.size(); i++) { + if (i < MAX_NUMBER_FLEX_VARIABLES) { + qCDebug(animation) << "flex value " << flexCoefficientsValues[i].toDouble(); + _primaryFlexCoefficients[i] = (float)flexCoefficientsValues[i].toDouble(); + } + } + _numPrimaryFlexCoefficients = std::min(flexCoefficientsValues.size(), MAX_NUMBER_FLEX_VARIABLES); + QStringList secondaryFlexCoefficientsValues = secondaryFlexCoefficients.split(',', QString::SkipEmptyParts); + for (int i = 0; i < secondaryFlexCoefficientsValues.size(); i++) { + if (i < MAX_NUMBER_FLEX_VARIABLES) { + qCDebug(animation) << "secondaryflex value " << secondaryFlexCoefficientsValues[i].toDouble(); + _secondaryFlexCoefficients[i] = (float)secondaryFlexCoefficientsValues[i].toDouble(); + } + } + _numSecondaryFlexCoefficients = std::min(secondaryFlexCoefficientsValues.size(), MAX_NUMBER_FLEX_VARIABLES); } @@ -145,8 +164,11 @@ const AnimPoseVec& AnimSplineIK::evaluate(const AnimVariantMap& animVars, const target.setPose(rotation, translation); target.setWeight(weight); + + + const float* flexCoefficients = new float[5]{ 1.0f, 0.5f, 0.25f, 0.2f, 0.1f }; - target.setFlexCoefficients(5, flexCoefficients); + target.setFlexCoefficients(_numPrimaryFlexCoefficients, _primaryFlexCoefficients); } AnimChain jointChain; @@ -182,7 +204,7 @@ const AnimPoseVec& AnimSplineIK::evaluate(const AnimVariantMap& animVars, const secondaryTarget.setWeight(weight2); const float* flexCoefficients2 = new float[3]{ 1.0f, 0.5f, 0.25f }; - secondaryTarget.setFlexCoefficients(3, flexCoefficients2); + secondaryTarget.setFlexCoefficients(_numSecondaryFlexCoefficients, _secondaryFlexCoefficients); } AnimChain secondaryJointChain; diff --git a/libraries/animation/src/AnimSplineIK.h b/libraries/animation/src/AnimSplineIK.h index d4dbb85a9e..e00b5a5b04 100644 --- a/libraries/animation/src/AnimSplineIK.h +++ b/libraries/animation/src/AnimSplineIK.h @@ -26,7 +26,9 @@ public: const QString& tipPositionVar, const QString& tipRotationVar, const QString& secondaryTargetJointName, const QString& secondaryTargetPositionVar, - const QString& secondaryTargetRotationVar); + const QString& secondaryTargetRotationVar, + const QString& primaryFlexCoefficients, + const QString& secondaryFlexCoefficients); virtual ~AnimSplineIK() override; virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, AnimVariantMap& triggersOut) override; @@ -65,6 +67,14 @@ protected: QString _tipRotationVar; QString _secondaryTargetPositionVar; QString _secondaryTargetRotationVar; + //QString _primaryFlexCoefficients; + //QString _secondaryFlexCoefficients; + + static const int MAX_NUMBER_FLEX_VARIABLES = 10; + float _primaryFlexCoefficients[MAX_NUMBER_FLEX_VARIABLES]; + float _secondaryFlexCoefficients[MAX_NUMBER_FLEX_VARIABLES]; + int _numPrimaryFlexCoefficients { 0 }; + int _numSecondaryFlexCoefficients { 0 }; int _baseParentJointIndex { -1 }; int _baseJointIndex { -1 };