From 09a8d69555837696397476f539af1adcfc14b692 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 4 Oct 2019 18:02:45 -0700 Subject: [PATCH] landing on the new code base --- libraries/fbx/src/FBXSerializer.cpp | 46 ++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/libraries/fbx/src/FBXSerializer.cpp b/libraries/fbx/src/FBXSerializer.cpp index 78bc1836c3..1752c2f024 100644 --- a/libraries/fbx/src/FBXSerializer.cpp +++ b/libraries/fbx/src/FBXSerializer.cpp @@ -145,6 +145,42 @@ public: bool isLimbNode; // is this FBXModel transform is a "LimbNode" i.e. a joint }; + +glm::mat4 getGlobalTransform(const QMultiMap& _connectionParentMap, + const QHash& fbxModels, QString nodeID, bool mixamoHack, const QString& url) { + glm::mat4 globalTransform; + QVector visitedNodes; // Used to prevent following a cycle + while (!nodeID.isNull()) { + visitedNodes.append(nodeID); // Append each node we visit + + const FBXModel& fbxModel = fbxModels.value(nodeID); + globalTransform = glm::translate(fbxModel.translation) * fbxModel.preTransform * glm::mat4_cast(fbxModel.preRotation * + fbxModel.rotation * fbxModel.postRotation) * fbxModel.postTransform * globalTransform; + if (fbxModel.hasGeometricOffset) { + glm::mat4 geometricOffset = createMatFromScaleQuatAndPos(fbxModel.geometricScaling, fbxModel.geometricRotation, fbxModel.geometricTranslation); + globalTransform = globalTransform * geometricOffset; + } + + if (mixamoHack) { + // there's something weird about the models from Mixamo Fuse; they don't skin right with the full transform + return globalTransform; + } + QList parentIDs = _connectionParentMap.values(nodeID); + nodeID = QString(); + foreach(const QString& parentID, parentIDs) { + if (visitedNodes.contains(parentID)) { + qCWarning(modelformat) << "Ignoring loop detected in FBX connection map for" << url; + continue; + } + if (fbxModels.contains(parentID)) { + nodeID = parentID; + break; + } + } + } + return globalTransform; +} + std::vector getModelIDsForMeshID(const QString& meshID, const QHash& fbxModels, const QMultiMap& _connectionParentMap) { std::vector modelsForMesh; if (fbxModels.contains(meshID)) { @@ -1344,7 +1380,8 @@ HFMModel* FBXSerializer::extractHFMModel(const hifi::VariantHash& mapping, const joint.globalTransform = glm::translate(joint.translation) * joint.preTransform * glm::mat4_cast(joint.preRotation * joint.rotation * joint.postRotation) * joint.postTransform; if (joint.parentIndex != -1 && joint.parentIndex < (int)jointIndex && !needMixamoHack) { hfm::Joint& parentJoint = hfmModel.joints[joint.parentIndex]; - joint.globalTransform = joint.globalTransform * parentJoint.globalTransform; + // joint.globalTransform = joint.globalTransform * parentJoint.globalTransform; + joint.globalTransform = parentJoint.globalTransform * joint.globalTransform; if (parentJoint.hasGeometricOffset) { // Per the FBX standard, geometric offset should not propagate to children. // However, we must be careful when modifying the behavior of FBXSerializer. @@ -1359,6 +1396,13 @@ HFMModel* FBXSerializer::extractHFMModel(const hifi::VariantHash& mapping, const joint.globalTransform = joint.globalTransform * geometricOffset; } + // accumulate local transforms + // QString modelID = fbxModels.contains(it.key()) ? it.key() : _connectionParentMap.value(it.key()); + glm::mat4 anotherModelTransform = getGlobalTransform(_connectionParentMap, fbxModels, modelID, hfmModel.applicationName == "mixamo.com", url); + /* if (anotherModelTransform != joint.globalTransform) { + joint.globalTransform = anotherModelTransform; + } +*/ hfmModel.joints.push_back(joint); }