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>2020-09-10 15:02:21 +0300
committertamasmeszaros <meszaros.q@gmail.com>2020-09-10 15:02:21 +0300
commit10f7d64880c1a97a5ae02541c415332b60ac39f0 (patch)
tree3069555ee745630d2af0bd3234f819ddc38f5bbc /src/libslic3r
parentb93c95274f99abc23080aea0abc5e7007c6b2332 (diff)
parent7713a55d458a92468dac2d9c9e4802cf72644150 (diff)
Merge branch 'tm_hollowing_split'
Diffstat (limited to 'src/libslic3r')
-rw-r--r--src/libslic3r/OpenVDBUtils.cpp34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp
index c30052036..53a71f194 100644
--- a/src/libslic3r/OpenVDBUtils.cpp
+++ b/src/libslic3r/OpenVDBUtils.cpp
@@ -2,6 +2,7 @@
#include "OpenVDBUtils.hpp"
#include <openvdb/tools/MeshToVolume.h>
#include <openvdb/tools/VolumeToMesh.h>
+#include <openvdb/tools/Composite.h>
#include <openvdb/tools/LevelSetRebuild.h>
//#include "MTUtils.hpp"
@@ -57,17 +58,42 @@ void Contour3DDataAdapter::getIndexSpacePoint(size_t n,
// TODO: Do I need to call initialize? Seems to work without it as well but the
// docs say it should be called ones. It does a mutex lock-unlock sequence all
// even if was called previously.
-
openvdb::FloatGrid::Ptr mesh_to_grid(const TriangleMesh &mesh,
const openvdb::math::Transform &tr,
float exteriorBandWidth,
float interiorBandWidth,
int flags)
{
+// openvdb::initialize();
+// return openvdb::tools::meshToVolume<openvdb::FloatGrid>(
+// TriangleMeshDataAdapter{mesh}, tr, exteriorBandWidth,
+// interiorBandWidth, flags);
+
openvdb::initialize();
- return openvdb::tools::meshToVolume<openvdb::FloatGrid>(
- TriangleMeshDataAdapter{mesh}, tr, exteriorBandWidth,
- interiorBandWidth, flags);
+
+ TriangleMeshPtrs meshparts = mesh.split();
+
+ auto it = std::remove_if(meshparts.begin(), meshparts.end(),
+ [](TriangleMesh *m){
+ m->require_shared_vertices();
+ return !m->is_manifold() || m->volume() < EPSILON;
+ });
+
+ meshparts.erase(it, meshparts.end());
+
+ openvdb::FloatGrid::Ptr grid;
+ for (TriangleMesh *m : meshparts) {
+ auto gridptr = openvdb::tools::meshToVolume<openvdb::FloatGrid>(
+ TriangleMeshDataAdapter{*m}, tr, exteriorBandWidth,
+ interiorBandWidth, flags);
+
+ if (grid && gridptr) openvdb::tools::csgUnion(*grid, *gridptr);
+ else if (gridptr) grid = std::move(gridptr);
+ }
+
+ grid = openvdb::tools::levelSetRebuild(*grid, 0., exteriorBandWidth, interiorBandWidth);
+
+ return grid;
}
openvdb::FloatGrid::Ptr mesh_to_grid(const sla::Contour3D &mesh,