From c89676d042937603271e9ecadbfb56feabe41398 Mon Sep 17 00:00:00 2001 From: cutealien Date: Mon, 24 Jun 2019 10:13:09 +0000 Subject: [PATCH] Ignore degenerated faces in obj file loader when they would generate triangles where 2 vertices use identical indices. This mostly happens because we merge vertices by position in the meshloader. But such triangles tend to cause troubles and won't render, so kick them out. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@5826 dfc29bdd-3216-0410-991c-e03cc46cb475 --- changes.txt | 1 + source/Irrlicht/COBJMeshFileLoader.cpp | 25 ++++++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/changes.txt b/changes.txt index 8827bc66..02822dcc 100644 --- a/changes.txt +++ b/changes.txt @@ -1,5 +1,6 @@ -------------------------- Changes in 1.9 (not yet released) +- Ignore degenerated faces in obj file loader when they would generate triangles where 2 vertices use identical indices. - Add CMatrix4::transformVec4 to transform vectors with 4 elements (thx @ devsh) - Add ITexture::getOriginalColorFormat to access color format of images used to create a texture - Add IMemoryReadFile interface which allows direct access to memory block used as file. diff --git a/source/Irrlicht/COBJMeshFileLoader.cpp b/source/Irrlicht/COBJMeshFileLoader.cpp index 9b1eba5d..61663f67 100644 --- a/source/Irrlicht/COBJMeshFileLoader.cpp +++ b/source/Irrlicht/COBJMeshFileLoader.cpp @@ -104,6 +104,7 @@ IAnimatedMesh* COBJMeshFileLoader::createMesh(io::IReadFile* file) core::array faceCorners; faceCorners.reallocate(32); // should be large enough const core::stringc TAG_OFF = "off"; + irr::u32 degeneratedFaces = 0; while(bufPtr != bufEnd) { @@ -275,12 +276,22 @@ IAnimatedMesh* COBJMeshFileLoader::createMesh(io::IReadFile* file) } // triangulate the face + const int c = faceCorners[0]; for ( u32 i = 1; i < faceCorners.size() - 1; ++i ) { // Add a triangle - currMtl->Meshbuffer->Indices.push_back( faceCorners[i+1] ); - currMtl->Meshbuffer->Indices.push_back( faceCorners[i] ); - currMtl->Meshbuffer->Indices.push_back( faceCorners[0] ); + const int a = faceCorners[i + 1]; + const int b = faceCorners[i]; + if (a != b && a != c && b != c) // ignore degenerated faces. We can get them when we merge vertices above in the VertMap. + { + currMtl->Meshbuffer->Indices.push_back(a); + currMtl->Meshbuffer->Indices.push_back(b); + currMtl->Meshbuffer->Indices.push_back(c); + } + else + { + ++degeneratedFaces; + } } } break; @@ -294,6 +305,14 @@ IAnimatedMesh* COBJMeshFileLoader::createMesh(io::IReadFile* file) ++lineNr; } // end while(bufPtr && (bufPtr-buf 0 ) + { + irr::core::stringc log(degeneratedFaces); + log += " degenerated faces removed in "; + log += irr::core::stringc(fullName); + os::Printer::log(log.c_str(), ELL_INFORMATION); + } + SMesh* mesh = new SMesh(); // Combine all the groups (meshbuffers) into the mesh