[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18298] branches/bmesh/bmesh: -> Cleanup up of API flags

Geoffrey Bantle hairbat at yahoo.com
Sat Jan 3 21:26:30 CET 2009


Revision: 18298
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18298
Author:   briggs
Date:     2009-01-03 21:26:29 +0100 (Sat, 03 Jan 2009)

Log Message:
-----------
-> Cleanup up of API flags

API flags now use dynamically allocated flag layers isntead
of the persistent flag reserverd for 'marking' elements
(hide, select, sharp, ect).

Modified Paths:
--------------
    branches/bmesh/bmesh/bmesh.h
    branches/bmesh/bmesh/intern/bmesh_construct.c
    branches/bmesh/bmesh/intern/bmesh_mesh.c
    branches/bmesh/bmesh/intern/bmesh_queries.c

Modified: branches/bmesh/bmesh/bmesh.h
===================================================================
--- branches/bmesh/bmesh/bmesh.h	2009-01-03 20:20:09 UTC (rev 18297)
+++ branches/bmesh/bmesh/bmesh.h	2009-01-03 20:26:29 UTC (rev 18298)
@@ -47,86 +47,68 @@
 struct BMEdge;
 struct BMFace;
 struct BMLoop;
+
 /*
-	all mesh elements should share this beginning layout
-	we can pack this a little tighter now... 
-	
-	BMHeader *next, *prev;
-	int EID;
-	int eflag1, eflag2;
-	short systemflag, type;
-	struct BMFlagLayer *flags;
+ * BMHeader
+ *
+ * All mesh elements begin with a BMHeader. This structure 
+ * hold several types of data
+ *
+ * 1: The type of the element (vert, edge, loop or face)
+ * 2: Persistant flags/markings (sharp, seam, select, hidden, ect)
+ * 3: Unique ID in the bmesh.
+ * 4: some elements for internal record keeping.
+ *
 */
 
-/* Defines for BMHeader->type*/
+/*BMHeader->type*/
 #define BM_VERT 					1
 #define BM_EDGE 					2
 #define BM_FACE 					4
 #define BM_LOOP 					8
 #define BM_ALL					BM_VERT | BM_EDGE | BM_FACE | BM_LOOP
 
-/*Masks for BMHeader->flag
-	Note: Its entirely possible that any temporal flags should be moved
-	into the dynamically allocated flag layers and only reserve BMHeader->flag
-	for things like select, hide, ect.
+/*BMHeader->flag*/
+#define BM_SELECT	(1<<0)
+#define BM_SEAM		(1<<1)
+#define BM_FGON		(1<<2)
+#define BM_HIDDEN	(1<<3)
+#define BM_SHARP	(1<<4)
+#define BM_SMOOTH	(1<<5)
 
-	The first 16 bits are reserved for the original element flags.
-	The next 5 (till BM_SMOOTH) are bmesh-added ones that replace
-	single variable flags.  The rest after that are temporary flags.
-*/	
-
-#define BM_SELECT	1 //redefinition of SELECT
-
-/*auxillery bmesh flags.  note, these should
-  become internal to the api eventually.
-  
-  start at the 17th flag.
- */
-#define BM_SEAM		(1<<16)
-#define BM_FGON		(1<<17)
-#define BM_HIDDEN	(1<<18)
-#define BM_SHARP	(1<<19)
-#define BM_SMOOTH	(1<<20) /* for faces */
-
-#define BM_DIRTY		(1<<21)			/*Not used yet*/
-#define BM_NEW			(1<<22)			
-#define BM_OVERLAP		(1<<23)			/*used by bmesh_verts_in_face*/
-#define BM_EDGEVERT 	(1<<24) 			/*used by bmesh_make_ngon*/
-#define BM_DELETE		(1<<25)
-#define BM_AUX1			(1<<26) 			/*different for edges/verts/faces/ect*/
-#define BM_AUX2			(1<<27) 			/*different for edges/verts/faces/ect*/
-#define BM_AUX3			(1<<28) 			/*different for edges/verts/faces/ect*/
-#define BM_TEMP_FLAGS	BM_DIRTY|BM_NEW|BM_OVERLAP|BM_EDGEVERT|BM_DELETE
-
-/*All Mesh elements start with this structure*/
 typedef struct BMHeader
 {
 	struct BMHeader *next, *prev;
-	int 		EID;
-	int 		flag;								/*mesh flags, never to be (ab)used by the api itself!*/
+	int 		EID;								/*Consider removing this/making it ifdeffed for debugging*/
+	short 		flag, type;								
 	int			eflag1, eflag2;						/*Flags used by eulers. Try and get rid of/minimize some of these*/
-	short		type, pad1, pad2, pad3;				/*Type of element this is head to*/
-	struct BMFlagLayer *flags;					/*Dynamically allocated block of flag layers for operators to use*/
+	struct BMFlagLayer *flags;						/*Dynamically allocated block of flag layers for operators to use*/
 } BMHeader;
 
+typedef struct BMFlagLayer{
+	int f1;
+	short mask, pflag;
+}BMFlagLayer;
 
-/*Used for circular linked list functions*/
+#define BM_OVERLAP		(1<<0)			/*used by bmesh_verts_in_face*/
+#define BM_EDGEVERT 	(1<<1) 			/*used by bmesh_make_ngon*/
+
+
+/*
+ * BMNode
+ *
+ * Used for circular/linked list functions that form basis of
+ * adjacency system in BMesh. This should probably be hidden 
+ * somewhere since tool authors never need to know about it.
+ *
+*/
+
 typedef struct BMNode{
 	struct BMNode *next, *prev;
 	void *data;
 }BMNode;
 
-/*Used by operator API to give each operator private flag space
-	-Perhaps want to change this to have a union for storing float/long/pointer/ect
-	-pflag should be used for system/API stuff
-*/
 
-typedef struct BMFlagLayer{
-	int f1;
-	short mask, pflag;
-}BMFlagLayer;
-
-struct BMOperator;
 typedef struct BMesh
 {
 	ListBase verts, edges, polys;
@@ -143,9 +125,9 @@
 	int nextv, nexte, nextp, nextl;
 	struct CustomData vdata, edata, pdata, ldata;
 	int selectmode;
-	struct BLI_mempool *flagpool;     /*memory pool for dynamically allocated flag layers*/
-	int stackdepth;                   /*current depth of operator stack*/
-	int totflags, walkers;            /*total number of tool flag layers*/
+	struct BLI_mempool *flagpool;					/*memory pool for dynamically allocated flag layers*/
+	int stackdepth;									/*current depth of operator stack*/
+	int totflags, walkers;							/*total number of tool flag layers*/
 }BMesh;
 
 typedef struct BMVert

Modified: branches/bmesh/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/bmesh/intern/bmesh_construct.c	2009-01-03 20:20:09 UTC (rev 18297)
+++ branches/bmesh/bmesh/intern/bmesh_construct.c	2009-01-03 20:26:29 UTC (rev 18298)
@@ -187,16 +187,15 @@
 	BMFace *f = NULL;
 	int overlap = 0, i;
 
-
 	if(nodouble){
 		if(len > VERT_BUF_SIZE)
 			verts = MEM_callocN(sizeof(BMVert *) * len, "bmesh make ngon vertex array");
 		for(i = 0; i < len; i++){
-			if(!bmesh_test_sysflag((BMHeader*)(edges[i]->v1), BM_EDGEVERT)){
-				bmesh_set_sysflag((BMHeader*)(edges[i]->v1), BM_EDGEVERT);
+			if(!BMO_TestFlag(bm, edges[i]->v1, BM_EDGEVERT)){
+				BMO_SetFlag(bm, edges[i]->v1, BM_EDGEVERT);
 				verts[i] = edges[i]->v1;
-			} else if(!bmesh_test_sysflag((BMHeader*)(edges[i]->v2), BM_EDGEVERT)) {
-				bmesh_set_sysflag((BMHeader*)(edges[i]->v2), BM_EDGEVERT);
+			} else if(!BMO_TestFlag(bm, edges[i]->v2, BM_EDGEVERT)) {
+				BMO_SetFlag(bm, edges[i]->v2, BM_EDGEVERT);
 				verts[i] = 	edges[i]->v2;
 			}
 		}
@@ -205,8 +204,8 @@
 		
 		/*clear flags*/
 		for(i = 0; i < len; i++){
-			bmesh_clear_sysflag((BMHeader*)(edges[i]->v1), BM_EDGEVERT);
-			bmesh_clear_sysflag((BMHeader*)(edges[i]->v2), BM_EDGEVERT);
+			BMO_ClearFlag(bm, edges[i]->v1, BM_EDGEVERT);
+			BMO_ClearFlag(bm, edges[i]->v2, BM_EDGEVERT);
 		}
 		
 		if(len > VERT_BUF_SIZE)

Modified: branches/bmesh/bmesh/intern/bmesh_mesh.c
===================================================================
--- branches/bmesh/bmesh/intern/bmesh_mesh.c	2009-01-03 20:20:09 UTC (rev 18297)
+++ branches/bmesh/bmesh/intern/bmesh_mesh.c	2009-01-03 20:26:29 UTC (rev 18298)
@@ -88,33 +88,6 @@
 	return 0;
 }
 
-/*
- * CLEAR TEMP FLAGS
- *
- * Clears all temporary flags at end of the modelling loop.
- * May need to move this to operator finishing function?
- *
-*/
-static void clear_temp_flags(BMesh *bm)
-{
-	BMIter verts;
-	BMIter edges;
-	BMIter loops;
-	BMIter faces;
-
-	BMVert *v;
-	BMEdge *e;
-	BMLoop *l;
-	BMFace *f;
-
-	for(v = BMIter_New(&verts, bm, BM_VERTS, bm ); v; v = BMIter_Step(&verts)) bmesh_clear_sysflag(&(v->head), BM_TEMP_FLAGS);
-	for(e = BMIter_New(&edges, bm, BM_EDGES, bm ); e; e = BMIter_Step(&edges)) bmesh_clear_sysflag(&(e->head), BM_TEMP_FLAGS);
-	for(f = BMIter_New(&faces, bm, BM_FACES, bm ); f; f = BMIter_Step(&faces)){
-		bmesh_clear_sysflag(&(f->head), BM_TEMP_FLAGS);
-		for(l = BMIter_New(&loops, bm, BM_LOOPS_OF_FACE, f ); l; l = BMIter_Step(&loops)) bmesh_clear_sysflag(&(l->head), BM_TEMP_FLAGS);
-	}
-}
-
 /*	
  *	BMESH MAKE MESH
  *
@@ -293,6 +266,5 @@
 
 	/*compute normals, clear temp flags and flush selections*/
 	BM_Compute_Normals(bm);
-	clear_temp_flags(bm);
 	bmesh_selectmode_flush(bm);
 }

Modified: branches/bmesh/bmesh/intern/bmesh_queries.c
===================================================================
--- branches/bmesh/bmesh/intern/bmesh_queries.c	2009-01-03 20:20:09 UTC (rev 18297)
+++ branches/bmesh/bmesh/intern/bmesh_queries.c	2009-01-03 20:26:29 UTC (rev 18298)
@@ -76,21 +76,20 @@
  * that appear in a given face
  *
 */
-
-int BM_Verts_In_Face(BMFace *f, BMVert **varr, int len)
+int BM_Verts_In_Face(BMesh *bm, BMFace *f, BMVert **varr, int len)
 {
 	BMLoop *curloop = NULL;
 	int i, count = 0;
 	
-	for(i=0; i < len; i++) bmesh_set_sysflag(&(varr[i]->head), BM_OVERLAP);
+	for(i=0; i < len; i++) BMO_SetFlag(bm, varr[i], BM_OVERLAP);
 
 	curloop = f->loopbase;
 	do{
-		if(bmesh_test_sysflag(&(curloop->v->head), BM_OVERLAP)) count++;
+		if(BMO_TestFlag(bm, curloop->v, BM_OVERLAP)) count++;
 		curloop = ((BMLoop*)(curloop->head.next));
 	} while(curloop = ((BMLoop*)(curloop->head.next)));
 
-	for(i=0; i < len; i++) bmesh_clear_sysflag(&(varr[i]->head), BM_OVERLAP);
+	for(i=0; i < len; i++) BMO_ClearFlag(bm, varr[i], BM_OVERLAP);
 
 	return count;
 }
@@ -490,7 +489,7 @@
 	for(i=0; i < len; i++){
 		f = BMIter_New(&vertfaces, bm, BM_FACES_OF_VERT, varr[i] );
 		while(f){
-			amount = BM_Verts_In_Face(f, varr, len);
+			amount = BM_Verts_In_Face(bm, f, varr, len);
 			if(amount >= len){
 				if((len == f->len) && existface)
 					*existface = f;





More information about the Bf-blender-cvs mailing list