diff --git a/libraries/animation/src/AnimSkeleton.cpp b/libraries/animation/src/AnimSkeleton.cpp index 96b90b8f46..e30be784ca 100644 --- a/libraries/animation/src/AnimSkeleton.cpp +++ b/libraries/animation/src/AnimSkeleton.cpp @@ -12,6 +12,14 @@ AnimSkeleton::AnimSkeleton(const std::vector& joints) { _joints = joints; + + // build a cache of bind poses + _bindPoses.reserve(joints.size()); + for (size_t i = 0; i < joints.size(); i++) { + _bindPoses.push_back(AnimPose(extractScale(_joints[i].bindTransform), + glm::quat_cast(_joints[i].bindTransform), + extractTranslation(_joints[i].bindTransform))); + } } int AnimSkeleton::nameToJointIndex(const QString& jointName) const { @@ -28,11 +36,7 @@ int AnimSkeleton::getNumJoints() const { } AnimPose AnimSkeleton::getBindPose(int jointIndex) const { - // TODO: perhaps cache these, it's expensive to de-compose the matrix - // on every call. - return AnimPose(extractScale(_joints[jointIndex].bindTransform), - glm::quat_cast(_joints[jointIndex].bindTransform), - extractTranslation(_joints[jointIndex].bindTransform)); + return _bindPoses[jointIndex]; } int AnimSkeleton::getParentIndex(int jointIndex) const { diff --git a/libraries/animation/src/AnimSkeleton.h b/libraries/animation/src/AnimSkeleton.h index 0b50e60b65..7afc419e6b 100644 --- a/libraries/animation/src/AnimSkeleton.h +++ b/libraries/animation/src/AnimSkeleton.h @@ -35,6 +35,7 @@ public: protected: std::vector _joints; + std::vector _bindPoses; }; #endif diff --git a/libraries/render-utils/src/AnimDebugDraw.cpp b/libraries/render-utils/src/AnimDebugDraw.cpp index 263241ca0e..9439e8314f 100644 --- a/libraries/render-utils/src/AnimDebugDraw.cpp +++ b/libraries/render-utils/src/AnimDebugDraw.cpp @@ -187,30 +187,36 @@ void AnimDebugDraw::update() { for (int i = 0; i < skeleton->getNumJoints(); i++) { AnimPose pose = skeleton->getBindPose(i); - v->pos = xform.transform(pose.trans); + glm::vec3 base = xform.transform(pose.trans); + + // x-axis + v->pos = base; v->rgba = red; v++; - v->pos = xform.transform(pose.trans + pose.rot * glm::vec3(pose.scale.x, 0.0f, 0.0f)); + v->pos = base + pose.rot * glm::vec3(1.0f, 0.0f, 0.0f); v->rgba = red; v++; + // y-axis v->pos = xform.transform(pose.trans); v->rgba = green; v++; - v->pos = xform.transform(pose.trans + pose.rot * glm::vec3(0.0f, pose.scale.y, 0.0f)); + v->pos = base + pose.rot * glm::vec3(0.0f, 1.0f, 0.0f); v->rgba = green; v++; - v->pos = xform.transform(pose.trans); + // z-axis + v->pos = base; v->rgba = blue; v++; - v->pos = xform.transform(pose.trans + pose.rot * glm::vec3(0.0f, 0.0f, pose.scale.z)); + v->pos = base + pose.rot * glm::vec3(0.0f, 0.0f, 1.0f); v->rgba = blue; v++; + // line to parent. if (skeleton->getParentIndex(i) >= 0) { AnimPose parentPose = skeleton->getBindPose(skeleton->getParentIndex(i)); - v->pos = xform.transform(pose.trans); + v->pos = base; v->rgba = gray; v++; v->pos = xform.transform(parentPose.trans);