diff --git a/interface/src/renderer/FBXReader.cpp b/interface/src/renderer/FBXReader.cpp index 804a19a054..3fb169ac07 100644 --- a/interface/src/renderer/FBXReader.cpp +++ b/interface/src/renderer/FBXReader.cpp @@ -368,6 +368,28 @@ glm::mat4 createMat4(const QVector& doubleVector) { doubleVector.at(12), doubleVector.at(13), doubleVector.at(14), doubleVector.at(15)); } +QVector getIntVector(const QVariantList& properties, int index) { + QVector vector = properties.at(index).value >(); + if (!vector.isEmpty()) { + return vector; + } + for (; index < properties.size(); index++) { + vector.append(properties.at(index).toInt()); + } + return vector; +} + +QVector getDoubleVector(const QVariantList& properties, int index) { + QVector vector = properties.at(index).value >(); + if (!vector.isEmpty()) { + return vector; + } + for (; index < properties.size(); index++) { + vector.append(properties.at(index).toDouble()); + } + return vector; +} + const char* FACESHIFT_BLENDSHAPES[] = { "EyeBlink_L", "EyeBlink_R", @@ -552,19 +574,19 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) QVector materials; foreach (const FBXNode& data, object.children) { if (data.name == "Vertices") { - mesh.vertices = createVec3Vector(data.properties.at(0).value >()); + mesh.vertices = createVec3Vector(getDoubleVector(data.properties, 0)); } else if (data.name == "PolygonVertexIndex") { - polygonIndices = data.properties.at(0).value >(); + polygonIndices = getIntVector(data.properties, 0); } else if (data.name == "LayerElementNormal") { bool byVertex = false; foreach (const FBXNode& subdata, data.children) { if (subdata.name == "Normals") { - normals = createVec3Vector(subdata.properties.at(0).value >()); + normals = createVec3Vector(getDoubleVector(subdata.properties, 0)); } else if (subdata.name == "NormalsIndex") { - normalIndices = subdata.properties.at(0).value >(); + normalIndices = getIntVector(subdata.properties, 0); } else if (subdata.name == "MappingInformationType" && subdata.properties.at(0) == "ByVertice") { @@ -577,16 +599,16 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) } else if (data.name == "LayerElementUV" && data.properties.at(0).toInt() == 0) { foreach (const FBXNode& subdata, data.children) { if (subdata.name == "UV") { - texCoords = createVec2Vector(subdata.properties.at(0).value >()); + texCoords = createVec2Vector(getDoubleVector(subdata.properties, 0)); } else if (subdata.name == "UVIndex") { - texCoordIndices = subdata.properties.at(0).value >(); + texCoordIndices = getIntVector(subdata.properties, 0); } } } else if (data.name == "LayerElementMaterial") { foreach (const FBXNode& subdata, data.children) { if (subdata.name == "Materials") { - materials = subdata.properties.at(0).value >(); + materials = getIntVector(subdata.properties, 0); } } } @@ -661,15 +683,15 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) foreach (const FBXNode& data, object.children) { if (data.name == "Indexes") { - extracted.blendshape.indices = data.properties.at(0).value >(); + extracted.blendshape.indices = getIntVector(data.properties, 0); } else if (data.name == "Vertices") { extracted.blendshape.vertices = createVec3Vector( - data.properties.at(0).value >()); + getDoubleVector(data.properties, 0)); } else if (data.name == "Normals") { extracted.blendshape.normals = createVec3Vector( - data.properties.at(0).value >()); + getDoubleVector(data.properties, 0)); } } @@ -834,13 +856,13 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) Cluster cluster; foreach (const FBXNode& subobject, object.children) { if (subobject.name == "Indexes") { - cluster.indices = subobject.properties.at(0).value >(); + cluster.indices = getIntVector(subobject.properties, 0); } else if (subobject.name == "Weights") { - cluster.weights = subobject.properties.at(0).value >(); + cluster.weights = getDoubleVector(subobject.properties, 0); } else if (subobject.name == "TransformLink") { - QVector values = subobject.properties.at(0).value >(); + QVector values = getDoubleVector(subobject.properties, 0); cluster.transformLink = createMat4(values); } }