[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44449] trunk/blender/source/blender: bmesh - remove faces with <3 sides after dissolve/collapse ( most tools already did this).

Campbell Barton ideasman42 at gmail.com
Sun Feb 26 06:48:24 CET 2012


Revision: 44449
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44449
Author:   campbellbarton
Date:     2012-02-26 05:48:12 +0000 (Sun, 26 Feb 2012)
Log Message:
-----------
bmesh - remove faces with <3 sides after dissolve/collapse (most tools already did this).

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/bmesh.h
    trunk/blender/source/blender/bmesh/bmesh_class.h
    trunk/blender/source/blender/bmesh/intern/bmesh_mods.c
    trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
    trunk/blender/source/blender/bmesh/tools/BME_bevel.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c

Modified: trunk/blender/source/blender/bmesh/bmesh.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh.h	2012-02-26 05:04:30 UTC (rev 44448)
+++ trunk/blender/source/blender/bmesh/bmesh.h	2012-02-26 05:48:12 UTC (rev 44449)
@@ -219,8 +219,10 @@
                       struct BMLoop **nl, BMEdge *example);
 
 /* these 2 functions are very similar */
-BMEdge* BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac, const int join_faces);
-BMEdge* BM_vert_collapse_edge(BMesh *bm, BMEdge *ke, BMVert *kv);
+BMEdge* BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac,
+                               const short join_faces, const short kill_degenerate_faces);
+BMEdge* BM_vert_collapse_edge(BMesh *bm, BMEdge *ke, BMVert *kv,
+                              const short kill_degenerate_faces);
 
 
 /* splits an edge.  ne is set to the new edge created. */

Modified: trunk/blender/source/blender/bmesh/bmesh_class.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh_class.h	2012-02-26 05:04:30 UTC (rev 44448)
+++ trunk/blender/source/blender/bmesh/bmesh_class.h	2012-02-26 05:48:12 UTC (rev 44449)
@@ -51,7 +51,7 @@
 typedef struct BMHeader {
 	void *data; /* customdata layers */
 	int index; /* notes:
-	            * - Use BM_elem_index_get/SetIndex macros for index
+	            * - Use BM_elem_index_get/set macros for index
 	            * - Unitialized to -1 so we can easily tell its not set.
 	            * - Used for edge/vert/face, check BMesh.elem_index_dirty for valid index values,
 	            *   this is abused by various tools which set it dirty.

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mods.c	2012-02-26 05:04:30 UTC (rev 44448)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mods.c	2012-02-26 05:48:12 UTC (rev 44449)
@@ -72,7 +72,7 @@
 		}
 		else if (!v->e->l) {
 			if (len == 2) {
-				return (BM_vert_collapse_edge(bm, v->e, v) != NULL);
+				return (BM_vert_collapse_edge(bm, v->e, v, TRUE) != NULL);
 			}
 			else {
 				/* used to kill the vertex here, but it may be connected to faces.
@@ -86,7 +86,7 @@
 	}
 	else if (len == 2 && BM_vert_face_count(v) == 1) {
 		/* boundry vertex on a face */
-		return (BM_vert_collapse_edge(bm, v->e, v) != NULL);
+		return (BM_vert_collapse_edge(bm, v->e, v, TRUE) != NULL);
 	}
 	else {
 		return BM_disk_dissolve(bm, v);
@@ -134,7 +134,7 @@
 	}
 	else if (keepedge == NULL && len == 2) {
 		/* collapse the verte */
-		e = BM_vert_collapse_faces(bm, v->e, v, 1.0, TRUE);
+		e = BM_vert_collapse_faces(bm, v->e, v, 1.0, TRUE, TRUE);
 
 		if (!e) {
 			return FALSE;
@@ -179,7 +179,7 @@
 		}
 
 		/* collapse the verte */
-		e = BM_vert_collapse_faces(bm, baseedge, v, 1.0, TRUE);
+		e = BM_vert_collapse_faces(bm, baseedge, v, 1.0, TRUE, TRUE);
 
 		if (!e) {
 			return FALSE;
@@ -410,7 +410,8 @@
  *  @returns The New Edge
  */
 
-BMEdge *BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac, const int join_faces)
+BMEdge *BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac,
+                               const short join_faces, const short kill_degenerate_faces)
 {
 	BMEdge *ne = NULL;
 	BMVert *tv = bmesh_edge_getothervert(ke, kv);
@@ -471,16 +472,29 @@
 		}
 
 		BLI_array_free(faces);
+	}
+	else {
+		/* single face or no faces */
+		/* same as BM_vert_collapse_edge() however we already
+		 * have vars to perform this operation so dont call. */
+		ne = bmesh_jekv(bm, ke, kv, TRUE);
+		/* ne = BM_edge_exists(tv, tv2); */ /* same as return above */
 
-		return ne;
+		if (kill_degenerate_faces) {
+			BMIter fiter;
+			BMFace *f;
+			BMVert *verts[2] = {ne->v1, ne->v2};
+			int i;
+			for (i = 0; i < 2; i++) {
+				BM_ITER(f, &fiter, bm, BM_FACES_OF_VERT, verts[i]) {
+					if (f->len < 3) {
+						BM_face_kill(bm, f);
+					}
+				}
+			}
+		}
 	}
 
-	/* single face or no faces */
-	/* same as BM_vert_collapse_edge() however we already
-	 * have vars to perform this operation so dont call. */
-	ne = bmesh_jekv(bm, ke, kv, TRUE);
-	/* ne = BM_edge_exists(tv, tv2); */ /* same as return above */
-
 	return ne;
 }
 
@@ -494,7 +508,8 @@
  * The New Edge
  */
 
-BMEdge *BM_vert_collapse_edge(BMesh *bm, BMEdge *ke, BMVert *kv)
+BMEdge *BM_vert_collapse_edge(BMesh *bm, BMEdge *ke, BMVert *kv,
+                              const short kill_degenerate_faces)
 {
 	/* nice example implementation but we want loops to have their customdata
 	 * accounted for */
@@ -523,7 +538,7 @@
 #else
 	/* with these args faces are never joined, same as above
 	 * but account for loop customdata */
-	return BM_vert_collapse_faces(bm, ke, kv, 1.0f, FALSE);
+	return BM_vert_collapse_faces(bm, ke, kv, 1.0f, FALSE, kill_degenerate_faces);
 #endif
 }
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-02-26 05:04:30 UTC (rev 44448)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-02-26 05:48:12 UTC (rev 44449)
@@ -165,7 +165,7 @@
 		BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
 			if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
 				if (BM_vert_edge_count(v) == 2) {
-					BM_vert_collapse_edge(bm, v->e, v);
+					BM_vert_collapse_edge(bm, v->e, v, TRUE);
 				}
 			}
 		}
@@ -216,7 +216,7 @@
 	/* clean up extreneous 2-valence vertice */
 	for (i = 0; i < BLI_array_count(verts); i++) {
 		if (verts[i]->e) {
-			BM_vert_collapse_edge(bm, verts[i]->e, verts[i]);
+			BM_vert_collapse_edge(bm, verts[i]->e, verts[i], TRUE);
 		}
 	}
 	
@@ -265,7 +265,7 @@
 		BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
 			if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
 				if (BM_vert_edge_count(v) == 2) {
-					BM_vert_collapse_edge(bm, v->e, v);
+					BM_vert_collapse_edge(bm, v->e, v, TRUE);
 				}
 			}
 		}
@@ -334,7 +334,14 @@
 			if (BM_vert_edge_count(v) == 2) {
 
 				/* collapse the ver */
-				BM_vert_collapse_faces(bm, v->e, v, 1.0f, FALSE);
+				/* previously the faces were joined, but collapsing between 2 edges
+				 * gives some advantage/difference in using vertex-dissolve over edge-dissolve */
+#if 0
+				BM_vert_collapse_faces(bm, v->e, v, 1.0f, TRUE, TRUE);
+#else
+				BM_vert_collapse_edge(bm, v->e, v, TRUE);
+#endif
+
 				continue;
 			}
 
@@ -540,7 +547,7 @@
 			BMVert *v = (BMVert *)weight_elems[i].ele;
 			/* check twice because cumulative effect could disolve over angle limit */
 			if (BM_vert_edge_angle(bm, v) < angle_limit) {
-				BM_vert_collapse_edge(bm, v->e, v); /* join edges */
+				BM_vert_collapse_edge(bm, v->e, v, TRUE); /* join edges */
 			}
 		}
 	}

Modified: trunk/blender/source/blender/bmesh/tools/BME_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/BME_bevel.c	2012-02-26 05:04:30 UTC (rev 44448)
+++ trunk/blender/source/blender/bmesh/tools/BME_bevel.c	2012-02-26 05:48:12 UTC (rev 44449)
@@ -530,14 +530,14 @@
 			ke = kl->e;
 			/* BMESH-TODO: jfke doesn't handle customdata */
 			jf = bmesh_jfke(bm, kl->prev->radial_next->f, kl->f, kl->prev->e);
-			BM_vert_collapse_edge(bm, ke, kv);
+			BM_vert_collapse_edge(bm, ke, kv, FALSE);
 		}
 		else {
 			BM_face_split(bm, kl->f, kl->next->next->v, kl->v, &nl, kl->next->e);
 			ke = kl->e;
 			/* BMESH-TODO: jfke doesn't handle customdata */
 			jf = bmesh_jfke(bm, kl->next->radial_next->f, kl->f, kl->next->e);
-			BM_vert_collapse_edge(bm, ke, kv);
+			BM_vert_collapse_edge(bm, ke, kv, FALSE);
 		}
 		/* find saved loop pointer */
 		l = se->l;
@@ -576,14 +576,14 @@
 			ke = kl->e;
 			/* BMESH-TODO: jfke doesn't handle customdata */
 			jf = bmesh_jfke(bm, kl->prev->radial_next->f, kl->f, kl->prev->e);
-			BM_vert_collapse_edge(bm, ke, kv);
+			BM_vert_collapse_edge(bm, ke, kv, FALSE);
 		}
 		else {
 			BM_face_split(bm, kl->f, kl->next->next->v, kl->v, &nl, kl->next->e);
 			ke = kl->e;
 			/* BMESH-TODO: jfke doesn't handle customdata */
 			jf = bmesh_jfke(bm, kl->next->radial_next->f, kl->f, kl->next->e);
-			BM_vert_collapse_edge(bm, ke, kv);
+			BM_vert_collapse_edge(bm, ke, kv, FALSE);
 		}
 		/* find saved loop pointer */
 		l = se->l;

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c	2012-02-26 05:04:30 UTC (rev 44448)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c	2012-02-26 05:48:12 UTC (rev 44449)
@@ -88,7 +88,7 @@
 
 	bm = py_edge->bm;
 
-	e_new = BM_vert_collapse_edge(bm, py_edge->e, py_vert->v);
+	e_new = BM_vert_collapse_edge(bm, py_edge->e, py_vert->v, TRUE);
 
 	if (e_new) {
 		return BPy_BMEdge_CreatePyObject(bm, e_new);
@@ -154,7 +154,7 @@
 
 	bm = py_edge->bm;
 
-	e_new = BM_vert_collapse_faces(bm, py_edge->e, py_vert->v, CLAMPIS(fac, 0.0f, 1.0f), do_join_faces);
+	e_new = BM_vert_collapse_faces(bm, py_edge->e, py_vert->v, CLAMPIS(fac, 0.0f, 1.0f), do_join_faces, TRUE);
 
 	if (e_new) {
 		return BPy_BMEdge_CreatePyObject(bm, e_new);




More information about the Bf-blender-cvs mailing list