diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-03-06 01:17:24 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-03-06 01:17:24 +0400 |
commit | bd83487dab6e4be5facf9fefb476a4273c64e1df (patch) | |
tree | d9830dc6cb286f6e31c63258736428d45377657a /source | |
parent | 1ae27144f665efeed0b9cd0f07fbe50a25b494d4 (diff) |
fix [#30459] BMesh Edge Split Hangs.
edge split result is still not correct in this case but at least avoid eternal loop.
also - dont tag sharp edges with <2 faces for splitting.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/bmesh/operators/bmo_edgesplit.c | 12 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_edgesplit.c | 9 |
2 files changed, 14 insertions, 7 deletions
diff --git a/source/blender/bmesh/operators/bmo_edgesplit.c b/source/blender/bmesh/operators/bmo_edgesplit.c index 05a48f64e3b..e00f8cf4ca9 100644 --- a/source/blender/bmesh/operators/bmo_edgesplit.c +++ b/source/blender/bmesh/operators/bmo_edgesplit.c @@ -122,7 +122,7 @@ static void tag_out_edges(BMesh *bm, EdgeTag *etags, BMOperator *UNUSED(op)) { EdgeTag *et; BMIter iter; - BMLoop *l, *startl; + BMLoop *l, *l_start, *l_prev; BMEdge *e; BMVert *v; int i, ok; @@ -177,17 +177,19 @@ static void tag_out_edges(BMesh *bm, EdgeTag *etags, BMOperator *UNUSED(op)) * possible l->e is not et->newe1 or et->newe2. So always clear * the flag on l->e as well, to prevent infinite looping. */ BMO_elem_flag_disable(bm, l->e, EDGE_SEAM); + l_start = l; - startl = l; do { + /* l_prev checks stops us from looping over the same edge forever [#30459] */ + l_prev = l; l = BM_face_other_edge_loop(l->f, l->e, v); - if (l == startl || BM_edge_face_count(l->e) != 2) { + if (l == l_start || BM_edge_face_count(l->e) != 2) { break; } l = l->radial_next; - } while (l != startl && !BMO_elem_flag_test(bm, l->e, EDGE_SEAM)); + } while (l != l_start && l != l_prev && !BMO_elem_flag_test(bm, l->e, EDGE_SEAM)); - if (l == startl || !BMO_elem_flag_test(bm, l->e, EDGE_SEAM)) { + if (l == l_start || !BMO_elem_flag_test(bm, l->e, EDGE_SEAM)) { break; } diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c index 1e275862b5c..c9831959adb 100644 --- a/source/blender/modifiers/intern/MOD_edgesplit.c +++ b/source/blender/modifiers/intern/MOD_edgesplit.c @@ -88,8 +88,13 @@ static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Obj if (emd->flags & MOD_EDGESPLIT_FROMFLAG) { BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) { - if (!BM_elem_flag_test(e, BM_ELEM_SMOOTH)) { - BMO_elem_flag_enable(bm, e, EDGE_MARK); + /* check for 2 or more edge users */ + if ((e->l) && + (e->l->next != e->l)) + { + if (!BM_elem_flag_test(e, BM_ELEM_SMOOTH)) { + BMO_elem_flag_enable(bm, e, EDGE_MARK); + } } } } |