[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18976] branches/bmesh/blender/source/ blender/bmesh: Dissolve verts better cleans up two-edged faces, as much

Joseph Eagar joeedh at gmail.com
Sun Feb 15 03:14:47 CET 2009


Revision: 18976
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18976
Author:   joeedh
Date:     2009-02-15 03:14:40 +0100 (Sun, 15 Feb 2009)

Log Message:
-----------
Dissolve verts better cleans up two-edged faces, as much
as it can.

Some design notes:

* BM_Dissolve_Disk is now more like a
  BM_Dissolve_Vert function (e.g. there's logic
  to remove verts if there's not surrounding faces).
  I kindof like this idea better (if we decide to
  go this way we should call it BM_Dissolve_Vert)
  but will have to discuss it further with Briggs.
  It seems more intuitive to have a "destroy this
  vert" function then a "just destroy it in this
  specific situation" function.

* Joining two two-edged faces does not work, so
  dissolve vert cannot clean all of them up.  Until
  this is fixed, I've added checks in the conversion
  code so at least things don't crash.
 

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

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c	2009-02-15 01:02:51 UTC (rev 18975)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c	2009-02-15 02:14:40 UTC (rev 18976)
@@ -36,8 +36,6 @@
  *          |=========|             |=========|
  * 
  * 
- *  Returns -
- *	1 for success, 0 for failure.
  */
 #if 1
 void BM_Dissolve_Disk(BMesh *bm, BMVert *v) {
@@ -46,7 +44,14 @@
 	BMLoop *loop;
 	int done, len;
 
-	if(BM_Nonmanifold_Vert(bm, v)) return;
+	if(BM_Nonmanifold_Vert(bm, v)) {
+		if (!v->edge) bmesh_kv(bm, v);
+		else if (!v->edge->loop) {
+			bmesh_ke(bm, v->edge);
+			bmesh_kv(bm, v);
+		}
+		return;
+	}
 	
 	if(v->edge){
 		/*v->edge we keep, what else?*/
@@ -81,6 +86,9 @@
 		/*collapse the vertex*/
 		BM_Collapse_Vert(bm, v->edge, v, 1.0, 0);
 		BM_Join_Faces(bm, f, f2, NULL, 0, 0);
+	} else if (len == 1) {
+		bmesh_ke(bm, v->edge);
+		bmesh_kv(bm, v);
 	}
 
 	if(keepedge){

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c	2009-02-15 01:02:51 UTC (rev 18975)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c	2009-02-15 02:14:40 UTC (rev 18976)
@@ -154,6 +154,7 @@
 	}
 
 	efa = addfacelist(em, eve1, eve2, eve3, eve4, NULL, NULL);
+	if (!efa) return NULL;
 
 	bmeshedge_to_editedge_internal(bm, em, f->loopbase->e, efa->e1);
 	bmeshedge_to_editedge_internal(bm, em, ((BMLoop*)(f->loopbase->head.next))->e, efa->e2);

Modified: branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c	2009-02-15 01:02:51 UTC (rev 18975)
+++ branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c	2009-02-15 02:14:40 UTC (rev 18976)
@@ -28,38 +28,83 @@
 	BMIter iter, liter, fiter;
 	BMVert *v;
 	BMFace *f, *f2;
-	BMEdge *e;
+	BMEdge *fe;
 	BMLoop *l;
-	int i, found;
+	int found, found2, found3, len, oldlen=0;
 	
 	vinput = BMO_GetSlot(op, BMOP_DISVERTS_VERTIN);
 
 	BMO_Flag_Buffer(bm, op, BMOP_DISVERTS_VERTIN, VERT_MARK);
-
-	for (v=BMIter_New(&iter, bm, BM_VERTS, NULL); v; v=BMIter_Step(&iter)) {
-		if (BMO_TestFlag(bm, v, VERT_MARK)) {
-			BM_Dissolve_Disk(bm, v);
+	
+	found = 1;
+	while (found) {
+		found = 0;
+		len = 0;
+		for (v=BMIter_New(&iter, bm, BM_VERTS, NULL); v; v=BMIter_Step(&iter)) {
+			if (BMO_TestFlag(bm, v, VERT_MARK)) {
+				BM_Dissolve_Disk(bm, v);
+				found = 1;
+				len++;
+			}
 		}
-	}
 
-	/*clean up two-edged faces*/
-	for (f=BMIter_New(&iter, bm, BM_FACES, NULL); f; f=BMIter_Step(&iter)){
-		if (f->len == 2) {
-			found = 0;
-			l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f);
-			for (; l; l=BMIter_Step(&liter)) {
-				f2 = BMIter_New(&fiter, bm,
-					        BM_FACES_OF_EDGE, l->e);
-				for (; f2; f2=BMIter_Step(&fiter)) {
-					if (f2 != f) {
-						BM_Join_Faces(bm, f, f2, l->e, 
-							      1, 0);
-						found = 1;
-						break;
+
+		/*clean up two-edged faces*/
+		/*basic idea is to keep joining 2-edged faces until their
+		  gone.  this however relies on joining two 2-edged faces
+		  together to work, which doesn't.*/
+		found3 = 1;
+		while (found3) {
+			found3 = 0;
+			for (f=BMIter_New(&iter, bm, BM_FACES, NULL); f; f=BMIter_Step(&iter)){
+				if (f->len == 2) {
+					//this design relies on join faces working
+					//with two-edged faces properly.
+					//commenting this line disables the
+					//outermost loop.
+					//found3 = 1;
+					found2 = 0;
+					l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f);
+					fe = l->e;
+					for (; l; l=BMIter_Step(&liter)) {
+						f2 = BMIter_New(&fiter, bm,
+								BM_FACES_OF_EDGE, l->e);
+						for (; f2; f2=BMIter_Step(&fiter)) {
+							if (f2 != f) {
+								BM_Join_Faces(bm, f, f2, l->e, 
+									      1, 0);
+								found2 = 1;
+								break;
+							}
+						}
+						if (found2) break;
 					}
+
+					if (!found2) {
+						bmesh_kf(bm, f);
+						bmesh_ke(bm, fe);
+					}
+				} else if (f->len == 3) {
+					BMEdge *ed[3];
+					BMVert *vt[3];
+					BMLoop *lp[3];
+					int i=0;
+
+					/*check for duplicate edges*/
+					l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f);
+					for (; l; l=BMIter_Step(&liter)) {
+						ed[i++] = l->e;	
+						lp[i++] = l;
+						vt[i++] = l->v;
+					}
+					if (vt[0] == vt[1] || vt[0] == vt[2]) {
+						i += 1;
+					}
 				}
-				if (found) break;
 			}
 		}
+		if (oldlen == len) break;
+		oldlen = len;
 	}
+
 }
\ No newline at end of file





More information about the Bf-blender-cvs mailing list