diff --git a/src/libslic3r/CSGMesh/VoxelizeCSGMesh.hpp b/src/libslic3r/CSGMesh/VoxelizeCSGMesh.hpp index c76187723..f64d17b9a 100644 --- a/src/libslic3r/CSGMesh/VoxelizeCSGMesh.hpp +++ b/src/libslic3r/CSGMesh/VoxelizeCSGMesh.hpp @@ -37,7 +37,11 @@ inline void perform_csg(CSGType op, VoxelGridPtr &dst, VoxelGridPtr &src) switch (op) { case CSGType::Union: - grid_union(*dst, *src); + if (is_grid_empty(*dst) && !is_grid_empty(*src)) + dst = clone(*src); + else + grid_union(*dst, *src); + break; case CSGType::Difference: grid_difference(*dst, *src); diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp index 5d00fac0d..21409445f 100644 --- a/src/libslic3r/OpenVDBUtils.cpp +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -300,4 +300,9 @@ void rescale_grid(VoxelGrid &grid, float scale) // grid.grid.setTransform(tr); } +bool is_grid_empty(const VoxelGrid &grid) +{ + return grid.grid.empty(); +} + } // namespace Slic3r diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp index cb857020f..d4996854c 100644 --- a/src/libslic3r/OpenVDBUtils.hpp +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -77,6 +77,8 @@ void grid_union(VoxelGrid &grid, VoxelGrid &arg); void grid_difference(VoxelGrid &grid, VoxelGrid &arg); void grid_intersection(VoxelGrid &grid, VoxelGrid &arg); +bool is_grid_empty(const VoxelGrid &grid); + } // namespace Slic3r #endif // OPENVDBUTILS_HPP diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 31289e7ba..634cde469 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -75,11 +75,12 @@ InteriorPtr generate_interior(const VoxelGrid &vgrid, const HollowingConfig &hc, const JobController &ctl) { - double offset = hc.min_thickness; - double D = hc.closing_distance; - float in_range = 1.1f * float(offset + D); - auto narrowb = 3.f / get_voxel_scale(vgrid); - float out_range = narrowb; + double voxsc = get_voxel_scale(vgrid); + double offset = hc.min_thickness; // world units + double D = hc.closing_distance; // world units + float in_range = 1.1f * float(offset + D); // world units + float out_range = 1.f / voxsc; // world units + auto narrowb = 1.f; // voxel units (voxel count) if (ctl.stopcondition()) return {}; else ctl.statuscb(0, L("Hollowing")); @@ -91,12 +92,12 @@ InteriorPtr generate_interior(const VoxelGrid &vgrid, double iso_surface = D; if (D > EPSILON) { - in_range = narrowb; - gridptr = redistance_grid(*gridptr, -(offset + D), narrowb, in_range); + gridptr = redistance_grid(*gridptr, -(offset + D), narrowb, narrowb); - gridptr = dilate_grid(*gridptr, std::ceil(iso_surface), 0.f); + gridptr = dilate_grid(*gridptr, 1.1 * std::ceil(iso_surface), 0.f); out_range = iso_surface; + in_range = narrowb / voxsc; } else { iso_surface = -offset; } diff --git a/src/libslic3r/SLA/Hollowing.hpp b/src/libslic3r/SLA/Hollowing.hpp index c21bdff4e..b6c07aff5 100644 --- a/src/libslic3r/SLA/Hollowing.hpp +++ b/src/libslic3r/SLA/Hollowing.hpp @@ -91,15 +91,15 @@ inline InteriorPtr generate_interior(const indexed_triangle_set &mesh, auto statusfn = [&ctl](int){ return ctl.stopcondition && ctl.stopcondition(); }; auto grid = mesh_to_grid(mesh, MeshToGridParams{} .voxel_scale(voxel_scale) - .exterior_bandwidth(1.f) - .interior_bandwidth(1.f) + .exterior_bandwidth(3.f) + .interior_bandwidth(3.f) .statusfn(statusfn)); if (!grid || (ctl.stopcondition && ctl.stopcondition())) return {}; - if (its_is_splittable(mesh)) - grid = redistance_grid(*grid, 0.0f, 6.f / voxel_scale, 6.f / voxel_scale); +// if (its_is_splittable(mesh)) + grid = redistance_grid(*grid, 0.0f, 3.f, 3.f); return grid ? generate_interior(*grid, hc, ctl) : InteriorPtr{}; } @@ -132,11 +132,12 @@ InteriorPtr generate_interior(const Range &csgparts, const JobController &ctl = {}) { double mesh_vol = csgmesh_positive_maxvolume(csgparts); + double voxsc = get_voxel_scale(mesh_vol, hc); auto params = csg::VoxelizeParams{} - .voxel_scale(get_voxel_scale(mesh_vol, hc)) - .exterior_bandwidth(1.f) - .interior_bandwidth(1.f) + .voxel_scale(voxsc) + .exterior_bandwidth(3.f) + .interior_bandwidth(3.f) .statusfn([&ctl](int){ return ctl.stopcondition && ctl.stopcondition(); }); auto ptr = csg::voxelize_csgmesh(csgparts, params); @@ -144,11 +145,10 @@ InteriorPtr generate_interior(const Range &csgparts, if (!ptr || (ctl.stopcondition && ctl.stopcondition())) return {}; - if (csgparts.size() > 1 || its_is_splittable(*csg::get_mesh(*csgparts.begin()))) - ptr = redistance_grid(*ptr, - 0.0f, - 6.f / params.voxel_scale(), - 6.f / params.voxel_scale()); + // TODO: figure out issues without the redistance +// if (csgparts.size() > 1 || its_is_splittable(*csg::get_mesh(*csgparts.begin()))) + + ptr = redistance_grid(*ptr, 0.0f, 3.f, 3.f); return ptr ? generate_interior(*ptr, hc, ctl) : InteriorPtr{}; } diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 80857e34a..03c0df4ef 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -13,7 +13,7 @@ #include #include -// #define SLAPRINT_DO_BENCHMARK + #define SLAPRINT_DO_BENCHMARK #ifdef SLAPRINT_DO_BENCHMARK #include