So, should every mesh flag be translated to a BMesh flag? Before I had it just copy over the flags from mesh elements, which is why BM_FGON, BM_SHARP, etc started after the first 16 bits, since they aren't originally stored in the flag.<div>
<br></div><div>Joe<br><br><div class="gmail_quote">On Sat, Jan 3, 2009 at 1:26 PM, Geoffrey Bantle <span dir="ltr"><<a href="mailto:hairbat@yahoo.com">hairbat@yahoo.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Revision: 18298<br>
<a href="http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18298" target="_blank">http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18298</a><br>
Author: briggs<br>
Date: 2009-01-03 21:26:29 +0100 (Sat, 03 Jan 2009)<br>
<br>
Log Message:<br>
-----------<br>
-> Cleanup up of API flags<br>
<br>
API flags now use dynamically allocated flag layers isntead<br>
of the persistent flag reserverd for 'marking' elements<br>
(hide, select, sharp, ect).<br>
<br>
Modified Paths:<br>
--------------<br>
branches/bmesh/bmesh/bmesh.h<br>
branches/bmesh/bmesh/intern/bmesh_construct.c<br>
branches/bmesh/bmesh/intern/bmesh_mesh.c<br>
branches/bmesh/bmesh/intern/bmesh_queries.c<br>
<br>
Modified: branches/bmesh/bmesh/bmesh.h<br>
===================================================================<br>
--- branches/bmesh/bmesh/bmesh.h 2009-01-03 20:20:09 UTC (rev 18297)<br>
+++ branches/bmesh/bmesh/bmesh.h 2009-01-03 20:26:29 UTC (rev 18298)<br>
@@ -47,86 +47,68 @@<br>
struct BMEdge;<br>
struct BMFace;<br>
struct BMLoop;<br>
+<br>
/*<br>
- all mesh elements should share this beginning layout<br>
- we can pack this a little tighter now...<br>
-<br>
- BMHeader *next, *prev;<br>
- int EID;<br>
- int eflag1, eflag2;<br>
- short systemflag, type;<br>
- struct BMFlagLayer *flags;<br>
+ * BMHeader<br>
+ *<br>
+ * All mesh elements begin with a BMHeader. This structure<br>
+ * hold several types of data<br>
+ *<br>
+ * 1: The type of the element (vert, edge, loop or face)<br>
+ * 2: Persistant flags/markings (sharp, seam, select, hidden, ect)<br>
+ * 3: Unique ID in the bmesh.<br>
+ * 4: some elements for internal record keeping.<br>
+ *<br>
*/<br>
<br>
-/* Defines for BMHeader->type*/<br>
+/*BMHeader->type*/<br>
#define BM_VERT 1<br>
#define BM_EDGE 2<br>
#define BM_FACE 4<br>
#define BM_LOOP 8<br>
#define BM_ALL BM_VERT | BM_EDGE | BM_FACE | BM_LOOP<br>
<br>
-/*Masks for BMHeader->flag<br>
- Note: Its entirely possible that any temporal flags should be moved<br>
- into the dynamically allocated flag layers and only reserve BMHeader->flag<br>
- for things like select, hide, ect.<br>
+/*BMHeader->flag*/<br>
+#define BM_SELECT (1<<0)<br>
+#define BM_SEAM (1<<1)<br>
+#define BM_FGON (1<<2)<br>
+#define BM_HIDDEN (1<<3)<br>
+#define BM_SHARP (1<<4)<br>
+#define BM_SMOOTH (1<<5)<br>
<br>
- The first 16 bits are reserved for the original element flags.<br>
- The next 5 (till BM_SMOOTH) are bmesh-added ones that replace<br>
- single variable flags. The rest after that are temporary flags.<br>
-*/<br>
-<br>
-#define BM_SELECT 1 //redefinition of SELECT<br>
-<br>
-/*auxillery bmesh flags. note, these should<br>
- become internal to the api eventually.<br>
-<br>
- start at the 17th flag.<br>
- */<br>
-#define BM_SEAM (1<<16)<br>
-#define BM_FGON (1<<17)<br>
-#define BM_HIDDEN (1<<18)<br>
-#define BM_SHARP (1<<19)<br>
-#define BM_SMOOTH (1<<20) /* for faces */<br>
-<br>
-#define BM_DIRTY (1<<21) /*Not used yet*/<br>
-#define BM_NEW (1<<22)<br>
-#define BM_OVERLAP (1<<23) /*used by bmesh_verts_in_face*/<br>
-#define BM_EDGEVERT (1<<24) /*used by bmesh_make_ngon*/<br>
-#define BM_DELETE (1<<25)<br>
-#define BM_AUX1 (1<<26) /*different for edges/verts/faces/ect*/<br>
-#define BM_AUX2 (1<<27) /*different for edges/verts/faces/ect*/<br>
-#define BM_AUX3 (1<<28) /*different for edges/verts/faces/ect*/<br>
-#define BM_TEMP_FLAGS BM_DIRTY|BM_NEW|BM_OVERLAP|BM_EDGEVERT|BM_DELETE<br>
-<br>
-/*All Mesh elements start with this structure*/<br>
typedef struct BMHeader<br>
{<br>
struct BMHeader *next, *prev;<br>
- int EID;<br>
- int flag; /*mesh flags, never to be (ab)used by the api itself!*/<br>
+ int EID; /*Consider removing this/making it ifdeffed for debugging*/<br>
+ short flag, type;<br>
int eflag1, eflag2; /*Flags used by eulers. Try and get rid of/minimize some of these*/<br>
- short type, pad1, pad2, pad3; /*Type of element this is head to*/<br>
- struct BMFlagLayer *flags; /*Dynamically allocated block of flag layers for operators to use*/<br>
+ struct BMFlagLayer *flags; /*Dynamically allocated block of flag layers for operators to use*/<br>
} BMHeader;<br>
<br>
+typedef struct BMFlagLayer{<br>
+ int f1;<br>
+ short mask, pflag;<br>
+}BMFlagLayer;<br>
<br>
-/*Used for circular linked list functions*/<br>
+#define BM_OVERLAP (1<<0) /*used by bmesh_verts_in_face*/<br>
+#define BM_EDGEVERT (1<<1) /*used by bmesh_make_ngon*/<br>
+<br>
+<br>
+/*<br>
+ * BMNode<br>
+ *<br>
+ * Used for circular/linked list functions that form basis of<br>
+ * adjacency system in BMesh. This should probably be hidden<br>
+ * somewhere since tool authors never need to know about it.<br>
+ *<br>
+*/<br>
+<br>
typedef struct BMNode{<br>
struct BMNode *next, *prev;<br>
void *data;<br>
}BMNode;<br>
<br>
-/*Used by operator API to give each operator private flag space<br>
- -Perhaps want to change this to have a union for storing float/long/pointer/ect<br>
- -pflag should be used for system/API stuff<br>
-*/<br>
<br>
-typedef struct BMFlagLayer{<br>
- int f1;<br>
- short mask, pflag;<br>
-}BMFlagLayer;<br>
-<br>
-struct BMOperator;<br>
typedef struct BMesh<br>
{<br>
ListBase verts, edges, polys;<br>
@@ -143,9 +125,9 @@<br>
int nextv, nexte, nextp, nextl;<br>
struct CustomData vdata, edata, pdata, ldata;<br>
int selectmode;<br>
- struct BLI_mempool *flagpool; /*memory pool for dynamically allocated flag layers*/<br>
- int stackdepth; /*current depth of operator stack*/<br>
- int totflags, walkers; /*total number of tool flag layers*/<br>
+ struct BLI_mempool *flagpool; /*memory pool for dynamically allocated flag layers*/<br>
+ int stackdepth; /*current depth of operator stack*/<br>
+ int totflags, walkers; /*total number of tool flag layers*/<br>
}BMesh;<br>
<br>
typedef struct BMVert<br>
<br>
Modified: branches/bmesh/bmesh/intern/bmesh_construct.c<br>
===================================================================<br>
--- branches/bmesh/bmesh/intern/bmesh_construct.c 2009-01-03 20:20:09 UTC (rev 18297)<br>
+++ branches/bmesh/bmesh/intern/bmesh_construct.c 2009-01-03 20:26:29 UTC (rev 18298)<br>
@@ -187,16 +187,15 @@<br>
BMFace *f = NULL;<br>
int overlap = 0, i;<br>
<br>
-<br>
if(nodouble){<br>
if(len > VERT_BUF_SIZE)<br>
verts = MEM_callocN(sizeof(BMVert *) * len, "bmesh make ngon vertex array");<br>
for(i = 0; i < len; i++){<br>
- if(!bmesh_test_sysflag((BMHeader*)(edges[i]->v1), BM_EDGEVERT)){<br>
- bmesh_set_sysflag((BMHeader*)(edges[i]->v1), BM_EDGEVERT);<br>
+ if(!BMO_TestFlag(bm, edges[i]->v1, BM_EDGEVERT)){<br>
+ BMO_SetFlag(bm, edges[i]->v1, BM_EDGEVERT);<br>
verts[i] = edges[i]->v1;<br>
- } else if(!bmesh_test_sysflag((BMHeader*)(edges[i]->v2), BM_EDGEVERT)) {<br>
- bmesh_set_sysflag((BMHeader*)(edges[i]->v2), BM_EDGEVERT);<br>
+ } else if(!BMO_TestFlag(bm, edges[i]->v2, BM_EDGEVERT)) {<br>
+ BMO_SetFlag(bm, edges[i]->v2, BM_EDGEVERT);<br>
verts[i] = edges[i]->v2;<br>
}<br>
}<br>
@@ -205,8 +204,8 @@<br>
<br>
/*clear flags*/<br>
for(i = 0; i < len; i++){<br>
- bmesh_clear_sysflag((BMHeader*)(edges[i]->v1), BM_EDGEVERT);<br>
- bmesh_clear_sysflag((BMHeader*)(edges[i]->v2), BM_EDGEVERT);<br>
+ BMO_ClearFlag(bm, edges[i]->v1, BM_EDGEVERT);<br>
+ BMO_ClearFlag(bm, edges[i]->v2, BM_EDGEVERT);<br>
}<br>
<br>
if(len > VERT_BUF_SIZE)<br>
<br>
Modified: branches/bmesh/bmesh/intern/bmesh_mesh.c<br>
===================================================================<br>
--- branches/bmesh/bmesh/intern/bmesh_mesh.c 2009-01-03 20:20:09 UTC (rev 18297)<br>
+++ branches/bmesh/bmesh/intern/bmesh_mesh.c 2009-01-03 20:26:29 UTC (rev 18298)<br>
@@ -88,33 +88,6 @@<br>
return 0;<br>
}<br>
<br>
-/*<br>
- * CLEAR TEMP FLAGS<br>
- *<br>
- * Clears all temporary flags at end of the modelling loop.<br>
- * May need to move this to operator finishing function?<br>
- *<br>
-*/<br>
-static void clear_temp_flags(BMesh *bm)<br>
-{<br>
- BMIter verts;<br>
- BMIter edges;<br>
- BMIter loops;<br>
- BMIter faces;<br>
-<br>
- BMVert *v;<br>
- BMEdge *e;<br>
- BMLoop *l;<br>
- BMFace *f;<br>
-<br>
- for(v = BMIter_New(&verts, bm, BM_VERTS, bm ); v; v = BMIter_Step(&verts)) bmesh_clear_sysflag(&(v->head), BM_TEMP_FLAGS);<br>
- for(e = BMIter_New(&edges, bm, BM_EDGES, bm ); e; e = BMIter_Step(&edges)) bmesh_clear_sysflag(&(e->head), BM_TEMP_FLAGS);<br>
- for(f = BMIter_New(&faces, bm, BM_FACES, bm ); f; f = BMIter_Step(&faces)){<br>
- bmesh_clear_sysflag(&(f->head), BM_TEMP_FLAGS);<br>
- for(l = BMIter_New(&loops, bm, BM_LOOPS_OF_FACE, f ); l; l = BMIter_Step(&loops)) bmesh_clear_sysflag(&(l->head), BM_TEMP_FLAGS);<br>
- }<br>
-}<br>
-<br>
/*<br>
* BMESH MAKE MESH<br>
*<br>
@@ -293,6 +266,5 @@<br>
<br>
/*compute normals, clear temp flags and flush selections*/<br>
BM_Compute_Normals(bm);<br>
- clear_temp_flags(bm);<br>
bmesh_selectmode_flush(bm);<br>
}<br>
<br>
Modified: branches/bmesh/bmesh/intern/bmesh_queries.c<br>
===================================================================<br>
--- branches/bmesh/bmesh/intern/bmesh_queries.c 2009-01-03 20:20:09 UTC (rev 18297)<br>
+++ branches/bmesh/bmesh/intern/bmesh_queries.c 2009-01-03 20:26:29 UTC (rev 18298)<br>
@@ -76,21 +76,20 @@<br>
* that appear in a given face<br>
*<br>
*/<br>
-<br>
-int BM_Verts_In_Face(BMFace *f, BMVert **varr, int len)<br>
+int BM_Verts_In_Face(BMesh *bm, BMFace *f, BMVert **varr, int len)<br>
{<br>
BMLoop *curloop = NULL;<br>
int i, count = 0;<br>
<br>
- for(i=0; i < len; i++) bmesh_set_sysflag(&(varr[i]->head), BM_OVERLAP);<br>
+ for(i=0; i < len; i++) BMO_SetFlag(bm, varr[i], BM_OVERLAP);<br>
<br>
curloop = f->loopbase;<br>
do{<br>
- if(bmesh_test_sysflag(&(curloop->v->head), BM_OVERLAP)) count++;<br>
+ if(BMO_TestFlag(bm, curloop->v, BM_OVERLAP)) count++;<br>
curloop = ((BMLoop*)(curloop->head.next));<br>
} while(curloop = ((BMLoop*)(curloop->head.next)));<br>
<br>
- for(i=0; i < len; i++) bmesh_clear_sysflag(&(varr[i]->head), BM_OVERLAP);<br>
+ for(i=0; i < len; i++) BMO_ClearFlag(bm, varr[i], BM_OVERLAP);<br>
<br>
return count;<br>
}<br>
@@ -490,7 +489,7 @@<br>
for(i=0; i < len; i++){<br>
f = BMIter_New(&vertfaces, bm, BM_FACES_OF_VERT, varr[i] );<br>
while(f){<br>
- amount = BM_Verts_In_Face(f, varr, len);<br>
+ amount = BM_Verts_In_Face(bm, f, varr, len);<br>
if(amount >= len){<br>
if((len == f->len) && existface)<br>
*existface = f;<br>
<br>
<br>
_______________________________________________<br>
Bf-blender-cvs mailing list<br>
<a href="mailto:Bf-blender-cvs@blender.org">Bf-blender-cvs@blender.org</a><br>
<a href="http://lists.blender.org/mailman/listinfo/bf-blender-cvs" target="_blank">http://lists.blender.org/mailman/listinfo/bf-blender-cvs</a><br>
</blockquote></div><br></div>