From c8d41463512803ffa3309796c91050585874ee42 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 28 Oct 2016 17:08:43 -0700 Subject: [PATCH] don't mirror eye animations --- libraries/animation/src/AnimSkeleton.cpp | 21 +++++++++++++++++++++ libraries/animation/src/AnimSkeleton.h | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/libraries/animation/src/AnimSkeleton.cpp b/libraries/animation/src/AnimSkeleton.cpp index 351c09beee..a379ebd80a 100644 --- a/libraries/animation/src/AnimSkeleton.cpp +++ b/libraries/animation/src/AnimSkeleton.cpp @@ -118,11 +118,26 @@ void AnimSkeleton::convertAbsoluteRotationsToRelative(std::vector& ro } } +void AnimSkeleton::saveNonMirroredPoses(const AnimPoseVec& poses) const { + _nonMirroredPoses.clear(); + for (int i = 0; i < (int)_nonMirroredIndices.size(); ++i) { + _nonMirroredPoses.push_back(poses[_nonMirroredIndices[i]]); + } +} + +void AnimSkeleton::restoreNonMirroredPoses(AnimPoseVec& poses) const { + for (int i = 0; i < (int)_nonMirroredIndices.size(); ++i) { + int index = _nonMirroredIndices[i]; + poses[index] = _nonMirroredPoses[i]; + } +} void AnimSkeleton::mirrorRelativePoses(AnimPoseVec& poses) const { + saveNonMirroredPoses(poses); convertRelativePosesToAbsolute(poses); mirrorAbsolutePoses(poses); convertAbsolutePosesToRelative(poses); + restoreNonMirroredPoses(poses); } void AnimSkeleton::mirrorAbsolutePoses(AnimPoseVec& poses) const { @@ -189,8 +204,14 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector& joints) } // build mirror map. + _nonMirroredIndices.clear(); _mirrorMap.reserve(_joints.size()); for (int i = 0; i < (int)joints.size(); i++) { + if (_joints[i].name.endsWith("tEye")) { + // HACK: we don't want to mirror some joints so we remember their indices + // so we can restore them after a future mirror operation + _nonMirroredIndices.push_back(i); + } int mirrorJointIndex = -1; if (_joints[i].name.startsWith("Left")) { QString mirrorJointName = QString(_joints[i].name).replace(0, 4, "Right"); diff --git a/libraries/animation/src/AnimSkeleton.h b/libraries/animation/src/AnimSkeleton.h index 68cce11326..e1c6ae95c8 100644 --- a/libraries/animation/src/AnimSkeleton.h +++ b/libraries/animation/src/AnimSkeleton.h @@ -57,6 +57,9 @@ public: void convertAbsoluteRotationsToRelative(std::vector& rotations) const; + void saveNonMirroredPoses(const AnimPoseVec& poses) const; + void restoreNonMirroredPoses(AnimPoseVec& poses) const; + void mirrorRelativePoses(AnimPoseVec& poses) const; void mirrorAbsolutePoses(AnimPoseVec& poses) const; @@ -75,6 +78,8 @@ protected: AnimPoseVec _absoluteDefaultPoses; AnimPoseVec _relativePreRotationPoses; AnimPoseVec _relativePostRotationPoses; + mutable AnimPoseVec _nonMirroredPoses; + std::vector _nonMirroredIndices; std::vector _mirrorMap; // no copies