[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