From 1fd03102c5c690f38745e83e4a229b7441ca5b09 Mon Sep 17 00:00:00 2001 From: amantley Date: Mon, 19 Nov 2018 17:40:43 -0800 Subject: [PATCH] debugging name mapping code --- libraries/animation/src/AnimSkeleton.cpp | 33 +++++++++++++++---- libraries/animation/src/AnimSkeleton.h | 4 ++- libraries/animation/src/Rig.cpp | 5 +++ .../src/avatars-renderer/Avatar.cpp | 12 ++++--- libraries/fbx/src/FBXReader.cpp | 2 +- 5 files changed, 43 insertions(+), 13 deletions(-) diff --git a/libraries/animation/src/AnimSkeleton.cpp b/libraries/animation/src/AnimSkeleton.cpp index 91ca2359b4..908b4eb1d3 100644 --- a/libraries/animation/src/AnimSkeleton.cpp +++ b/libraries/animation/src/AnimSkeleton.cpp @@ -23,6 +23,8 @@ AnimSkeleton::AnimSkeleton(const HFMModel& hfmModel) { for (auto& joint : hfmModel.joints) { joints.push_back(joint); } + + _fbxToHifiJointNameMapping = hfmModel.fbxToHifiJointNameMapping; buildSkeletonFromJoints(joints, hfmModel.jointRotationOffsets); // we make a copy of the inverseBindMatrices in order to prevent mutating the model bind pose @@ -59,7 +61,16 @@ AnimSkeleton::AnimSkeleton(const std::vector& joints, const QMap AnimSkeleton::getChildrenOfJoint(int jointIndex) const { return result; } -const QString& AnimSkeleton::getJointName(int jointIndex) const { - return _joints[jointIndex].name; +const QString AnimSkeleton::getJointName(int jointIndex) const { + + QString jointName = _joints[jointIndex].name; + QMapIterator i(_fbxToHifiJointNameMapping); + while (i.hasNext()) { + i.next(); + if (i.value() == _joints[jointIndex].name) { + jointName = i.key(); + break; + } + } + return jointName; //;_joints[jointIndex].name; } AnimPose AnimSkeleton::getAbsolutePose(int jointIndex, const AnimPoseVec& relativePoses) const { @@ -245,9 +266,9 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector& joints, _nonMirroredIndices.clear(); _mirrorMap.reserve(_jointsSize); for (int i = 0; i < _jointsSize; i++) { - if (_joints[i].name != "Hips" && _joints[i].name != "Spine" && - _joints[i].name != "Spine1" && _joints[i].name != "Spine2" && - _joints[i].name != "Neck" && _joints[i].name != "Head" && + if (_joints[i].name != "Hips" && _joints[i].name != _fbxToHifiJointNameMapping["Hips"] && _joints[i].name != "Spine" && _joints[i].name != _fbxToHifiJointNameMapping["Spine"] && + _joints[i].name != "Spine1" && _joints[i].name != _fbxToHifiJointNameMapping["Spine1"] && _joints[i].name != "Spine2" && _joints[i].name != _fbxToHifiJointNameMapping["Spine2"] && + _joints[i].name != "Neck" && _joints[i].name != _fbxToHifiJointNameMapping["Neck"] && _joints[i].name != "Head" && _joints[i].name != _fbxToHifiJointNameMapping["Head"] && !((_joints[i].name.startsWith("Left") || _joints[i].name.startsWith("Right")) && _joints[i].name != "LeftEye" && _joints[i].name != "RightEye")) { // HACK: we don't want to mirror some joints so we remember their indices @@ -327,7 +348,7 @@ std::vector AnimSkeleton::lookUpJointIndices(const std::vector& jo for (auto& name : jointNames) { int index = nameToJointIndex(name); if (index == -1) { - qWarning(animation) << "AnimSkeleton::lookUpJointIndices(): could not find bone with named " << name; + qWarning(animation) << "AnimSkeleton::lookUpJointIndices(): could not find bone with name " << name; } result.push_back(index); } diff --git a/libraries/animation/src/AnimSkeleton.h b/libraries/animation/src/AnimSkeleton.h index ab89eb643d..bcbfe628c7 100644 --- a/libraries/animation/src/AnimSkeleton.h +++ b/libraries/animation/src/AnimSkeleton.h @@ -27,7 +27,7 @@ public: explicit AnimSkeleton(const std::vector& joints, const QMap jointOffsets); int nameToJointIndex(const QString& jointName) const; - const QString& getJointName(int jointIndex) const; + const QString getJointName(int jointIndex) const; int getNumJoints() const; int getChainDepth(int jointIndex) const; @@ -64,6 +64,7 @@ public: std::vector lookUpJointIndices(const std::vector& jointNames) const; const HFMCluster getClusterBindMatricesOriginalValues(const int meshIndex, const int clusterIndex) const { return _clusterBindMatrixOriginalValues[meshIndex][clusterIndex]; } + const QMap getFBXToHifiJointNameMapping() const { return _fbxToHifiJointNameMapping; } protected: void buildSkeletonFromJoints(const std::vector& joints, const QMap jointOffsets); @@ -79,6 +80,7 @@ protected: std::vector _mirrorMap; QHash _jointIndicesByName; std::vector> _clusterBindMatrixOriginalValues; + QMap _fbxToHifiJointNameMapping; // no copies AnimSkeleton(const AnimSkeleton&) = delete; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index baa8ac94ce..0c30a7696f 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -420,7 +420,12 @@ static const uint32_t MAX_JOINT_NAME_WARNING_COUNT = 100; int Rig::indexOfJoint(const QString& jointName) const { if (_animSkeleton) { + int result = _animSkeleton->nameToJointIndex(jointName); + if (_animSkeleton->getFBXToHifiJointNameMapping().contains(jointName)) { + qCDebug(animation) << "the alternate name for the joint " << jointName << " is " << _animSkeleton->getFBXToHifiJointNameMapping()[jointName] << " " << _animSkeleton->nameToJointIndex(_animSkeleton->getFBXToHifiJointNameMapping()[jointName]); + result = _animSkeleton->nameToJointIndex(jointName); + } // This is a content error, so we should issue a warning. if (result < 0 && _jointNameWarningCount < MAX_JOINT_NAME_WARNING_COUNT) { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 4b730fccda..e5435a9a8c 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1438,18 +1438,20 @@ int Avatar::getJointIndex(const QString& name) const { if (_modelJointIndicesCache.contains(name)) { result = _modelJointIndicesCache[name] - 1; if (_skeletonModel && _skeletonModel->isActive()) { - qCDebug(avatars_renderer) << "the other head id is this" << _skeletonModel->getHFMModel().fbxToHifiJointNameMapping["Head"]; - qCDebug(avatars_renderer) << "joint indices cache " << name << " " << _modelJointIndicesCache[name]; + // qCDebug(avatars_renderer) << "the other head id is this" << _skeletonModel->getHFMModel().fbxToHifiJointNameMapping["Head"]; + // qCDebug(avatars_renderer) << "joint indices cache " << name << " " << _modelJointIndicesCache[name]; if (_modelJointIndicesCache.contains(_skeletonModel->getHFMModel().fbxToHifiJointNameMapping["Head"])) { - qCDebug(avatars_renderer) << "joint alternate name " << _skeletonModel->getHFMModel().fbxToHifiJointNameMapping["Head"] << " " << _modelJointIndicesCache[_skeletonModel->getHFMModel().fbxToHifiJointNameMapping["Head"]]; + // qCDebug(avatars_renderer) << "joint alternate name " << _skeletonModel->getHFMModel().fbxToHifiJointNameMapping["Head"] << " " << _modelJointIndicesCache[_skeletonModel->getHFMModel().fbxToHifiJointNameMapping["Head"]]; } } } else { // doesn't contain name. qCDebug(avatars_renderer) << "name is not here"; if (_skeletonModel && _skeletonModel->isActive()) { - if (_modelJointIndicesCache.contains(_skeletonModel->getHFMModel().fbxToHifiJointNameMapping["Head"])) { - qCDebug(avatars_renderer) << "the other head id is this" << _skeletonModel->getHFMModel().fbxToHifiJointNameMapping["Head"] << " " << _modelJointIndicesCache[_skeletonModel->getHFMModel().fbxToHifiJointNameMapping["Head"]];; + + if (_modelJointIndicesCache.contains(_skeletonModel->getHFMModel().fbxToHifiJointNameMapping[name])) { + result = _modelJointIndicesCache[_skeletonModel->getHFMModel().fbxToHifiJointNameMapping[name]] - 1; + qCDebug(avatars_renderer) << "joint " << name << " remapped to " << _skeletonModel->getHFMModel().fbxToHifiJointNameMapping[name] << result; } } } diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index 343f7e6c6d..2e43573ec2 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -425,7 +425,7 @@ QMap getJointNameMapping(const QVariantHash& mapping) { for (auto itr = jointNames.begin(); itr != jointNames.end(); itr++) { qCDebug(modelformat) << "found a joint mapping field key " << itr.key() << " value " << itr.value().toString(); fbxToHifiJointNameMap.insert(itr.key(), itr.value().toString()); - qCDebug(modelformat) << "the mapped key (Head) has a value of " << fbxToHifiJointNameMap[itr.key()]; + qCDebug(modelformat) << "the mapped key " << itr.key() << " has a value of " << fbxToHifiJointNameMap[itr.key()]; } }