From 36dc2dc49d3bad4c8f3b9613d63b3fdc72ef4eb2 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 26 Feb 2017 10:18:37 -0800 Subject: [PATCH] Compute spine length on skeleton load --- libraries/animation/src/AnimInverseKinematics.cpp | 12 ++++++++++++ libraries/animation/src/AnimInverseKinematics.h | 1 + 2 files changed, 13 insertions(+) diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index c22819f22d..65de35ce5f 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -938,10 +938,22 @@ void AnimInverseKinematics::setSkeletonInternal(AnimSkeleton::ConstPointer skele } else { _hipsParentIndex = -1; } + + auto currentJointIndex = _headIndex; + auto parentJointIndex = _skeleton->getParentIndex(currentJointIndex); + _spineLength = 0.0f; + while (currentJointIndex != _hipsIndex && parentJointIndex != -1) { + _spineLength += glm::distance(_skeleton->getAbsoluteDefaultPose(currentJointIndex).trans(), + _skeleton->getAbsoluteDefaultPose(parentJointIndex).trans()); + + currentJointIndex = parentJointIndex; + parentJointIndex = _skeleton->getParentIndex(currentJointIndex); + } } else { clearConstraints(); _headIndex = -1; _hipsIndex = -1; _hipsParentIndex = -1; + _spineLength = 0.0f; } } diff --git a/libraries/animation/src/AnimInverseKinematics.h b/libraries/animation/src/AnimInverseKinematics.h index 892a5616b2..ad5018b0b8 100644 --- a/libraries/animation/src/AnimInverseKinematics.h +++ b/libraries/animation/src/AnimInverseKinematics.h @@ -91,6 +91,7 @@ protected: int _headIndex { -1 }; int _hipsIndex { -1 }; int _hipsParentIndex { -1 }; + float _spineLength { 0.0f }; // _maxTargetIndex is tracked to help optimize the recalculation of absolute poses // during the the cyclic coordinate descent algorithm