[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20462] branches/bmesh/blender: Did some code cleanups.

Joseph Eagar joeedh at gmail.com
Thu May 28 06:41:07 CEST 2009


Revision: 20462
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20462
Author:   joeedh
Date:     2009-05-28 06:41:02 +0200 (Thu, 28 May 2009)

Log Message:
-----------
Did some code cleanups.  Added BM_ITER and
BMO_ITER macros to make defining iterator
loops easier.  Moved some files around.
And also made the editmesh conversion functions
tesselate ngons to triangle fans, since it's
more stable for conversion, and editmeshes are
never displayed to the user anyway.  And ported
akey to bmesh.

Next up I plan on adding face iterators to DerivedMesh,
since that's the last major chunk of major refactoring
left, I think, except perhaps the uv editor (at the
moment it's probably close to working, but it's still
converting to editmeshes for everything, which is very
bad).

Modified Paths:
--------------
    branches/bmesh/blender/projectfiles_vc9/blender/editors/ED_editors.vcproj
    branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
    branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_add.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h
    branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c

Added Paths:
-----------
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_selecthistory.c

Removed Paths:
-------------
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils_mods.c

Modified: branches/bmesh/blender/projectfiles_vc9/blender/editors/ED_editors.vcproj
===================================================================
--- branches/bmesh/blender/projectfiles_vc9/blender/editors/ED_editors.vcproj	2009-05-28 02:12:28 UTC (rev 20461)
+++ branches/bmesh/blender/projectfiles_vc9/blender/editors/ED_editors.vcproj	2009-05-28 04:41:02 UTC (rev 20462)
@@ -1059,18 +1059,22 @@
 			Name="mesh"
 			>
 			<File
-				RelativePath="..\..\..\source\blender\editors\mesh\bmesh_tools.c"
+				RelativePath="..\..\..\source\blender\editors\mesh\bmesh_select.c"
 				>
 			</File>
 			<File
-				RelativePath="..\..\..\source\blender\editors\mesh\bmeshutils.c"
+				RelativePath="..\..\..\source\blender\editors\mesh\bmesh_selecthistory.c"
 				>
 			</File>
 			<File
-				RelativePath="..\..\..\source\blender\editors\mesh\bmeshutils_mods.c"
+				RelativePath="..\..\..\source\blender\editors\mesh\bmesh_tools.c"
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\source\blender\editors\mesh\bmeshutils.c"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\source\blender\editors\mesh\editdeform.c"
 				>
 			</File>

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h	2009-05-28 02:12:28 UTC (rev 20461)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h	2009-05-28 04:41:02 UTC (rev 20462)
@@ -38,12 +38,11 @@
 #define BM_FACEVERTS_OF_FACE 			8
 #define BM_EDGES_OF_FACE 			9
 #define BM_LOOPS_OF_FACE 			10
-#define BM_LOOPS_OF_VERT			11
 
 /*iterate through loops around this loop, which are fetched
   from the other faces in the radial cycle surrounding the
   input loop's edge.*/
-#define BM_LOOPS_OF_LOOP		12
+#define BM_LOOPS_OF_LOOP		11
 
 
 /*Iterator Structure*/

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-05-28 02:12:28 UTC (rev 20461)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-05-28 04:41:02 UTC (rev 20462)
@@ -255,7 +255,7 @@
 	  BMOIter oiter;
 	  BMFace *f;
 
-	  f = BMO_IterNew(&oiter, bm, some_operator, SOME_SLOT_CODE);
+	  f = BMO_IterNew(&oiter, bm, some_operator, "slotname");
 	  for (; f; f=BMO_IterStep(&oiter)) {
 		/do something with the face
 	  }
@@ -265,7 +265,7 @@
 	  void *key;
 	  void *val;
 
-	  key = BMO_IterNew(&oiter, bm, some_operator, SOME_SLOT_CODE);
+	  key = BMO_IterNew(&oiter, bm, some_operator, "slotname");
 	  for (; key; key=BMO_IterStep(&oiter)) {
 		val = BMO_IterMapVal(&oiter);
 		//do something with the key/val pair
@@ -296,4 +296,8 @@
   remember for pointer maps this will be a pointer to a pointer.*/
 void *BMO_IterMapVal(BMOIter *iter);
 
+#define BMO_ITER(ele, iter, bm, op, slotname) \
+	ele = BMO_IterNew(iter, bm, op, slotname); \
+	for ( ; ele; ele=BMO_IterStep(iter))
+
 #endif /* _BMESH_OPERATOR_H */
\ No newline at end of file

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c	2009-05-28 02:12:28 UTC (rev 20461)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c	2009-05-28 04:41:02 UTC (rev 20462)
@@ -319,51 +319,6 @@
 }
 
 /*
- * LOOPS OF VERT CALLBACKS
- *
- */
-/*
-	BMEdge *current = iter->nextedge;
-
-	if(iter->nextedge)
-		iter->nextedge = bmesh_disk_nextedge(iter->nextedge, iter->vdata);
-	
-	if(iter->nextedge == iter->firstedge) iter->nextedge = NULL; 
-
-	return current;
-*/
-	
-
-static void loop_of_vert_begin(BMIter *iter)
-{
-	init_iterator(iter);
-	iter->firstedge = iter->vdata->edge;
-	if (!iter->vdata->edge) return NULL;
-
-	iter->firstloop = iter->nextloop = iter->vdata->edge->loop;
-	iter->l = iter->firstloop;
-}
-
-static void *loop_of_vert_step(BMIter *iter)
-{
-	BMLoop *current = iter->nextloop;
-
-	if(iter->nextloop) {
-		iter->nextloop = bmesh_radial_nextloop(iter->nextloop);
-		if (iter->nextloop == iter->l) {
-			iter->nextloop = bmesh_disk_nextedge(iter->nextloop->e, 
-			                                    iter->vdata)->loop;
-			iter->l = iter->nextloop;
-
-			if (iter->nextloop->e == iter->firstedge)
-				iter->nextloop = NULL;
-		}
-	}
-	
-	return current;
-}
-
-/*
  * BMESH ITERATOR INIT
  *
  * Takes a bmesh iterator structure and fills
@@ -424,11 +379,6 @@
 			iter->step = loop_of_face_step;
 			iter->pdata = data;
 			break;
-		case BM_LOOPS_OF_VERT:
-			iter->begin = loop_of_vert_begin;
-			iter->step = loop_of_vert_step;
-			iter->vdata = data;
-			break;
 		case BM_LOOPS_OF_LOOP:
 			iter->begin = loops_of_loop_begin;
 			iter->step = loops_of_loop_step;

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-05-28 02:12:28 UTC (rev 20461)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-05-28 04:41:02 UTC (rev 20462)
@@ -73,7 +73,9 @@
 
 BMOpDefine def_makefgonsop = {
 	"makefgon",
-	{{0} /*null-terminating sentinel*/},
+	{{BMOP_OPSLOT_INT, "trifan"}, /*use triangle fans instead of 
+				        real interpolation*/
+	 {0} /*null-terminating sentinel*/},
 	bmesh_make_fgons_exec,
 	0
 };

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c	2009-05-28 02:12:28 UTC (rev 20461)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c	2009-05-28 04:41:02 UTC (rev 20462)
@@ -247,34 +247,49 @@
 {
 	BMOperator triop;
 	BMFace *face;
-	BMIter iter;
+	BMIter iter, liter;
 	BMEdge *edge;
+	BMLoop *l, *nl;
 	BMOpSlot *eout;
-	int i;
+	int i, trifan = BMO_Get_Int(op, "trifan");
 
-	BMO_Init_Op(&triop, "triangulate");
+	if (!trifan) BMO_Init_Op(&triop, "triangulate");
 	
+	/*instead of properly tesselate, just make a triangle fan, this
+	  should make bmesh -> editmesh -> bmesh conversions always properly
+	  work.*/
 	for (face = BMIter_New(&iter, bmesh, BM_FACES_OF_MESH, NULL); face; face=BMIter_Step(&iter)) {
 		if (face->len > 4) {
 			BMO_SetFlag(bmesh, face, FACE_NGON);
+			if (trifan) {
+				while (face->len > 4) {
+					BM_Split_Face(bmesh, face, 
+						face->loopbase->v, 
+						((BMLoop*)face->loopbase->head.next->next)->v,
+						&nl, NULL);
+					BM_SetHFlag(nl->e, BM_FGON);
+				}
+			}
 		}
 	}
 
-	BMO_Flag_To_Slot(bmesh, &triop, "faces", FACE_NGON, BM_FACE);
-	BMO_Exec_Op(bmesh, &triop);
+	if (!trifan) {
+		BMO_Flag_To_Slot(bmesh, &triop, "faces", FACE_NGON, BM_FACE);
+		BMO_Exec_Op(bmesh, &triop);
 
-	eout = BMO_GetSlot(&triop, "edgeout");
-	for (i=0; i<eout->len; i++) {
-		edge = ((BMEdge**)eout->data.buf)[i];
-		edge->head.flag |= BM_FGON;
-		face = BMIter_New(&iter, bmesh, BM_FACES_OF_EDGE, edge);
-		
-		for (; face; face=BMIter_Step(&iter)) {
-			face->head.flag |= BM_NONORMCALC;
+		eout = BMO_GetSlot(&triop, "edgeout");
+		for (i=0; i<eout->len; i++) {
+			edge = ((BMEdge**)eout->data.buf)[i];
+			edge->head.flag |= BM_FGON;
+			face = BMIter_New(&iter, bmesh, BM_FACES_OF_EDGE, edge);
+			
+			for (; face; face=BMIter_Step(&iter)) {
+				face->head.flag |= BM_NONORMCALC;
+			}
 		}
+
+		BMO_Finish_Op(bmesh, &triop);
 	}
-
-	BMO_Finish_Op(bmesh, &triop);
 }
 
 EditMesh *bmesh_to_editmesh(BMesh *bmesh)
@@ -284,6 +299,7 @@
 	
 	/*first fgon-afy the mesh*/
 	BMO_Init_Op(&makefgon, "makefgon");
+	BMO_Set_Int(&makefgon, "trifan", 1);
 	BMO_Exec_Op(bmesh, &makefgon);
 	BMO_Finish_Op(bmesh, &makefgon);
 

Modified: branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c	2009-05-28 02:12:28 UTC (rev 20461)
+++ branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c	2009-05-28 04:41:02 UTC (rev 20462)
@@ -54,7 +54,7 @@
 	
 	/*if one flagged face is bordered by an unflagged face, then we delete
 	  original geometry.*/
-	for (e=BMIter_New(&iter, bm, BM_EDGES_OF_MESH, NULL);e;e=BMIter_Step(&iter)) {
+	BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
 		if (!BMO_TestFlag(bm, e, EXT_INPUT)) continue;
 
 		found = 0;
@@ -71,21 +71,21 @@
 	}
 
 	/*calculate verts to delete*/
-	for (v = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL); v; v=BMIter_Step(&iter)) {
+	BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
 		found = 0;
 
-		l = BMIter_New(&viter, bm, BM_LOOPS_OF_VERT, v);
-		for (; l; l=BMIter_Step(&viter)) {
-			if (!BMO_TestFlag(bm, l->e, EXT_INPUT)) {
+		BM_ITER(e, &viter, bm, BM_EDGES_OF_VERT, v) {
+			if (!BMO_TestFlag(bm, e, EXT_INPUT)) {
 				found = 1;
 				break;
 			}
-			if (!BMO_TestFlag(bm, l->f, EXT_INPUT)) {
+		}
+		
+		BM_ITER(f, &viter, bm, BM_FACES_OF_VERT, v) {
+			if (!BMO_TestFlag(bm, f, EXT_INPUT)) {
 				found = 1;
 				break;
 			}
-
-			if (found) break;
 		}
 
 		if (!found) {
@@ -93,7 +93,7 @@
 		}
 	}
 	
-	for (f=BMIter_New(&fiter, bm, BM_FACES_OF_MESH, NULL); f; f=BMIter_Step(&fiter)) {
+	BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
 		if (BMO_TestFlag(bm, f, EXT_INPUT))
 			BMO_SetFlag(bm, f, EXT_DEL);
 	}

Modified: branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c	2009-05-28 02:12:28 UTC (rev 20461)
+++ branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c	2009-05-28 04:41:02 UTC (rev 20462)
@@ -144,7 +144,7 @@
 	  do most the work, then layer in ngon data, hehehe*/
 	
 	bmtess = BM_Copy_Mesh(bm);
-	BMO_CallOpf(bmtess, "makefgon");
+	BMO_CallOpf(bmtess, "makefgon trifan=%i", 0);
 	
 	/* new Vertex block */
 	if(bm->totvert==0) mvert= NULL;

Modified: branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2009-05-28 02:12:28 UTC (rev 20461)
+++ branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2009-05-28 04:41:02 UTC (rev 20462)
@@ -76,8 +76,9 @@
 
 /* bmeshutils.c */
 
-/*recalculate tesselations for ngons*/

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list