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>2012-03-06 01:17:24 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-03-06 01:17:24 +0400
commitbd83487dab6e4be5facf9fefb476a4273c64e1df (patch)
treed9830dc6cb286f6e31c63258736428d45377657a /source/blender/bmesh
parent1ae27144f665efeed0b9cd0f07fbe50a25b494d4 (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/blender/bmesh')
-rw-r--r--source/blender/bmesh/operators/bmo_edgesplit.c12
1 files changed, 7 insertions, 5 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;
}