From fa191e44f2061cb4ae31986ec951d4defc020a66 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Thu, 23 Jan 2025 16:35:51 +0100 Subject: [PATCH] cgal kernel: Move orientation logic #5987 --- src/ifcgeom/kernels/cgal/CgalKernel.cpp | 30 +++++++++++++++++-------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/ifcgeom/kernels/cgal/CgalKernel.cpp b/src/ifcgeom/kernels/cgal/CgalKernel.cpp index 4936d8d9cd..fed22b670e 100644 --- a/src/ifcgeom/kernels/cgal/CgalKernel.cpp +++ b/src/ifcgeom/kernels/cgal/CgalKernel.cpp @@ -88,16 +88,8 @@ CGAL::Polyhedron_3 ifcopenshell::geometry::utils::create_polyhedron(std // fresult << polyhedron << std::endl; // fresult.close(); return CGAL::Polyhedron_3(); - } if (polyhedron.is_closed()) { - try { - if (!CGAL::Polygon_mesh_processing::is_outward_oriented(polyhedron)) { - CGAL::Polygon_mesh_processing::reverse_face_orientations(polyhedron); - } - } catch (CGAL::Failure_exception& e) { - Logger::Message(Logger::LOG_ERROR, e); - } } - + // std::cout << "After: " << polyhedron.size_of_vertices() << " vertices and " << polyhedron.size_of_facets() << " facets" << std::endl; return polyhedron; @@ -122,6 +114,15 @@ CGAL::Polyhedron_3 ifcopenshell::geometry::utils::create_polyhedron(con CGAL::Nef_polyhedron_3 ifcopenshell::geometry::utils::create_nef_polyhedron(std::list &face_list) { CGAL::Polyhedron_3 polyhedron = create_polyhedron(face_list); + if (polyhedron.is_closed()) { + try { + if (!CGAL::Polygon_mesh_processing::is_outward_oriented(polyhedron)) { + CGAL::Polygon_mesh_processing::reverse_face_orientations(polyhedron); + } + } catch (CGAL::Failure_exception& e) { + Logger::Message(Logger::LOG_ERROR, e); + } + } CGAL::Polygon_mesh_processing::triangulate_faces(polyhedron); CGAL::Nef_polyhedron_3 nef_polyhedron; try { @@ -135,6 +136,17 @@ CGAL::Nef_polyhedron_3 ifcopenshell::geometry::utils::create_nef_polyhe CGAL::Nef_polyhedron_3 ifcopenshell::geometry::utils::create_nef_polyhedron(CGAL::Polyhedron_3 &polyhedron) { // @todo needed? polyhedron.normalize_border(); + + if (polyhedron.is_closed()) { + try { + if (!CGAL::Polygon_mesh_processing::is_outward_oriented(polyhedron)) { + CGAL::Polygon_mesh_processing::reverse_face_orientations(polyhedron); + } + } catch (CGAL::Failure_exception& e) { + Logger::Message(Logger::LOG_ERROR, e); + } + } + if (polyhedron.is_valid(false, 3) && polyhedron.is_closed()) { // @todo is it necessary to triangulat? CGAL::Polygon_mesh_processing::triangulate_faces(polyhedron);