Refactored hollowing backend to use indexed_triangle_mesh

This commit is contained in:
tamasmeszaros 2021-05-26 16:41:34 +02:00
parent f12187b53d
commit e6f97358bc
14 changed files with 204 additions and 68 deletions

View file

@ -77,7 +77,7 @@ static InteriorPtr generate_interior_verbose(const TriangleMesh & mesh,
if (ctl.stopcondition()) return {};
else ctl.statuscb(0, L("Hollowing"));
auto gridptr = mesh_to_grid(mesh, {}, voxel_scale, out_range, in_range);
auto gridptr = mesh_to_grid(mesh.its, {}, voxel_scale, out_range, in_range);
assert(gridptr);
@ -136,19 +136,15 @@ InteriorPtr generate_interior(const TriangleMesh & mesh,
if (interior && !interior->mesh.empty()) {
// This flips the normals to be outward facing...
interior->mesh.require_shared_vertices();
indexed_triangle_set its = std::move(interior->mesh.its);
// flip normals back...
swap_normals(interior->mesh);
Slic3r::simplify_mesh(interior->mesh);
Slic3r::simplify_mesh(its);
its_compactify_vertices(interior->mesh);
its_merge_vertices(interior->mesh);
// flip normals back...
for (stl_triangle_vertex_indices &ind : its.indices)
std::swap(ind(0), ind(2));
interior->mesh = Slic3r::TriangleMesh{its};
interior->mesh.repaired = true;
interior->mesh.require_shared_vertices();
swap_normals(interior->mesh);
}
return interior;
@ -325,7 +321,7 @@ void hollow_mesh(TriangleMesh &mesh, const Interior &interior, int flags)
if (flags & hfRemoveInsideTriangles && interior.gridptr)
remove_inside_triangles(mesh, interior);
mesh.merge(interior.mesh);
mesh.merge(TriangleMesh{interior.mesh});
mesh.require_shared_vertices();
}

View file

@ -99,6 +99,12 @@ void cut_drainholes(std::vector<ExPolygons> & obj_slices,
const sla::DrainHoles & holes,
std::function<void(void)> thr);
inline void swap_normals(indexed_triangle_set &its)
{
for (auto &face : its.indices)
std::swap(face(0), face(2));
}
} // namespace sla
} // namespace Slic3r

View file

@ -480,7 +480,6 @@ void pad_blueprint(const indexed_triangle_set &mesh,
{
if (mesh.empty()) return;
assert(mesh.has_shared_vertices());
std::vector<ExPolygons> out = slice_mesh_ex(mesh, heights, thrfn);
size_t count = 0;

View file

@ -45,7 +45,6 @@ std::vector<ExPolygons> SupportTree::slice(const std::vector<float> &grid,
if (!sup_mesh.empty()) {
slices.emplace_back();
assert(sup_mesh.has_shared_vertices());
slices.back() = slice_mesh_ex(sup_mesh, grid, cr, ctl().cancelfn);
}
@ -59,7 +58,6 @@ std::vector<ExPolygons> SupportTree::slice(const std::vector<float> &grid,
auto padgrid = reserve_vector<float>(size_t(cap > 0 ? cap : 0));
std::copy(grid.begin(), maxzit, std::back_inserter(padgrid));
assert(pad_mesh.has_shared_vertices());
slices.back() = slice_mesh_ex(pad_mesh, padgrid, cr, ctl().cancelfn);
}