diff options
author | tamasmeszaros <meszaros.q@gmail.com> | 2020-09-10 15:02:21 +0300 |
---|---|---|
committer | tamasmeszaros <meszaros.q@gmail.com> | 2020-09-10 15:02:21 +0300 |
commit | 10f7d64880c1a97a5ae02541c415332b60ac39f0 (patch) | |
tree | 3069555ee745630d2af0bd3234f819ddc38f5bbc /src/libslic3r | |
parent | b93c95274f99abc23080aea0abc5e7007c6b2332 (diff) | |
parent | 7713a55d458a92468dac2d9c9e4802cf72644150 (diff) |
Merge branch 'tm_hollowing_split'
Diffstat (limited to 'src/libslic3r')
-rw-r--r-- | src/libslic3r/OpenVDBUtils.cpp | 34 |
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, |