[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42501] branches/bmesh/blender/source/ blender/bmesh: split BM_Collapse_Vert into 2 functions

Campbell Barton ideasman42 at gmail.com
Wed Dec 7 22:54:15 CET 2011


Revision: 42501
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42501
Author:   campbellbarton
Date:     2011-12-07 21:54:14 +0000 (Wed, 07 Dec 2011)
Log Message:
-----------
split BM_Collapse_Vert into 2 functions
* BM_Collapse_Vert_Faces
* BM_Collapse_Vert_Edges

since these are both quite different operations and callers where checking for one case or another anyway.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
    branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h	2011-12-07 20:55:28 UTC (rev 42500)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h	2011-12-07 21:54:14 UTC (rev 42501)
@@ -207,10 +207,14 @@
                                            struct BMVert *v1, struct BMVert *v2,
                                            struct BMLoop **nl, struct BMEdge *example );
 
-/*dissolves a vert shared only by two edges*/
-BMEdge* BM_Collapse_Vert ( struct BMesh *bm, struct BMEdge *ke, struct BMVert *kv,
-                        float fac );
+/* these 2 functions are very similar */
+BMEdge* BM_Collapse_Vert_Faces(struct BMesh *bm,
+                         struct BMEdge *ke, struct BMVert *kv,
+                         float fac);
+BMEdge* BM_Collapse_Vert_Edges(struct BMesh *bm,
+                         struct BMEdge *ke, struct BMVert *kv);
 
+
 /*splits an edge.  ne is set to the new edge created.*/
 struct BMVert *BM_Split_Edge ( struct BMesh *bm, struct BMVert *v,
                                            struct BMEdge *e, struct BMEdge **ne,
@@ -369,12 +373,12 @@
 
 /*include the rest of the API*/
 #include "bmesh_filters.h"
-#include "bmesh_iterators.h"
 #include "bmesh_marking.h"
 #include "bmesh_operator_api.h"
 #include "bmesh_operators.h"
 #include "bmesh_error.h"
 #include "bmesh_queries.h"
+#include "bmesh_iterators.h"
 #include "bmesh_walkers.h"
 #include "intern/bmesh_inline.c"
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c	2011-12-07 20:55:28 UTC (rev 42500)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c	2011-12-07 21:54:14 UTC (rev 42501)
@@ -31,10 +31,6 @@
 
 #include "bmesh.h"
 
-#ifndef NULL
-#  define NULL (void *)0
-#endif
-
 /* inline here optimizes out the switch statement when called with
  * constant values (which is very common), nicer for loop-in-loop situations */
 
@@ -161,4 +157,4 @@
 }
 
 
-#endif
+#endif /* BM_ITERATORS_INLINE_C */

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c	2011-12-07 20:55:28 UTC (rev 42500)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c	2011-12-07 21:54:14 UTC (rev 42501)
@@ -138,7 +138,7 @@
 		return 1;
 	} else if (keepedge == NULL && len == 2) {
 		/*collapse the vertex*/
-		e = BM_Collapse_Vert(bm, v->e, v, 1.0);
+		e = BM_Collapse_Vert_Faces(bm, v->e, v, 1.0);
 
 		if (!e) {
 			return 0;
@@ -181,7 +181,7 @@
 		}
 
 		/*collapse the vertex*/
-		e = BM_Collapse_Vert(bm, baseedge, v, 1.0);
+		e = BM_Collapse_Vert_Faces(bm, baseedge, v, 1.0);
 
 		if (!e) {
 			return 0;
@@ -384,7 +384,7 @@
 }
 
 /**
- *			bmesh_collapse_vert
+ *			BM_Collapse_Vert_Faces
  *
  *  Collapses a vertex that has only two manifold edges
  *  onto a vertex it shares an edge with. Fac defines
@@ -392,21 +392,27 @@
  *
  *  Note that this is not a general edge collapse function.
  *
+ * Note this function is very close to 'BM_Collapse_Vert_Edges', both collapse
+ * a vertex and return a new edge. Except this takes a factor and merges
+ * custom data.
+ *
  *  BMESH_TODO:
  *    Insert error checking for KV valance.
  *
  *  Returns -
- *	Nothing
+ *	The New Edge
  */
- 
-BMEdge* BM_Collapse_Vert(BMesh *bm, BMEdge *ke, BMVert *kv, float fac)
+
+BMEdge* BM_Collapse_Vert_Faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac)
 {
+	BMEdge *ne = NULL;
+	BMVert *tv = bmesh_edge_getothervert(ke, kv);
+
+
+	BMIter iter;
+	BMLoop *l=NULL, *kvloop=NULL, *tvloop=NULL;
 	BMFace **faces = NULL, *f;
 	BLI_array_staticdeclare(faces, 8);
-	BMIter iter;
-	BMLoop *l=NULL, *kvloop=NULL, *tvloop=NULL;
-	BMEdge *ne = NULL;
-	BMVert *tv = bmesh_edge_getothervert(ke,kv);
 	void *src[2];
 	float w[2];
 
@@ -416,7 +422,7 @@
 	w[0] = 1.0f - fac;
 	w[1] = fac;
 
-	if(ke->l){
+	if (ke->l) {
 		l = ke->l;
 		do{
 			if(l->v == tv && l->next->v == kv) {
@@ -427,36 +433,23 @@
 				src[1] = tvloop->head.data;
 				CustomData_bmesh_interp(&bm->ldata, src,w, NULL, 2, kvloop->head.data);
 			}
-			l=l->radial_next;
-		}while(l!=ke->l);
+			l= l->radial_next;
+		} while (l != ke->l);
 	}
 
 	BM_ITER(f, &iter, bm, BM_FACES_OF_VERT, kv) {
 		BLI_array_append(faces, f);
 	}
-	
-	BM_Data_Interp_From_Verts(bm, kv, tv, kv, fac);
 
-	if (BM_Vert_EdgeCount(kv) == 2) {
-		/* in this case we want to keep all faces and not join them,
-		 * rather just get rid of the veretex - see bug [#28645] */
+	/* Collapse between 2+ faces */
+	if (faces && BLI_array_count(faces) > 1) {
+		BMFace *f2;
 		BMEdge *e2;
 		BMVert *tv2;
 
-		/* no need to check for null, we know the vert has 2 edes */
-		e2 = bmesh_disk_nextedge(ke, kv);
-		tv2 = BM_OtherEdgeVert(e2, kv);
+		/* only call when making real changes */
+		BM_Data_Interp_From_Verts(bm, kv, tv, kv, fac);
 
-		/* only action, other calls here only get the edge to return */
-		bmesh_jekv(bm, ke, kv);
-
-		ne= BM_Edge_Exist(tv, tv2);
-	}
-	else if (faces && BLI_array_count(faces) > 1) {
-		BMFace *f2;
-		BMEdge *e2;
-		BMVert *tv2;
-
 		e2 = bmesh_disk_nextedge(ke, kv);
 		tv2 = BM_OtherEdgeVert(e2, kv);
 
@@ -468,12 +461,57 @@
 			}
 		}
 	}
+	/* else we cant do anything! */
 
 	BLI_array_free(faces);
+
 	return ne;
 }
 
+
 /**
+ *			BM_Collapse_Vert_Edges
+ *
+ * Collapses a vertex onto another vertex it shares an edge with. Fac defines
+ * the amount of interpolation for Custom Data.
+ *
+ * Note that this is not a general edge collapse function.
+ *
+ * Note this function is very close to 'BM_Collapse_Vert_Faces', both collapse
+ * a vertex and return a new edge. Except this doesn't merge customdata.
+ *
+ * Returns -
+ * The New Edge
+ */
+
+BMEdge* BM_Collapse_Vert_Edges(BMesh *bm, BMEdge *ke, BMVert *kv)
+{
+	BMEdge *ne = NULL;
+
+	/* Collapse between 2 edges */
+
+	/* in this case we want to keep all faces and not join them,
+	 * rather just get rid of the veretex - see bug [#28645] */
+	BMVert *tv  = bmesh_edge_getothervert(ke, kv);
+	if (tv) {
+		BMEdge *e2 = bmesh_disk_nextedge(ke, kv);
+		if (e2) {
+			BMVert *tv2 = BM_OtherEdgeVert(e2, kv);
+			if (tv2) {
+				/* only action, other calls here only get the edge to return */
+				bmesh_jekv(bm, ke, kv);
+
+				ne= BM_Edge_Exist(tv, tv2);
+			}
+		}
+	}
+
+	return ne;
+}
+
+#undef DO_V_INTERP
+
+/**
  *			BM_split_edge
  *	
  *	Splits an edge. v should be one of the vertices in e and

Modified: branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c	2011-12-07 20:55:28 UTC (rev 42500)
+++ branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c	2011-12-07 21:54:14 UTC (rev 42501)
@@ -169,7 +169,7 @@
 	/*clean up extreneous 2-valence vertices*/
 	for (i=0; i<BLI_array_count(verts); i++) {
 		if (verts[i]->e)
-			BM_Collapse_Vert(bm, verts[i]->e, verts[i], 1.0);
+			BM_Collapse_Vert_Faces(bm, verts[i]->e, verts[i], 1.0);
 	}
 	
 	BLI_array_free(verts);
@@ -224,8 +224,8 @@
 			BMVert *v1= e->v1, *v2= e->v2;
 
 			/*collapse the vert*/
-			if (BM_Vert_EdgeCount(v1) == 2) BM_Collapse_Vert(bm, v1->e, v1, 0.5f);
-			if (BM_Vert_EdgeCount(v2) == 2) BM_Collapse_Vert(bm, v2->e, v2, 0.5f);
+			if (BM_Vert_EdgeCount(v1) == 2) BM_Collapse_Vert_Edges(bm, v1->e, v1);
+			if (BM_Vert_EdgeCount(v2) == 2) BM_Collapse_Vert_Edges(bm, v2->e, v2);
 
 		}
 	}
@@ -298,7 +298,7 @@
 			if (BM_Vert_EdgeCount(v) == 2) {
 
 				/*collapse the vert*/
-				BM_Collapse_Vert(bm, v->e, v, 0.5f);
+				BM_Collapse_Vert_Edges(bm, v->e, v);
 				continue;
 			}
 




More information about the Bf-blender-cvs mailing list