Look for and store the "Skeleton" type flag so that we can offer only skeleton

joints in the dropdown.
This commit is contained in:
Andrzej Kapolka 2014-10-17 16:51:55 -07:00
parent 8e047f2f9f
commit 1b9b0f9fc9
3 changed files with 23 additions and 2 deletions

View file

@ -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;
}

View file

@ -1015,6 +1015,7 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping)
QHash<QString, QByteArray> textureFilenames;
QHash<QByteArray, QByteArray> textureContent;
QHash<QString, Material> materials;
QHash<QString, QString> typeFlags;
QHash<QString, QString> diffuseTextures;
QHash<QString, QString> bumpTextures;
QHash<QString, QString> 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());

View file

@ -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<FBXJoint> joints;
QHash<QString, int> jointIndices; ///< 1-based, so as to more easily detect missing indices
bool hasSkeletonJoints;
QVector<FBXMesh> meshes;