[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45058] trunk/blender/source/blender/bmesh /operators/bmo_inset.c: fix [#30613] B-mesh - inset created invalid mesh

Campbell Barton ideasman42 at gmail.com
Wed Mar 21 12:31:45 CET 2012


Revision: 45058
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45058
Author:   campbellbarton
Date:     2012-03-21 11:31:40 +0000 (Wed, 21 Mar 2012)
Log Message:
-----------
fix [#30613] B-mesh - inset created invalid mesh

inset could make a quad that used the same vertex multiple times.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_inset.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_inset.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_inset.c	2012-03-21 09:39:45 UTC (rev 45057)
+++ trunk/blender/source/blender/bmesh/operators/bmo_inset.c	2012-03-21 11:31:40 UTC (rev 45058)
@@ -35,6 +35,7 @@
 	float   length;
 	BMEdge *e_old;
 	BMEdge *e_new;
+	BMLoop *l;
 } SplitEdgeInfo;
 
 static void edge_loop_tangent(BMEdge *e, BMLoop *e_loop, float r_no[3])
@@ -170,24 +171,21 @@
 	}
 
 	for (i = 0, es = edge_info; i < edge_info_len; i++, es++) {
-		BMLoop *l;
-
-		if ((l = bm_edge_is_mixed_face_tag(es->e_old->l))) {
+		if ((es->l = bm_edge_is_mixed_face_tag(es->e_old->l))) {
 			/* do nothing */
 		}
 		else {
-			l = es->e_old->l; /* must be a boundary */
+			es->l = es->e_old->l; /* must be a boundary */
 		}
 
 
 		/* run the separate arg */
-		bmesh_edge_separate(bm, es->e_old, l);
+		bmesh_edge_separate(bm, es->e_old, es->l);
 
 		/* calc edge-split info */
-		es->e_new = l->e;
-		edge_loop_tangent(es->e_new, l, es->no);
+		es->e_new = es->l->e;
+		edge_loop_tangent(es->e_new, es->l, es->no);
 
-
 		if (es->e_new == es->e_old) { /* happens on boundary edges */
 			es->e_old = BM_edge_create(bm, es->e_new->v1, es->e_new->v2, es->e_new, FALSE);
 		}
@@ -223,9 +221,9 @@
 	for (i = 0, es = edge_info; i < edge_info_len; i++, es++) {
 		for (j = 0; j < 2; j++) {
 			v = (j == 0) ? es->e_new->v1 : es->e_new->v2;
+
 			/* end confusing part - just pretend this is a typical loop on verts */
 
-
 			/* only split of tagged verts - used by separated edges */
 
 			/* comment the first part because we know this verts in a tagged face */
@@ -240,6 +238,12 @@
 				bmesh_vert_separate(bm, v, &vout, &r_vout_len);
 				v = NULL; /* don't use again */
 
+				/* in some cases the edge doesnt split off */
+				if (r_vout_len == 1) {
+					MEM_freeN(vout);
+					continue;
+				}
+
 				for (k = 0; k < r_vout_len; k++) {
 					BMVert *v_split = vout[k]; /* only to avoid vout[k] all over */
 
@@ -249,8 +253,7 @@
 
 					/* find adjacent */
 					BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v_split) {
-						if (BM_edge_is_boundary(e) && /* this will be true because bmesh_edge_separate() has run */
-						    BM_elem_flag_test(e, BM_ELEM_TAG) &&
+						if (BM_elem_flag_test(e, BM_ELEM_TAG) &&
 						    BM_elem_flag_test(e->l->f, BM_ELEM_TAG))
 						{
 							if (vert_edge_tag_tot < 2) {
@@ -398,22 +401,39 @@
 
 	/* create faces */
 	for (i = 0, es = edge_info; i < edge_info_len; i++, es++) {
-		BMVert *v1, *v2, *v3, *v4;
-
+		BMVert *varr[4] = {NULL};
 		/* get the verts in the correct order */
-		BM_edge_ordered_verts(es->e_new, &v1, &v2);
-		if (v1 == es->e_new->v1) {
-			v3 = es->e_old->v2;
-			v4 = es->e_old->v1;
+		BM_edge_ordered_verts_ex(es->e_new, &varr[1], &varr[0], es->l);
+#if 0
+		if (varr[0] == es->e_new->v1) {
+			varr[2] = es->e_old->v2;
+			varr[3] = es->e_old->v1;
 		}
 		else {
-			v3 = es->e_old->v1;
-			v4 = es->e_old->v2;
+			varr[2] = es->e_old->v1;
+			varr[3] = es->e_old->v2;
 		}
+		j = 4;
+#else
+		/* slightly trickier check - since we can't assume the verts are split */
+		j = 2; /* 2 edges are set */
+		if (varr[0] == es->e_new->v1) {
+			if (es->e_old->v2 != es->e_new->v2) { varr[j++] = es->e_old->v2; }
+			if (es->e_old->v1 != es->e_new->v1) { varr[j++] = es->e_old->v1; }
+		}
+		else {
+			if (es->e_old->v1 != es->e_new->v1) { varr[j++] = es->e_old->v1; }
+			if (es->e_old->v2 != es->e_new->v2) { varr[j++] = es->e_old->v2; }
+		}
 
+		if (j == 2) {
+			/* can't make face! */
+			continue;
+		}
+#endif
 		/* no need to check doubles, we KNOW there won't be any */
 		/* yes - reverse face is correct in this case */
-		f = BM_face_create_quad_tri(bm, v4, v3, v2, v1, es->e_new->l->f, FALSE);
+		f = BM_face_create_quad_tri_v(bm, varr, j, es->l->f, FALSE);
 		BMO_elem_flag_enable(bm, f, ELE_NEW);
 	}
 




More information about the Bf-blender-cvs mailing list