diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-02-24 15:58:56 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-02-24 16:10:33 +0400 |
commit | 9643b2e5b50399c8224d6de8d150d88c0d3e2848 (patch) | |
tree | 85f0e9e3c26294b66777ab4833b381513b56318a /extern/carve/patches | |
parent | 59472df8d695eaa8c7062d3006078c08fab8f3cc (diff) |
Preserve non-flat faces in boolean modifier
This commit implements dissolving of edges which were used
to triangulate non-flat faces. This slows things down a bit
(around 5% on heave mesh with all faces triangulated).
We could improve speed of dissolve a bit here (so not a bell
to add an option for triangulation yet).
Also fixed wrong edge origindex mapping.
Diffstat (limited to 'extern/carve/patches')
-rw-r--r-- | extern/carve/patches/mesh_simplify_dissolve_edges.patch | 46 | ||||
-rw-r--r-- | extern/carve/patches/series | 1 |
2 files changed, 47 insertions, 0 deletions
diff --git a/extern/carve/patches/mesh_simplify_dissolve_edges.patch b/extern/carve/patches/mesh_simplify_dissolve_edges.patch new file mode 100644 index 00000000000..bd671bfcbcf --- /dev/null +++ b/extern/carve/patches/mesh_simplify_dissolve_edges.patch @@ -0,0 +1,46 @@ +diff -r e82d852e4fb0 include/carve/mesh_simplify.hpp +--- a/include/carve/mesh_simplify.hpp Wed Jan 15 13:16:14 2014 +1100 ++++ b/include/carve/mesh_simplify.hpp Mon Feb 24 18:02:07 2014 +0600 +@@ -32,8 +32,6 @@ + #include <algorithm> + #include <vector> + +-#include "write_ply.hpp" +- + + namespace carve { + namespace mesh { +@@ -1184,6 +1182,33 @@ + return modifications; + } + ++ void dissolveMeshEdges(mesh_t *mesh, std::unordered_set<edge_t *> dissolve_edges) { ++ while (dissolve_edges.size()) { ++ MeshSet<3>::edge_t *edge = *dissolve_edges.begin(); ++ if (edge->face == edge->rev->face) { ++ dissolve_edges.erase(edge); ++ continue; ++ } ++ ++ MeshSet<3>::edge_t *removed = edge->mergeFaces(); ++ if (removed == NULL) { ++ dissolve_edges.erase(edge); ++ } else { ++ MeshSet<3>::edge_t *e = removed; ++ do { ++ MeshSet<3>::edge_t *n = e->next; ++ dissolve_edges.erase(std::min(e, e->rev)); ++ delete e->rev; ++ delete e; ++ e = n; ++ } while (e != removed); ++ } ++ } ++ ++ removeRemnantFaces(mesh); ++ cleanFaceEdges(mesh); ++ mesh->cacheEdges(); ++ } + + + size_t improveMesh(meshset_t *meshset, diff --git a/extern/carve/patches/series b/extern/carve/patches/series index 30937b4b9cf..2c187af4808 100644 --- a/extern/carve/patches/series +++ b/extern/carve/patches/series @@ -6,3 +6,4 @@ gcc46.patch clang_is_heap_fix.patch strict_flags.patch interpolator_reorder.patch +mesh_simplify_dissolve_edges.patch |