diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index d456fb9c6..a03e6f436 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -22,6 +22,7 @@ typedef Point Vector; // Vector types with a fixed point coordinate base type. typedef Eigen::Matrix Vec2crd; typedef Eigen::Matrix Vec3crd; +typedef Eigen::Matrix Vec2i; typedef Eigen::Matrix Vec3i; typedef Eigen::Matrix Vec2i64; typedef Eigen::Matrix Vec3i64; diff --git a/src/libslic3r/Tesselate.cpp b/src/libslic3r/Tesselate.cpp index f4ce0703d..febb3d0e7 100644 --- a/src/libslic3r/Tesselate.cpp +++ b/src/libslic3r/Tesselate.cpp @@ -20,7 +20,7 @@ public: gluDeleteTess(m_tesselator); } - Pointf3s tesselate(const ExPolygon &expoly, double z_, bool flipped_) + std::vector tesselate3d(const ExPolygon &expoly, double z_, bool flipped_) { m_z = z_; m_flipped = flipped_; @@ -56,7 +56,7 @@ public: return std::move(m_output_triangles); } - Pointf3s tesselate(const ExPolygons &expolygons, double z_, bool flipped_) + std::vector tesselate3d(const ExPolygons &expolygons, double z_, bool flipped_) { m_z = z_; m_flipped = flipped_; @@ -189,16 +189,60 @@ private: bool m_flipped; }; -Pointf3s triangulate_expolygons_3df(const ExPolygon &poly, coordf_t z, bool flip) +std::vector triangulate_expolygon_3d(const ExPolygon &poly, coordf_t z, bool flip) { GluTessWrapper tess; - return tess.tesselate(poly, z, flip); + return tess.tesselate3d(poly, z, flip); } -Pointf3s triangulate_expolygons_3df(const ExPolygons &polys, coordf_t z, bool flip) +std::vector triangulate_expolygons_3d(const ExPolygons &polys, coordf_t z, bool flip) { GluTessWrapper tess; - return tess.tesselate(polys, z, flip); + return tess.tesselate3d(polys, z, flip); +} + +std::vector triangulate_expolygon_2d(const ExPolygon &poly, bool flip) +{ + GluTessWrapper tess; + std::vector triangles = tess.tesselate3d(poly, 0, flip); + std::vector out; + out.reserve(triangles.size()); + for (const Vec3d &pt : triangles) + out.emplace_back(pt.x(), pt.y()); + return out; +} + +std::vector triangulate_expolygons_2d(const ExPolygons &polys, bool flip) +{ + GluTessWrapper tess; + std::vector triangles = tess.tesselate3d(polys, 0, flip); + std::vector out; + out.reserve(triangles.size()); + for (const Vec3d &pt : triangles) + out.emplace_back(pt.x(), pt.y()); + return out; +} + +std::vector triangulate_expolygon_2f(const ExPolygon &poly, bool flip) +{ + GluTessWrapper tess; + std::vector triangles = tess.tesselate3d(poly, 0, flip); + std::vector out; + out.reserve(triangles.size()); + for (const Vec3d &pt : triangles) + out.emplace_back(float(pt.x()), float(pt.y())); + return out; +} + +std::vector triangulate_expolygons_2f(const ExPolygons &polys, bool flip) +{ + GluTessWrapper tess; + std::vector triangles = tess.tesselate3d(polys, 0, flip); + std::vector out; + out.reserve(triangles.size()); + for (const Vec3d &pt : triangles) + out.emplace_back(float(pt.x()), float(pt.y())); + return out; } } // namespace Slic3r diff --git a/src/libslic3r/Tesselate.hpp b/src/libslic3r/Tesselate.hpp index ed12df888..02e86eb33 100644 --- a/src/libslic3r/Tesselate.hpp +++ b/src/libslic3r/Tesselate.hpp @@ -10,8 +10,12 @@ namespace Slic3r { class ExPolygon; typedef std::vector ExPolygons; -extern Pointf3s triangulate_expolygons_3df(const ExPolygon &poly, coordf_t z = 0, bool flip = false); -extern Pointf3s triangulate_expolygons_3df(const ExPolygons &polys, coordf_t z = 0, bool flip = false); +extern std::vector triangulate_expolygon_3d (const ExPolygon &poly, coordf_t z = 0, bool flip = false); +extern std::vector triangulate_expolygons_3d(const ExPolygons &polys, coordf_t z = 0, bool flip = false); +extern std::vector triangulate_expolygon_2d (const ExPolygon &poly, bool flip = false); +extern std::vector triangulate_expolygons_2d(const ExPolygons &polys, bool flip = false); +extern std::vector triangulate_expolygon_2f (const ExPolygon &poly, bool flip = false); +extern std::vector triangulate_expolygons_2f(const ExPolygons &polys, bool flip = false); } // namespace Slic3r diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index b93ce12b5..0784b44f2 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -1781,7 +1781,7 @@ void TriangleMeshSlicer::cut(float z, TriangleMesh* upper, TriangleMesh* lower) BOOST_LOG_TRIVIAL(trace) << "TriangleMeshSlicer::cut - triangulating upper part"; ExPolygons section; this->make_expolygons_simple(upper_lines, §ion); - Pointf3s triangles = triangulate_expolygons_3df(section, z, true); + Pointf3s triangles = triangulate_expolygons_3d(section, z, true); stl_facet facet; facet.normal = stl_normal(0, 0, -1.f); for (size_t i = 0; i < triangles.size(); ) { @@ -1795,7 +1795,7 @@ void TriangleMeshSlicer::cut(float z, TriangleMesh* upper, TriangleMesh* lower) BOOST_LOG_TRIVIAL(trace) << "TriangleMeshSlicer::cut - triangulating lower part"; ExPolygons section; this->make_expolygons_simple(lower_lines, §ion); - Pointf3s triangles = triangulate_expolygons_3df(section, z, false); + Pointf3s triangles = triangulate_expolygons_3d(section, z, false); stl_facet facet; facet.normal = stl_normal(0, 0, -1.f); for (size_t i = 0; i < triangles.size(); ) { diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 76c0337d1..63dcd950b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6833,20 +6833,20 @@ void GLCanvas3D::_render_sla_slices() const { // calculate model bottom cap if (bottom_obj_triangles.empty() && (it_min_z->second.model_slices_idx < model_slices.size())) - bottom_obj_triangles = triangulate_expolygons_3df(model_slices[it_min_z->second.model_slices_idx], min_z, true); + bottom_obj_triangles = triangulate_expolygons_3d(model_slices[it_min_z->second.model_slices_idx], min_z, true); // calculate support bottom cap if (bottom_sup_triangles.empty() && (it_min_z->second.support_slices_idx < support_slices.size())) - bottom_sup_triangles = triangulate_expolygons_3df(support_slices[it_min_z->second.support_slices_idx], min_z, true); + bottom_sup_triangles = triangulate_expolygons_3d(support_slices[it_min_z->second.support_slices_idx], min_z, true); } if (it_max_z != index.end()) { // calculate model top cap if (top_obj_triangles.empty() && (it_max_z->second.model_slices_idx < model_slices.size())) - top_obj_triangles = triangulate_expolygons_3df(model_slices[it_max_z->second.model_slices_idx], max_z, false); + top_obj_triangles = triangulate_expolygons_3d(model_slices[it_max_z->second.model_slices_idx], max_z, false); // calculate support top cap if (top_sup_triangles.empty() && (it_max_z->second.support_slices_idx < support_slices.size())) - top_sup_triangles = triangulate_expolygons_3df(support_slices[it_max_z->second.support_slices_idx], max_z, false); + top_sup_triangles = triangulate_expolygons_3d(support_slices[it_max_z->second.support_slices_idx], max_z, false); } }