[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44656] trunk/blender/source/blender: fix [#30459] BMesh Edge Split Hangs.

Campbell Barton ideasman42 at gmail.com
Mon Mar 5 22:17:35 CET 2012


Revision: 44656
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44656
Author:   campbellbarton
Date:     2012-03-05 21:17:24 +0000 (Mon, 05 Mar 2012)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_edgesplit.c
    trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_edgesplit.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_edgesplit.c	2012-03-05 19:01:12 UTC (rev 44655)
+++ trunk/blender/source/blender/bmesh/operators/bmo_edgesplit.c	2012-03-05 21:17:24 UTC (rev 44656)
@@ -122,7 +122,7 @@
 {
 	EdgeTag *et;
 	BMIter iter;
-	BMLoop *l, *startl;
+	BMLoop *l, *l_start, *l_prev;
 	BMEdge *e;
 	BMVert *v;
 	int i, ok;
@@ -177,17 +177,19 @@
 				 * 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;
 				}
 

Modified: trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2012-03-05 19:01:12 UTC (rev 44655)
+++ trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2012-03-05 21:17:24 UTC (rev 44656)
@@ -88,8 +88,13 @@
 	
 	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);
+				}
 			}
 		}
 	}




More information about the Bf-blender-cvs mailing list