#ifndef SLA_HOLLOWING_HPP #define SLA_HOLLOWING_HPP #include #include #include namespace Slic3r { namespace sla { struct HollowingConfig { double min_thickness = 2.; double quality = 0.5; double closing_distance = 0.5; bool enabled = true; }; enum HollowingFlags { hfRemoveInsideTriangles = 0x1 }; // All data related to a generated mesh interior. Includes the 3D grid and mesh // and various metadata. No need to manipulate from outside. struct Interior; struct InteriorDeleter { void operator()(Interior *p); }; using InteriorPtr = std::unique_ptr; indexed_triangle_set & get_mesh(Interior &interior); const indexed_triangle_set &get_mesh(const Interior &interior); struct DrainHole { Vec3f pos; Vec3f normal; float radius; float height; bool failed = false; DrainHole() : pos(Vec3f::Zero()), normal(Vec3f::UnitZ()), radius(5.f), height(10.f) {} DrainHole(Vec3f p, Vec3f n, float r, float h, bool fl = false) : pos(p), normal(n), radius(r), height(h), failed(fl) {} DrainHole(const DrainHole& rhs) : DrainHole(rhs.pos, rhs.normal, rhs.radius, rhs.height, rhs.failed) {} bool operator==(const DrainHole &sp) const; bool operator!=(const DrainHole &sp) const { return !(sp == (*this)); } bool is_inside(const Vec3f& pt) const; bool get_intersections(const Vec3f& s, const Vec3f& dir, std::array, 2>& out) const; indexed_triangle_set to_mesh() const; template inline void serialize(Archive &ar) { ar(pos, normal, radius, height, failed); } static constexpr size_t steps = 32; }; using DrainHoles = std::vector; constexpr float HoleStickOutLength = 1.f; InteriorPtr generate_interior(const TriangleMesh &mesh, const HollowingConfig & = {}, const JobController &ctl = {}); // Will do the hollowing void hollow_mesh(TriangleMesh &mesh, const HollowingConfig &cfg, int flags = 0); // Hollowing prepared in "interior", merge with original mesh void hollow_mesh(TriangleMesh &mesh, const Interior &interior, int flags = 0); void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, const std::vector &exclude_mask = {}); double get_distance(const Vec3f &p, const Interior &interior); template FloatingOnly get_distance(const Vec<3, T> &p, const Interior &interior) { return get_distance(Vec3f(p.template cast()), interior); } void cut_drainholes(std::vector & obj_slices, const std::vector &slicegrid, float closing_radius, const sla::DrainHoles & holes, std::function thr); inline void swap_normals(indexed_triangle_set &its) { for (auto &face : its.indices) std::swap(face(0), face(2)); } } // namespace sla } // namespace Slic3r #endif // HOLLOWINGFILTER_H