From 84917c12834d8096127112b35e7fe4de7b145ba8 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 26 Feb 2024 16:56:01 -0500 Subject: [PATCH] WIP: Directly create Manifold from PolySet before attempting repair --- src/geometry/manifold/manifoldutils.cc | 69 +++++++++++++------------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/src/geometry/manifold/manifoldutils.cc b/src/geometry/manifold/manifoldutils.cc index a47bb316b7..c982d84ada 100644 --- a/src/geometry/manifold/manifoldutils.cc +++ b/src/geometry/manifold/manifoldutils.cc @@ -149,44 +149,45 @@ std::shared_ptr createManifoldFromPolySet(const PolySet& LOG("Warning: [manifold] PolySet -> Manifold conversion failed: %1$s\n" "Trying to repair and reconstruct mesh", ManifoldUtils::statusToString(mani->Status())); -{ -#ifdef ENABLE_CGAL - PolySet psq(ps); - std::vector points3d; - psq.quantizeVertices(&points3d); - auto ps_tri = PolySetUtils::tessellate_faces(psq); - - CGAL_DoubleMesh m; - - if (ps_tri->is_convex()) { - using K = CGAL::Epick; - // Collect point cloud - std::vector points(points3d.size()); - for (size_t i = 0, n = points3d.size(); i < n; i++) { - points[i] = CGALUtils::vector_convert(points3d[i]); + { + #ifdef ENABLE_CGAL + PolySet psq(ps); + std::vector points3d; + psq.quantizeVertices(&points3d); + auto ps_tri = PolySetUtils::tessellate_faces(psq); + + CGAL_DoubleMesh m; + + if (ps_tri->is_convex()) { + using K = CGAL::Epick; + // Collect point cloud + std::vector points(points3d.size()); + for (size_t i = 0, n = points3d.size(); i < n; i++) { + points[i] = CGALUtils::vector_convert(points3d[i]); + } + if (points.size() <= 3) return std::make_shared(); + + // Apply hull + CGAL::Surface_mesh> r; + CGAL::convex_hull_3(points.begin(), points.end(), r); + CGALUtils::copyMesh(r, m); + } else { + CGALUtils::createMeshFromPolySet(*ps_tri, m); } - if (points.size() <= 3) return std::make_shared(); - - // Apply hull - CGAL::Surface_mesh> r; - CGAL::convex_hull_3(points.begin(), points.end(), r); - CGALUtils::copyMesh(r, m); - } else { - CGALUtils::createMeshFromPolySet(*ps_tri, m); - } - if (!ps_tri->is_convex()) { - if (CGALUtils::isClosed(m)) { - CGALUtils::orientToBoundAVolume(m); - } else { - LOG(message_group::Error, "[manifold] Input mesh is not closed!"); + if (!ps_tri->is_convex()) { + if (CGALUtils::isClosed(m)) { + CGALUtils::orientToBoundAVolume(m); + } else { + LOG(message_group::Error, "[manifold] Input mesh is not closed!"); + } } - } - return createManifoldFromSurfaceMesh(m); -#else - return std::make_shared(); -#endif + return createManifoldFromSurfaceMesh(m); + #else + return std::make_shared(); + #endif + } } std::shared_ptr createManifoldFromGeometry(const std::shared_ptr& geom) {