From 190190c1d75c32e0f2a758c9bbe37bd085a0d59e Mon Sep 17 00:00:00 2001 From: Josh Faust Date: Tue, 27 Feb 2018 14:58:04 -0800 Subject: [PATCH 1/2] Fix material index off-by-one error in some OBJ files (seen in a C4D export) --- code/ObjFileMtlImporter.cpp | 5 ++-- test/models/OBJ/cube_mtllib_after_g.mtl | 5 ++++ test/models/OBJ/cube_mtllib_after_g.obj | 32 +++++++++++++++++++++++++ test/unit/utObjImportExport.cpp | 13 ++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 test/models/OBJ/cube_mtllib_after_g.mtl create mode 100644 test/models/OBJ/cube_mtllib_after_g.obj diff --git a/code/ObjFileMtlImporter.cpp b/code/ObjFileMtlImporter.cpp index 835f529cc..584b3115c 100644 --- a/code/ObjFileMtlImporter.cpp +++ b/code/ObjFileMtlImporter.cpp @@ -303,11 +303,12 @@ void ObjFileMtlImporter::createMaterial() // New Material created m_pModel->m_pCurrentMaterial = new ObjFile::Material(); m_pModel->m_pCurrentMaterial->MaterialName.Set( name ); + m_pModel->m_MaterialLib.push_back( name ); + m_pModel->m_MaterialMap[ name ] = m_pModel->m_pCurrentMaterial; + if (m_pModel->m_pCurrentMesh) { m_pModel->m_pCurrentMesh->m_uiMaterialIndex = static_cast(m_pModel->m_MaterialLib.size() - 1); } - m_pModel->m_MaterialLib.push_back( name ); - m_pModel->m_MaterialMap[ name ] = m_pModel->m_pCurrentMaterial; } else { // Use older material m_pModel->m_pCurrentMaterial = (*it).second; diff --git a/test/models/OBJ/cube_mtllib_after_g.mtl b/test/models/OBJ/cube_mtllib_after_g.mtl new file mode 100644 index 000000000..63dde71af --- /dev/null +++ b/test/models/OBJ/cube_mtllib_after_g.mtl @@ -0,0 +1,5 @@ +newmtl MyMaterial +Ka 1.000 1.000 1.000 +Kd 1.000 1.000 1.000 +Ns 200.000 +Ks 0.050 0.050 0.050 diff --git a/test/models/OBJ/cube_mtllib_after_g.obj b/test/models/OBJ/cube_mtllib_after_g.obj new file mode 100644 index 000000000..dfd5997e8 --- /dev/null +++ b/test/models/OBJ/cube_mtllib_after_g.obj @@ -0,0 +1,32 @@ +g Object +mtllib cube_mtllib_after_g.mat +usemtl MyMaterial + +v 0.0 0.0 0.0 +v 0.0 0.0 1.0 +v 0.0 1.0 0.0 +v 0.0 1.0 1.0 +v 1.0 0.0 0.0 +v 1.0 0.0 1.0 +v 1.0 1.0 0.0 +v 1.0 1.0 1.0 + +vn 0.0 0.0 1.0 +vn 0.0 0.0 -1.0 +vn 0.0 1.0 0.0 +vn 0.0 -1.0 0.0 +vn 1.0 0.0 0.0 +vn -1.0 0.0 0.0 + +f 1//2 7//2 5//2 +f 1//2 3//2 7//2 +f 1//6 4//6 3//6 +f 1//6 2//6 4//6 +f 3//3 8//3 7//3 +f 3//3 4//3 8//3 +f 5//5 7//5 8//5 +f 5//5 8//5 6//5 +f 1//4 5//4 6//4 +f 1//4 6//4 2//4 +f 2//1 6//1 8//1 +f 2//1 8//1 4//1 diff --git a/test/unit/utObjImportExport.cpp b/test/unit/utObjImportExport.cpp index 5a2e42350..10207a5bf 100644 --- a/test/unit/utObjImportExport.cpp +++ b/test/unit/utObjImportExport.cpp @@ -354,3 +354,16 @@ TEST_F(utObjImportExport, 0based_array_Test) { const aiScene *scene = myimporter.ReadFileFromMemory(ObjModel.c_str(), ObjModel.size(), 0); EXPECT_EQ(nullptr, scene); } + +TEST_F( utObjImportExport, mtllib_after_g ) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/OBJ/cube_mtllib_after_g.obj", aiProcess_ValidateDataStructure ); + ASSERT_NE( nullptr, scene ); + + EXPECT_EQ(scene->mNumMeshes, 1U); + const aiMesh *mesh = scene->mMeshes[0]; + const aiMaterial* mat = scene->mMaterials[mesh->mMaterialIndex]; + aiString name; + ASSERT_EQ(aiReturn_SUCCESS, mat->Get(AI_MATKEY_NAME, name)); + EXPECT_STREQ("MyMaterial", name.C_Str()); +} \ No newline at end of file From d82fff757bcb003cb10af9d11f862b8451bebbde Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 5 Mar 2018 15:01:37 +0100 Subject: [PATCH 2/2] Update utObjImportExport.cpp Add missing end of line. --- test/unit/utObjImportExport.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/utObjImportExport.cpp b/test/unit/utObjImportExport.cpp index 10207a5bf..8aec9c443 100644 --- a/test/unit/utObjImportExport.cpp +++ b/test/unit/utObjImportExport.cpp @@ -366,4 +366,4 @@ TEST_F( utObjImportExport, mtllib_after_g ) { aiString name; ASSERT_EQ(aiReturn_SUCCESS, mat->Get(AI_MATKEY_NAME, name)); EXPECT_STREQ("MyMaterial", name.C_Str()); -} \ No newline at end of file +}