- Ifc: always remove degenerate geometry from geometric entities after finishing processing.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1320 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/6/merge
aramis_acg 2012-10-21 19:12:18 +00:00
parent a598ac53b4
commit c3adc004bf
2 changed files with 14 additions and 4 deletions

View File

@ -1975,6 +1975,7 @@ bool ProcessGeometricItem(const IfcRepresentationItem& geo, std::vector<unsigned
}
meshtmp.RemoveAdjacentDuplicates();
meshtmp.RemoveDegenerates();
if(fix_orientation) {
meshtmp.FixupFaceOrientation();

View File

@ -137,21 +137,30 @@ void TempMesh::RemoveDegenerates()
// of the polygons, which is close to zero for lines.
std::vector<IfcVector3> normals;
ComputePolygonNormals(normals);
ComputePolygonNormals(normals, false);
bool drop = false;
size_t inor = 0;
std::vector<IfcVector3>::const_iterator vit = verts.begin();
for (std::vector<unsigned int>::const_iterator it = vertcnt.begin(); it != vertcnt.end();) {
for (std::vector<unsigned int>::const_iterator it = vertcnt.begin(); it != vertcnt.end(); ++inor) {
const unsigned int pcount = *it;
if (normals[std::distance(static_cast<std::vector<unsigned int>::const_iterator>(vertcnt.begin()),it)].SquareLength() < 1e-5f) {
if (normals[inor].SquareLength() < 1e-5f) {
it = vertcnt.erase(it);
vit = verts.erase(vit, vit + pcount);
drop = true;
continue;
}
vit += pcount;
++it;
}
if(drop) {
IFCImporter::LogDebug("removing degenerate faces");
}
}
// ------------------------------------------------------------------------------------------------
@ -298,7 +307,7 @@ void TempMesh::RemoveAdjacentDuplicates()
base += cnt;
}
if(drop) {
IFCImporter::LogDebug("removed duplicate vertices");
IFCImporter::LogDebug("removing duplicate vertices");
}
}