MeshBoolean.hpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. ///|/ Copyright (c) Prusa Research 2019 - 2023 Tomáš Mészáros @tamasmeszaros, Lukáš Matěna @lukasmatena
  2. ///|/
  3. ///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher
  4. ///|/
  5. #ifndef libslic3r_MeshBoolean_hpp_
  6. #define libslic3r_MeshBoolean_hpp_
  7. #include <memory>
  8. #include <exception>
  9. #include <libslic3r/TriangleMesh.hpp>
  10. #include <Eigen/Geometry>
  11. namespace Slic3r {
  12. namespace MeshBoolean {
  13. using EigenMesh = std::pair<Eigen::MatrixXd, Eigen::MatrixXi>;
  14. TriangleMesh eigen_to_triangle_mesh(const EigenMesh &emesh);
  15. EigenMesh triangle_mesh_to_eigen(const TriangleMesh &mesh);
  16. void minus(EigenMesh &A, const EigenMesh &B);
  17. void self_union(EigenMesh &A);
  18. void minus(TriangleMesh& A, const TriangleMesh& B);
  19. void self_union(TriangleMesh& mesh);
  20. namespace cgal {
  21. struct CGALMesh;
  22. struct CGALMeshDeleter { void operator()(CGALMesh *ptr); };
  23. using CGALMeshPtr = std::unique_ptr<CGALMesh, CGALMeshDeleter>;
  24. CGALMeshPtr clone(const CGALMesh &m);
  25. CGALMeshPtr triangle_mesh_to_cgal(
  26. const std::vector<stl_vertex> &V,
  27. const std::vector<stl_triangle_vertex_indices> &F);
  28. inline CGALMeshPtr triangle_mesh_to_cgal(const indexed_triangle_set &M)
  29. {
  30. return triangle_mesh_to_cgal(M.vertices, M.indices);
  31. }
  32. inline CGALMeshPtr triangle_mesh_to_cgal(const TriangleMesh &M)
  33. {
  34. return triangle_mesh_to_cgal(M.its);
  35. }
  36. TriangleMesh cgal_to_triangle_mesh(const CGALMesh &cgalmesh);
  37. indexed_triangle_set cgal_to_indexed_triangle_set(const CGALMesh &cgalmesh);
  38. // Do boolean mesh difference with CGAL bypassing igl.
  39. void minus(TriangleMesh &A, const TriangleMesh &B);
  40. void plus(TriangleMesh &A, const TriangleMesh &B);
  41. void intersect(TriangleMesh &A, const TriangleMesh &B);
  42. void minus(indexed_triangle_set &A, const indexed_triangle_set &B);
  43. void plus(indexed_triangle_set &A, const indexed_triangle_set &B);
  44. void intersect(indexed_triangle_set &A, const indexed_triangle_set &B);
  45. void minus(CGALMesh &A, CGALMesh &B);
  46. void plus(CGALMesh &A, CGALMesh &B);
  47. void intersect(CGALMesh &A, CGALMesh &B);
  48. bool does_self_intersect(const TriangleMesh &mesh);
  49. bool does_self_intersect(const CGALMesh &mesh);
  50. bool does_bound_a_volume(const CGALMesh &mesh);
  51. bool empty(const CGALMesh &mesh);
  52. }
  53. } // namespace MeshBoolean
  54. } // namespace Slic3r
  55. #endif // libslic3r_MeshBoolean_hpp_