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
master
cutealien 2019-06-24 10:13:09 +00:00
parent 29b2fa974e
commit c89676d042
2 changed files with 23 additions and 3 deletions

View File

@ -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.

View File

@ -104,6 +104,7 @@ IAnimatedMesh* COBJMeshFileLoader::createMesh(io::IReadFile* file)
core::array<int> 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<filesize))
if ( degeneratedFaces > 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