diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index dc2e7a7d7..667e86755 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -622,6 +622,10 @@ private: const WeightIndexArray& indices = cluster->GetIndices(); const WeightArray& weights = cluster->GetWeights(); + if(indices.empty()) { + continue; + } + const MatIndexArray& mats = geo.GetMaterialIndices(); bool ok = false; diff --git a/code/FBXDeformer.cpp b/code/FBXDeformer.cpp index 7f66f1520..06c0a64bc 100644 --- a/code/FBXDeformer.cpp +++ b/code/FBXDeformer.cpp @@ -82,25 +82,29 @@ Cluster::Cluster(uint64_t id, const Element& element, const Document& doc, const { const Scope& sc = GetRequiredScope(element); - const Element& Indexes = GetRequiredElement(sc,"Indexes",&element); - const Element& Weights = GetRequiredElement(sc,"Weights",&element); + const Element* const Indexes = sc["Indexes"]; + const Element* const Weights = sc["Weights"]; + const Element& Transform = GetRequiredElement(sc,"Transform",&element); const Element& TransformLink = GetRequiredElement(sc,"TransformLink",&element); transform = ReadMatrix(Transform); transformLink = ReadMatrix(TransformLink); - ReadVectorDataArray(indices,Indexes); - ReadVectorDataArray(weights,Weights); + // it is actually possible that there be Deformer's with no weights + if (!!Indexes != !!Weights) { + DOMError("either Indexes or Weights are missing from Cluster",&element); + } + + if(Indexes) { + ReadVectorDataArray(indices,*Indexes); + ReadVectorDataArray(weights,*Weights); + } if(indices.size() != weights.size()) { DOMError("sizes of index and weight array don't match up",&element); } - if(!indices.size()) { - DOMWarning("encountered empty deformer",&element); - } - // read assigned node const std::vector& conns = doc.GetConnectionsByDestinationSequenced(ID(),"Deformer"); BOOST_FOREACH(const Connection* con, conns) { diff --git a/code/FBXDocument.h b/code/FBXDocument.h index 06e96fcab..e736ce1c4 100644 --- a/code/FBXDocument.h +++ b/code/FBXDocument.h @@ -739,13 +739,16 @@ public: public: - /** get the list of deformer weights associated with this cluster */ + /** get the list of deformer weights associated with this cluster. + * Use #GetIndices() to get the associated vertices. Both arrays + * have the same size (and may also be empty). */ const WeightArray& GetWeights() const { return weights; } /** get indices into the vertex data of the geometry associated - * with this cluster.*/ + * with this cluster. Use #GetWeights() to get the associated weights. + * Both arrays have the same size (and may also be empty). */ const WeightIndexArray& GetIndices() const { return indices; }