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.
This commit is contained in:
Campbell Barton
2012-03-05 21:17:24 +00:00
parent 1ae27144f6
commit bd83487dab
2 changed files with 14 additions and 7 deletions

View File

@@ -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;
}

View File

@@ -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);
}
}
}
}