[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