From 9efa4282fedfc71a12b72105a0cbc5c2f3c8532e Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 4 Jan 2018 12:37:35 +0100 Subject: [PATCH 1/4] closes https://github.com/assimp/assimp/issues/1460: skip uv- and color-components if these are not defined. --- code/FBXMeshGeometry.cpp | 9 ++++++++- code/FBXParser.cpp | 8 ++++++++ code/FBXParser.h | 2 ++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/code/FBXMeshGeometry.cpp b/code/FBXMeshGeometry.cpp index 8d43a2436..ad0ffcf55 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); @@ -452,6 +456,9 @@ void ResolveVertexDataArray(std::vector& data_out, const Scope& source, data_out.resize(vertex_count); std::vector uvIndices; + if ( !HasElement( source, indexDataElementName ) ) { + return; + } ParseVectorDataArray(uvIndices,GetRequiredElement(source,indexDataElementName)); for (size_t i = 0, e = uvIndices.size(); i < e; ++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); From f376a3e8cde7f01070264e4ae9f3f376788dd5eb Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 4 Jan 2018 13:09:43 +0100 Subject: [PATCH 2/4] move data declaration after test if elements are in current scope. --- code/FBXMeshGeometry.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/FBXMeshGeometry.cpp b/code/FBXMeshGeometry.cpp index ad0ffcf55..4868b3e72 100644 --- a/code/FBXMeshGeometry.cpp +++ b/code/FBXMeshGeometry.cpp @@ -454,13 +454,12 @@ void ResolveVertexDataArray(std::vector& data_out, const Scope& source, ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName)); data_out.resize(vertex_count); - - std::vector uvIndices; if ( !HasElement( source, indexDataElementName ) ) { return; } - ParseVectorDataArray(uvIndices,GetRequiredElement(source,indexDataElementName)); + 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]; From a5e2a40d75798d5e0e2d6fbd9286d6b0d7015e72 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 4 Jan 2018 13:10:13 +0100 Subject: [PATCH 3/4] FBX: add simple unittest with a simple box. --- test/unit/utFBXImporterExporter.cpp | 6 ++++++ 1 file changed, 6 insertions(+) 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 ); +} From 96b96266016a16723b2df8655a3a246c8b96e67c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 4 Jan 2018 13:17:42 +0100 Subject: [PATCH 4/4] FBX: add missing test file. --- test/models/FBX/box.fbx | Bin 0 -> 17200 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/models/FBX/box.fbx diff --git a/test/models/FBX/box.fbx b/test/models/FBX/box.fbx new file mode 100644 index 0000000000000000000000000000000000000000..cd60d72dad3222dcc9cdc7278fc0387297d4b4df GIT binary patch literal 17200 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