Merge pull request #8957 from AndrewMeadows/dont-mirror-eyes

fix broken eyes in mirrored animations
This commit is contained in:
Anthony Thibault 2016-11-01 15:28:48 -07:00 committed by GitHub
commit a9c88f2383
2 changed files with 26 additions and 0 deletions

View file

@ -118,11 +118,26 @@ void AnimSkeleton::convertAbsoluteRotationsToRelative(std::vector<glm::quat>& 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<FBXJoint>& 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");

View file

@ -57,6 +57,9 @@ public:
void convertAbsoluteRotationsToRelative(std::vector<glm::quat>& 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<int> _nonMirroredIndices;
std::vector<int> _mirrorMap;
// no copies