+ if ( hasEdgeIntersections && iPolygon == _polygons.size() - 1 )
+ {
+ // check that a polygon does not lie in the plane of another polygon
+ coplanarPolyg = 0;
+ for ( size_t iL = 0; iL < polygon._links.size() && !coplanarPolyg; ++iL )
+ {
+ if ( polygon._links[ iL ].NbFaces() < 2 )
+ continue; // it's a just added free link
+ // look for a polygon made on a hexa side and sharing
+ // two or more haxa links
+ size_t iL2;
+ coplanarPolyg = polygon._links[ iL ]._link->_faces[0];
+ for ( iL2 = iL + 1; iL2 < polygon._links.size(); ++iL2 )
+ if ( polygon._links[ iL2 ]._link->_faces[0] == coplanarPolyg &&
+ !coplanarPolyg->isPolyLink( polygon._links[ iL2 ]) &&
+ coplanarPolyg < & _polygons[ nbQuadPolygons ])
+ break;
+ if ( iL2 == polygon._links.size() )
+ coplanarPolyg = 0;
+ }
+ if ( 0 /*coplanarPolyg*/ ) // coplanar polygon found
+ {
+ freeLinks.resize( freeLinks.size() - polygon._polyLinks.size() );
+ nbFreeLinks -= polygon._polyLinks.size();
+
+ // fill freeLinks with links not shared by coplanarPolyg and polygon
+ for ( size_t iL = 0; iL < polygon._links.size(); ++iL )
+ if ( polygon._links[ iL ]._link->_faces[1] &&
+ polygon._links[ iL ]._link->_faces[0] != coplanarPolyg )
+ {
+ _Face* p = polygon._links[ iL ]._link->_faces[0];
+ for ( size_t iL2 = 0; iL2 < p->_links.size(); ++iL2 )
+ if ( p->_links[ iL2 ]._link == polygon._links[ iL ]._link )
+ {
+ freeLinks.push_back( & p->_links[ iL2 ] );
+ ++nbFreeLinks;
+ freeLinks.back()->RemoveFace( &polygon );
+ break;
+ }
+ }
+ for ( size_t iL = 0; iL < coplanarPolyg->_links.size(); ++iL )
+ if ( coplanarPolyg->_links[ iL ]._link->_faces[1] &&
+ coplanarPolyg->_links[ iL ]._link->_faces[1] != &polygon )
+ {
+ _Face* p = coplanarPolyg->_links[ iL ]._link->_faces[0];
+ if ( p == coplanarPolyg )
+ p = coplanarPolyg->_links[ iL ]._link->_faces[1];
+ for ( size_t iL2 = 0; iL2 < p->_links.size(); ++iL2 )
+ if ( p->_links[ iL2 ]._link == coplanarPolyg->_links[ iL ]._link )
+ {
+ freeLinks.push_back( & p->_links[ iL2 ] );
+ ++nbFreeLinks;
+ freeLinks.back()->RemoveFace( coplanarPolyg );
+ break;
+ }
+ }
+ // set coplanarPolyg to be re-created next
+ for ( size_t iP = 0; iP < _polygons.size(); ++iP )
+ if ( coplanarPolyg == & _polygons[ iP ] )
+ {
+ iPolygon = iP;
+ _polygons[ iPolygon ]._links.clear();
+ _polygons[ iPolygon ]._polyLinks.clear();
+ break;
+ }
+ if ( freeLinks.back() == &polygon._links.back() )
+ {
+ freeLinks.pop_back();
+ --nbFreeLinks;
+ }
+ _polygons.pop_back();
+ usedFaceIDs.erase( curFace );
+ continue;
+ } // if ( coplanarPolyg )
+ } // if ( hasEdgeIntersections )
+
+ iPolygon = _polygons.size();
+
+ } // end of case ( polygon._links.size() > 2 )