Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortamasmeszaros <meszaros.q@gmail.com>2019-11-08 18:51:43 +0300
committertamasmeszaros <meszaros.q@gmail.com>2019-11-08 18:51:43 +0300
commitac8eab5fa8e6c38faf788349bcb4f0f707d6bbbe (patch)
treeb48d694703a8ef594ed1a0c24078006986376665 /src/libslic3r/SLA
parent4b088658096ad38937795a9153ffd8406ce827a3 (diff)
Enhanced hollowing scheme, closing distance working as expected.
Diffstat (limited to 'src/libslic3r/SLA')
-rw-r--r--src/libslic3r/SLA/Hollowing.cpp127
1 files changed, 97 insertions, 30 deletions
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 <openvdb/tools/Filter.h>
-#include <openvdb/tools/LevelSetRebuild.h>
-#include <openvdb/tools/LevelSetFilter.h>
#include <functional>
+//#include <openvdb/tools/Filter.h>
+#include <boost/log/trivial.hpp>
+
+#include "Hollowing.hpp"
+#include <libslic3r/MTUtils.hpp>
+
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<openvdb::FloatGrid>{*grid}.gaussian(width, count);
+// }
+//}
+
+//}
+
+template<class S, class = FloatingOnly<S>>
+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<class S, class = FloatingOnly<S>>
+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<openvdb::FloatGrid>{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<class Mesh>
+remove_cvref_t<Mesh> _grid_to_mesh(const openvdb::FloatGrid &grid,
+ double isosurf,
+ double adapt);
+
+template<>
+TriangleMesh _grid_to_mesh<TriangleMesh>(const openvdb::FloatGrid &grid,
+ double isosurf,
+ double adapt)
+{
+ return grid_to_mesh(grid, isosurf, adapt);
+}
+template<>
+sla::Contour3D _grid_to_mesh<sla::Contour3D>(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<class Mesh>
+remove_cvref_t<Mesh> _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<Mesh>;
+ MMesh imesh{std::forward<Mesh>(mesh)};
+ _scale(voxel_scale, imesh);
- openvdb::tools::LevelSetFilter<openvdb::FloatGrid> 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<openvdb::FloatGrid> filt{*gridptr};
+// filt.offset(float(offset + D));
+
+ double iso_surface = D;
+ double adaptivity = 0.;
+ auto omesh = _grid_to_mesh<MMesh>(*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