mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 19:59:28 +02:00
don't mirror eye animations
This commit is contained in:
parent
b8cf4e9c0e
commit
c8d4146351
2 changed files with 26 additions and 0 deletions
|
@ -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 {
|
void AnimSkeleton::mirrorRelativePoses(AnimPoseVec& poses) const {
|
||||||
|
saveNonMirroredPoses(poses);
|
||||||
convertRelativePosesToAbsolute(poses);
|
convertRelativePosesToAbsolute(poses);
|
||||||
mirrorAbsolutePoses(poses);
|
mirrorAbsolutePoses(poses);
|
||||||
convertAbsolutePosesToRelative(poses);
|
convertAbsolutePosesToRelative(poses);
|
||||||
|
restoreNonMirroredPoses(poses);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimSkeleton::mirrorAbsolutePoses(AnimPoseVec& poses) const {
|
void AnimSkeleton::mirrorAbsolutePoses(AnimPoseVec& poses) const {
|
||||||
|
@ -189,8 +204,14 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints)
|
||||||
}
|
}
|
||||||
|
|
||||||
// build mirror map.
|
// build mirror map.
|
||||||
|
_nonMirroredIndices.clear();
|
||||||
_mirrorMap.reserve(_joints.size());
|
_mirrorMap.reserve(_joints.size());
|
||||||
for (int i = 0; i < (int)joints.size(); i++) {
|
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;
|
int mirrorJointIndex = -1;
|
||||||
if (_joints[i].name.startsWith("Left")) {
|
if (_joints[i].name.startsWith("Left")) {
|
||||||
QString mirrorJointName = QString(_joints[i].name).replace(0, 4, "Right");
|
QString mirrorJointName = QString(_joints[i].name).replace(0, 4, "Right");
|
||||||
|
|
|
@ -57,6 +57,9 @@ public:
|
||||||
|
|
||||||
void convertAbsoluteRotationsToRelative(std::vector<glm::quat>& rotations) const;
|
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 mirrorRelativePoses(AnimPoseVec& poses) const;
|
||||||
void mirrorAbsolutePoses(AnimPoseVec& poses) const;
|
void mirrorAbsolutePoses(AnimPoseVec& poses) const;
|
||||||
|
|
||||||
|
@ -75,6 +78,8 @@ protected:
|
||||||
AnimPoseVec _absoluteDefaultPoses;
|
AnimPoseVec _absoluteDefaultPoses;
|
||||||
AnimPoseVec _relativePreRotationPoses;
|
AnimPoseVec _relativePreRotationPoses;
|
||||||
AnimPoseVec _relativePostRotationPoses;
|
AnimPoseVec _relativePostRotationPoses;
|
||||||
|
mutable AnimPoseVec _nonMirroredPoses;
|
||||||
|
std::vector<int> _nonMirroredIndices;
|
||||||
std::vector<int> _mirrorMap;
|
std::vector<int> _mirrorMap;
|
||||||
|
|
||||||
// no copies
|
// no copies
|
||||||
|
|
Loading…
Reference in a new issue