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; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs