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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-06-27 14:26:35 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-06-27 14:28:36 +0400
commitd6ab81809e25eb827f450006efa1442a52bcec11 (patch)
tree15041849a5e5fe2e0c3685f8af2b49d3e6db7250 /source/blender/bmesh/operators/bmo_dissolve.c
parente947dd8cd765909ebadfc5e82d0d34116733b04e (diff)
BMesh: tweaks to dissolve, remove wire edges before other calculations
also avoid feedback loop when checking topology giving nondeterministic results.
Diffstat (limited to 'source/blender/bmesh/operators/bmo_dissolve.c')
-rw-r--r--source/blender/bmesh/operators/bmo_dissolve.c45
1 files changed, 30 insertions, 15 deletions
diff --git a/source/blender/bmesh/operators/bmo_dissolve.c b/source/blender/bmesh/operators/bmo_dissolve.c
index bebfeaa5b06..f7b8352ed78 100644
--- a/source/blender/bmesh/operators/bmo_dissolve.c
+++ b/source/blender/bmesh/operators/bmo_dissolve.c
@@ -48,6 +48,7 @@
#define EDGE_ISGC 8
#define VERT_MARK 1
+#define VERT_MARK_PAIR 4
#define VERT_TAG 2
#define VERT_ISGC 8
@@ -346,13 +347,7 @@ void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op)
const bool use_face_split = BMO_slot_bool_get(op->slots_in, "use_face_split");
BMO_ITER (v, &oiter, op->slots_in, "verts", BM_VERT) {
- BMIter itersub;
-
BMO_elem_flag_enable(bm, v, VERT_MARK | VERT_ISGC);
-
- BM_ITER_ELEM (e, &itersub, v, BM_EDGES_OF_VERT) {
- BMO_elem_flag_enable(bm, e, EDGE_ISGC);
- }
}
if (use_face_split) {
@@ -370,12 +365,32 @@ void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op)
BMO_elem_flag_enable(bm, l_iter->e, EDGE_ISGC);
} while ((l_iter = l_iter->next) != l_first);
}
+
+ /* clean wire edges and mark vert-edge-pairs (unrelated to checks above) */
+ if ((e = v->e)) {
+ int edge_count = 0;
+ do {
+ e_next = BM_DISK_EDGE_NEXT(e, v);
+ if (BM_edge_is_wire(e)) {
+ BM_edge_kill(bm, e);
+ }
+ else {
+ BMO_elem_flag_enable(bm, e, EDGE_ISGC);
+ edge_count += 1;
+ }
+ } while (v->e && (e = e_next) != v->e);
+
+ /* tag here so we avoid feedback loop (checking topology as we edit) */
+ if (edge_count == 2) {
+ BMO_elem_flag_enable(bm, v, VERT_MARK_PAIR);
+ }
+ }
}
BMO_ITER (v, &oiter, op->slots_in, "verts", BM_VERT) {
BMIter itersub;
- if (BM_vert_edge_count(v) != 2) {
+ if (!BMO_elem_flag_test(bm, v, VERT_MARK_PAIR)) {
BM_ITER_ELEM (e, &itersub, v, BM_EDGES_OF_VERT) {
BMFace *fa, *fb;
if (BM_edge_face_pair(e, &fa, &fb)) {
@@ -400,20 +415,20 @@ void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op)
BM_edge_kill(bm, e);
}
}
- BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) {
- if ((v->e == NULL) && BMO_elem_flag_test(bm, v, VERT_ISGC)) {
- BM_vert_kill(bm, v);
+
+ /* final cleanup */
+ BMO_ITER (v, &oiter, op->slots_in, "verts", BM_VERT) {
+ if (BM_vert_is_edge_pair(v)) {
+ BM_vert_collapse_edge(bm, v->e, v, false, true);
}
}
- /* done with cleanup */
BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) {
- if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
- if (BM_vert_edge_count(v) == 2) {
- BM_vert_collapse_edge(bm, v->e, v, true, true);
- }
+ if ((v->e == NULL) && BMO_elem_flag_test(bm, v, VERT_ISGC)) {
+ BM_vert_kill(bm, v);
}
}
+ /* done with cleanup */
}
/* Limited Dissolve */