From 1b9b0f9fc96d7f8c6fd96089d36ee8bce3aa8d64 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 17 Oct 2014 16:51:55 -0700 Subject: [PATCH] Look for and store the "Skeleton" type flag so that we can offer only skeleton joints in the dropdown. --- interface/src/ModelUploader.cpp | 4 +++- libraries/fbx/src/FBXReader.cpp | 19 ++++++++++++++++++- libraries/fbx/src/FBXReader.h | 2 ++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index 7077c44287..3d772f7d96 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -785,7 +785,9 @@ QComboBox* ModelPropertiesDialog::createJointBox(bool withNone) const { box->addItem("(none)"); } foreach (const FBXJoint& joint, _geometry.joints) { - box->addItem(joint.name); + if (joint.isSkeletonJoint || !_geometry.hasSkeletonJoints) { + box->addItem(joint.name); + } } return box; } diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index 43d23160f7..abeb27f4ab 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -1015,6 +1015,7 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) QHash textureFilenames; QHash textureContent; QHash materials; + QHash typeFlags; QHash diffuseTextures; QHash bumpTextures; QHash specularTextures; @@ -1323,6 +1324,12 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) material.id = getID(object.properties); materials.insert(material.id, material); + } else if (object.name == "NodeAttribute") { + foreach (const FBXNode& subobject, object.children) { + if (subobject.name == "TypeFlags") { + typeFlags.insert(getID(object.properties), subobject.properties.at(0).toString()); + } + } } else if (object.name == "Deformer") { if (object.properties.last() == "Cluster") { Cluster cluster; @@ -1461,12 +1468,13 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) // convert the models to joints QVariantList freeJoints = mapping.values("freeJoint"); + geometry.hasSkeletonJoints = false; foreach (const QString& modelID, modelIDs) { const FBXModel& model = models[modelID]; FBXJoint joint; joint.isFree = freeJoints.contains(model.name); joint.parentIndex = model.parentIndex; - + // get the indices of all ancestors starting with the first free one (if any) int jointIndex = geometry.joints.size(); joint.freeLineage.append(jointIndex); @@ -1506,6 +1514,15 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) joint.name = model.name; joint.shapePosition = glm::vec3(0.f); joint.shapeType = UNKNOWN_SHAPE; + + foreach (const QString& childID, childMap.values(modelID)) { + QString type = typeFlags.value(childID); + if (!type.isEmpty()) { + geometry.hasSkeletonJoints |= (joint.isSkeletonJoint = type.toLower().contains("Skeleton")); + break; + } + } + geometry.joints.append(joint); geometry.jointIndices.insert(model.name, geometry.joints.size()); diff --git a/libraries/fbx/src/FBXReader.h b/libraries/fbx/src/FBXReader.h index 6a7a0904da..cbf0cfcca6 100644 --- a/libraries/fbx/src/FBXReader.h +++ b/libraries/fbx/src/FBXReader.h @@ -80,6 +80,7 @@ public: glm::vec3 shapePosition; // in joint frame glm::quat shapeRotation; // in joint frame Shape::Type shapeType; + bool isSkeletonJoint; }; @@ -182,6 +183,7 @@ public: QVector joints; QHash jointIndices; ///< 1-based, so as to more easily detect missing indices + bool hasSkeletonJoints; QVector meshes;