diff --git a/code/FBXMeshGeometry.cpp b/code/FBXMeshGeometry.cpp index 8d43a2436..4868b3e72 100644 --- a/code/FBXMeshGeometry.cpp +++ b/code/FBXMeshGeometry.cpp @@ -433,7 +433,11 @@ void ResolveVertexDataArray(std::vector& data_out, const Scope& source, // deal with this more elegantly and with less redundancy, but right // now it seems unavoidable. if (MappingInformationType == "ByVertice" && ReferenceInformationType == "Direct") { - std::vector tempData; + if ( !HasElement( source, indexDataElementName ) ) { + return; + } + + std::vector tempData; ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName)); data_out.resize(vertex_count); @@ -450,10 +454,12 @@ void ResolveVertexDataArray(std::vector& data_out, const Scope& source, ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName)); data_out.resize(vertex_count); + if ( !HasElement( source, indexDataElementName ) ) { + return; + } std::vector uvIndices; ParseVectorDataArray(uvIndices,GetRequiredElement(source,indexDataElementName)); - for (size_t i = 0, e = uvIndices.size(); i < e; ++i) { const unsigned int istart = mapping_offsets[i], iend = istart + mapping_counts[i]; diff --git a/code/FBXParser.cpp b/code/FBXParser.cpp index d4d06567b..935fe5b08 100644 --- a/code/FBXParser.cpp +++ b/code/FBXParser.cpp @@ -1197,6 +1197,14 @@ std::string ParseTokenAsString(const Token& t) return i; } +bool HasElement( const Scope& sc, const std::string& index ) { + const Element* el = sc[ index ]; + if ( nullptr == el ) { + return false; + } + + return true; +} // ------------------------------------------------------------------------------------------------ // extract a required element from a scope, abort if the element cannot be found diff --git a/code/FBXParser.h b/code/FBXParser.h index 4d3766d70..736adcea0 100644 --- a/code/FBXParser.h +++ b/code/FBXParser.h @@ -218,6 +218,8 @@ void ParseVectorDataArray(std::vector& out, const Element& el); void ParseVectorDataArray(std::vector& out, const Element& e); void ParseVectorDataArray(std::vector& out, const Element& el); +bool HasElement( const Scope& sc, const std::string& index ); + // extract a required element from a scope, abort if the element cannot be found const Element& GetRequiredElement(const Scope& sc, const std::string& index, const Element* element = NULL); diff --git a/test/models/FBX/box.fbx b/test/models/FBX/box.fbx new file mode 100644 index 000000000..cd60d72da Binary files /dev/null and b/test/models/FBX/box.fbx differ diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 2807f801c..975f2acef 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -61,3 +61,9 @@ public: TEST_F( utFBXImporterExporter, importXFromFileTest ) { EXPECT_TRUE( importerTest() ); } + +TEST_F( utFBXImporterExporter, importBareBoxWithoutColorsAndTextureCoords ) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/FBX/box.fbx", aiProcess_ValidateDataStructure ); + EXPECT_NE( nullptr, scene ); +}