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-e03cc46cb475master
parent
29b2fa974e
commit
c89676d042
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue