From ac8eab5fa8e6c38faf788349bcb4f0f707d6bbbe Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 8 Nov 2019 16:51:43 +0100 Subject: Enhanced hollowing scheme, closing distance working as expected. --- src/libslic3r/SLA/Hollowing.cpp | 127 ++++++++++++++++++++++++++++++---------- 1 file changed, 97 insertions(+), 30 deletions(-) (limited to 'src/libslic3r/SLA') diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 430900313..c3993f2c8 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -1,55 +1,122 @@ -#include "Hollowing.hpp" -#include -#include -#include #include +//#include +#include + +#include "Hollowing.hpp" +#include + namespace Slic3r { namespace sla { -namespace { +//namespace { + +//void filter_grid_sla(openvdb::FloatGrid::Ptr &grid, double scale, double /*thickness*/, double flatness, double closing_dist) +//{ +// static const double ROUNDNESS_COEFF = 1.; + +// // Filtering: +// if (flatness > 0.) { +// double rounding = ROUNDNESS_COEFF * flatness; +// int width = int(rounding * scale); +// int count = 1; +// openvdb::tools::Filter{*grid}.gaussian(width, count); +// } +//} + +//} + +template> +inline void _scale(S s, TriangleMesh &m) { m.scale(float(s)); } -void filter_grid_sla(openvdb::FloatGrid &grid, double scale, double /*thickness*/, double flatness) +template> +inline void _scale(S s, sla::Contour3D &m) { - static const double ROUNDNESS_COEFF = 1.; - - // Filtering: - if (flatness > 0.) { - double rounding = ROUNDNESS_COEFF * flatness; - int width = int(rounding * scale); - int count = 1; - openvdb::tools::Filter{grid}.gaussian(width, count); - } + for (auto &p : m.points) p *= s; } -// openvdb::tools::levelSetRebuild(grid, -float(thickness * 2)); -// filter_grid_sla(grid, scale, thickness, flatness); -// openvdb::tools::levelSetRebuild(grid, float(thickness)); +template +remove_cvref_t _grid_to_mesh(const openvdb::FloatGrid &grid, + double isosurf, + double adapt); + +template<> +TriangleMesh _grid_to_mesh(const openvdb::FloatGrid &grid, + double isosurf, + double adapt) +{ + return grid_to_mesh(grid, isosurf, adapt); +} +template<> +sla::Contour3D _grid_to_mesh(const openvdb::FloatGrid &grid, + double isosurf, + double adapt) +{ + return grid_to_contour3d(grid, isosurf, adapt); +} -void redist_grid_sla(openvdb::FloatGrid &grid, double scale, double thickness, double flatness) +template +remove_cvref_t _generate_interior(Mesh &&mesh, + double min_thickness, + double voxel_scale, + double closing_dist) { -// openvdb::tools::levelSetRebuild(grid, -float(scale * thickness)); +// namespace plc = std::placeholders; +// auto filt = std::bind(redist_grid_sla, plc::_1, plc::_2, plc::_3, flatness, closing_dist); +// return hollowed_interior(mesh, min_thickness, quality, filt); + + using MMesh = remove_cvref_t; + MMesh imesh{std::forward(mesh)}; + _scale(voxel_scale, imesh); - openvdb::tools::LevelSetFilter filt{grid}; + double offset = voxel_scale * min_thickness; + double D = voxel_scale * closing_dist; + float out_range = 0.1f * float(offset); + float in_range = 1.1f * float(offset + D); + auto gridptr = mesh_to_grid(imesh, {}, out_range, in_range); -// filt.gaussian(int(flatness * scale)); + assert(gridptr); -// openvdb::tools::levelSetRebuild(grid, float(scale * thickness)); - //grid = openvdb::tools::topologyToLevelSet(grid); -} - + if (!gridptr) { + BOOST_LOG_TRIVIAL(error) << "Returned OpenVDB grid is NULL"; + return MMesh{}; + } + + if (closing_dist > .0) { + gridptr = redistance_grid(*gridptr, -(offset + D), double(in_range)); + } else { + D = -offset; + } + +// openvdb::tools::Filter filt{*gridptr}; +// filt.offset(float(offset + D)); + + double iso_surface = D; + double adaptivity = 0.; + auto omesh = _grid_to_mesh(*gridptr, iso_surface, adaptivity); + + _scale(1. / voxel_scale, omesh); + + return omesh; } TriangleMesh generate_interior(const TriangleMesh &mesh, double min_thickness, double quality, - double flatness) + double closing_dist) { - namespace plc = std::placeholders; - auto filt = std::bind(filter_grid_sla, plc::_1, plc::_2, plc::_3, flatness); - return hollowed_interior(mesh, min_thickness, quality, filt); + static const double MAX_OVERSAMPL = 7.; + + // I can't figure out how to increase the grid resolution through openvdb API + // so the model will be scaled up before conversion and the result scaled + // down. Voxels have a unit size. If I set voxelSize smaller, it scales + // the whole geometry down, and doesn't increase the number of voxels. + // + // max 8x upscale, min is native voxel size + auto voxel_scale = (1.0 + MAX_OVERSAMPL * quality); + return _generate_interior(mesh, min_thickness, voxel_scale, closing_dist); } }} // namespace Slic3r::sla -- cgit v1.2.3