Revision: 44441
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44441
Author:   campbellbarton
Date:     2012-02-25 22:23:40 +0000 (Sat, 25 Feb 2012)
Log Message:
-----------
bmesh api cleanup
* better type safety for BM_elem_flag_* and BM_elem_index_* functions.
* add BMElem type to be used where BMFace/Edge/Vert/Loop can be interchanged.
* fix bug in select manifold, found when making functions more strict.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/bmesh.h
    trunk/blender/source/blender/bmesh/bmesh_class.h
    trunk/blender/source/blender/bmesh/bmesh_marking.h
    trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
    trunk/blender/source/blender/bmesh/intern/bmesh_inline.c
    trunk/blender/source/blender/bmesh/intern/bmesh_marking.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
    trunk/blender/source/blender/bmesh/intern/bmesh_newcore.c
    trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
    trunk/blender/source/blender/bmesh/operators/bmo_mesh_conv.c
    trunk/blender/source/blender/editors/mesh/bmesh_select.c
    trunk/blender/source/blender/editors/mesh/bmesh_selecthistory.c
    trunk/blender/source/blender/editors/mesh/bmesh_tools.c
    trunk/blender/source/blender/editors/mesh/bmesh_utils.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/modifiers/intern/MOD_array.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.h

Modified: trunk/blender/source/blender/bmesh/bmesh.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh.h  2012-02-25 21:27:45 UTC (rev 
44440)
+++ trunk/blender/source/blender/bmesh/bmesh.h  2012-02-25 22:23:40 UTC (rev 
44441)
@@ -144,18 +144,20 @@
 BMFace *BM_face_create_ngon(BMesh *bm, BMVert *v1, BMVert *v2, BMEdge **edges, 
int len, int nodouble);
 
 /* stuff for dealing with header flags */
-BM_INLINE char BM_elem_flag_test(const void *element, const char hflag);
+#define BM_elem_flag_test(ele, hflag)      _bm_elem_flag_test    
(&(ele)->head, hflag)
+#define BM_elem_flag_enable(ele, hflag)    _bm_elem_flag_enable  
(&(ele)->head, hflag)
+#define BM_elem_flag_disable(ele, hflag)   _bm_elem_flag_disable 
(&(ele)->head, hflag)
+#define BM_elem_flag_set(ele, hflag, val)  _bm_elem_flag_set     
(&(ele)->head, hflag, val)
+#define BM_elem_flag_toggle(ele, hflag)    _bm_elem_flag_toggle  
(&(ele)->head, hflag)
+#define BM_elem_flag_merge(ele_a, ele_b)   _bm_elem_flag_merge   
(&(ele_a)->head, &(ele_b)->head)
 
-/* stuff for dealing with header flags */
-BM_INLINE void BM_elem_flag_enable(void *element, const char hflag);
+BM_INLINE char _bm_elem_flag_test(const BMHeader *element, const char hflag);
+BM_INLINE void _bm_elem_flag_enable(BMHeader *element, const char hflag);
+BM_INLINE void _bm_elem_flag_disable(BMHeader *element, const char hflag);
+BM_INLINE void _bm_elem_flag_set(BMHeader *ele, const char hflag, const int 
val);
+BM_INLINE void _bm_elem_flag_toggle(BMHeader *ele, const char hflag);
+BM_INLINE void _bm_elem_flag_merge(BMHeader *ele_a, BMHeader *ele_b);
 
-/* stuff for dealing with header flags */
-BM_INLINE void BM_elem_flag_disable(void *element, const char hflag);
-
-/* stuff for dealing BM_elem_flag_toggle header flags */
-BM_INLINE void BM_elem_flag_toggle(void *element, const char hflag);
-BM_INLINE void BM_elem_flag_merge(void *element_a, void *element_b);
-
 /* notes on BM_elem_index_set(...) usage,
  * Set index is sometimes abused as temp storage, other times we cant be
  * sure if the index values are valid because certain operations have modified
@@ -185,8 +187,10 @@
  *                    assume each case they are dirty.
  * - campbell */
 
-BM_INLINE void BM_elem_index_set(void *element, const int index);
-BM_INLINE int  BM_elem_index_get(const void *element);
+#define BM_elem_index_get(ele)           _bm_elem_index_get(&(ele)->head)
+#define BM_elem_index_set(ele, index)    _bm_elem_index_set(&(ele)->head, 
index)
+BM_INLINE int  _bm_elem_index_get(const BMHeader *ele);
+BM_INLINE void _bm_elem_index_set(BMHeader *ele, const int index);
 
 /* todo */
 BMFace *BM_face_copy(BMesh *bm, BMFace *f, const short copyverts, const short 
copyedges);

Modified: trunk/blender/source/blender/bmesh/bmesh_class.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh_class.h    2012-02-25 21:27:45 UTC 
(rev 44440)
+++ trunk/blender/source/blender/bmesh/bmesh_class.h    2012-02-25 22:23:40 UTC 
(rev 44441)
@@ -111,6 +111,11 @@
        struct BMFlagLayer *oflags; /* keep after header, an array of flags, 
mostly used by the operator stack */
 } BMElemF;
 
+/* can cast anything to this, including BMLoop */
+typedef struct BMElem {
+       BMHeader head;
+} BMElem;
+
 #ifdef USE_BMESH_HOLES
 /* eventually, this structure will be used for supporting holes in faces */
 typedef struct BMLoopList {

Modified: trunk/blender/source/blender/bmesh/bmesh_marking.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh_marking.h  2012-02-25 21:27:45 UTC 
(rev 44440)
+++ trunk/blender/source/blender/bmesh/bmesh_marking.h  2012-02-25 22:23:40 UTC 
(rev 44441)
@@ -30,7 +30,7 @@
 typedef struct BMEditSelection
 {
        struct BMEditSelection *next, *prev;
-       void *data;
+       BMElem *ele;
        char htype;
 } BMEditSelection;
 
@@ -66,9 +66,9 @@
 void BM_editselection_normal(float r_normal[3], BMEditSelection *ese);
 void BM_editselection_plane(BMesh *bm, float r_plane[3], BMEditSelection *ese);
 
-int  BM_select_history_check(BMesh *bm, void *data);
-void BM_select_history_remove(BMesh *bm, void *data);
-void BM_select_history_store(BMesh *bm, void *data);
+int  BM_select_history_check(BMesh *bm, const BMElem *ele);
+void BM_select_history_remove(BMesh *bm, BMElem *ele);
+void BM_select_history_store(BMesh *bm, BMElem *ele);
 void BM_select_history_validate(BMesh *bm);
 void BM_select_history_clear(BMesh *em);
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.c 2012-02-25 
21:27:45 UTC (rev 44440)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.c 2012-02-25 
22:23:40 UTC (rev 44441)
@@ -566,7 +566,7 @@
                return;
 
        /* First we copy select */
-       if (BM_elem_flag_test(source, BM_ELEM_SELECT)) {
+       if (BM_elem_flag_test((BMElem *)sheader, BM_ELEM_SELECT)) {
                BM_elem_select_set(target_mesh, target, TRUE);
        }
        
@@ -706,11 +706,11 @@
                void *ele = NULL;
 
                if (ese->htype == BM_VERT)
-                       ele = vtable[BM_elem_index_get(ese->data)];
+                       ele = vtable[BM_elem_index_get(ese->ele)];
                else if (ese->htype == BM_EDGE)
-                       ele = etable[BM_elem_index_get(ese->data)];
+                       ele = etable[BM_elem_index_get(ese->ele)];
                else if (ese->htype == BM_FACE) {
-                       ele = ftable[BM_elem_index_get(ese->data)];
+                       ele = ftable[BM_elem_index_get(ese->ele)];
                }
                else {
                        BLI_assert(0);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_inline.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_inline.c    2012-02-25 
21:27:45 UTC (rev 44440)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_inline.c    2012-02-25 
22:23:40 UTC (rev 44441)
@@ -31,47 +31,46 @@
 
 #include "bmesh.h"
 
-BM_INLINE char BM_elem_flag_test(const void *element, const char hflag)
+BM_INLINE char _bm_elem_flag_test(const BMHeader *ele, const char hflag)
 {
-       return ((const BMHeader *)element)->hflag & hflag;
+       return ele->hflag & hflag;
 }
 
-BM_INLINE void BM_elem_flag_enable(void *element, const char hflag)
+BM_INLINE void _bm_elem_flag_enable(BMHeader *ele, const char hflag)
 {
-       ((BMHeader *)element)->hflag |= hflag;
+       ele->hflag |= hflag;
 }
 
-BM_INLINE void BM_elem_flag_disable(void *element, const char hflag)
+BM_INLINE void _bm_elem_flag_disable(BMHeader *ele, const char hflag)
 {
-       ((BMHeader *)element)->hflag &= ~hflag;
+       ele->hflag &= ~hflag;
 }
 
-BM_INLINE void BM_elem_flag_set(void *element, const char hflag, const int val)
+BM_INLINE void _bm_elem_flag_set(BMHeader *ele, const char hflag, const int 
val)
 {
-       if (val)  BM_elem_flag_enable(element,  hflag);
-       else      BM_elem_flag_disable(element, hflag);
+       if (val)  _bm_elem_flag_enable(ele,  hflag);
+       else      _bm_elem_flag_disable(ele, hflag);
 }
 
-BM_INLINE void BM_elem_flag_toggle(void *element, const char hflag)
+BM_INLINE void _bm_elem_flag_toggle(BMHeader *ele, const char hflag)
 {
-       ((BMHeader *)element)->hflag ^= hflag;
+       ele->hflag ^= hflag;
 }
 
-BM_INLINE void BM_elem_flag_merge(void *element_a, void *element_b)
+BM_INLINE void _bm_elem_flag_merge(BMHeader *ele_a, BMHeader *ele_b)
 {
-       ((BMHeader *)element_a)->hflag =
-       ((BMHeader *)element_b)->hflag = (((BMHeader *)element_a)->hflag |
-                                         ((BMHeader *)element_b)->hflag);
+       ele_a->hflag = ele_b->hflag = ele_a->hflag | ele_b->hflag;
 }
 
-BM_INLINE void BM_elem_index_set(void *element, const int index)
+
+BM_INLINE void _bm_elem_index_set(BMHeader *ele, const int index)
 {
-       ((BMHeader *)element)->index = index;
+       ele->index = index;
 }
 
-BM_INLINE int BM_elem_index_get(const void *element)
+BM_INLINE int _bm_elem_index_get(const BMHeader *ele)
 {
-       return ((BMHeader *)element)->index;
+       return ele->index;
 }
 
 #endif /* __BMESH_INLINE_C__ */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_marking.c   2012-02-25 
21:27:45 UTC (rev 44440)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_marking.c   2012-02-25 
22:23:40 UTC (rev 44441)
@@ -55,7 +55,7 @@
 static void recount_totsels(BMesh *bm)
 {
        BMIter iter;
-       BMHeader *ele;
+       BMElem *ele;
        const char iter_types[3] = {BM_VERTS_OF_MESH,
                                    BM_EDGES_OF_MESH,
                                    BM_FACES_OF_MESH};
@@ -124,7 +124,7 @@
                        if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
                                l_iter = l_first = BM_FACE_FIRST_LOOP(f);
                                do {
-                                       if 
(!BM_elem_flag_test(&(l_iter->e->head), BM_ELEM_SELECT)) {
+                                       if (!BM_elem_flag_test(l_iter->e, 
BM_ELEM_SELECT)) {
                                                ok = FALSE;
                                                break;
                                        }
@@ -286,13 +286,13 @@
        if (select) {
                if (!BM_elem_flag_test(e, BM_ELEM_SELECT)) bm->totedgesel += 1;
 
-               BM_elem_flag_enable(&(e->head), BM_ELEM_SELECT);
+               BM_elem_flag_enable(e, BM_ELEM_SELECT);
                BM_elem_select_set(bm, e->v1, TRUE);
                BM_elem_select_set(bm, e->v2, TRUE);
        }
        else {
                if (BM_elem_flag_test(e, BM_ELEM_SELECT)) bm->totedgesel -= 1;
-               BM_elem_flag_disable(&(e->head), BM_ELEM_SELECT);
+               BM_elem_flag_disable(e, BM_ELEM_SELECT);
 
                if ( bm->selectmode == SCE_SELECT_EDGE ||
                     bm->selectmode == SCE_SELECT_FACE ||
@@ -352,7 +352,7 @@
                        bm->totfacesel++;
                }
 
-               BM_elem_flag_enable(&(f->head), BM_ELEM_SELECT);
+               BM_elem_flag_enable(f, BM_ELEM_SELECT);
                l_iter = l_first = BM_FACE_FIRST_LOOP(f);
                do {
                        BM_vert_select_set(bm, l_iter->v, TRUE);
@@ -364,7 +364,7 @@
                BMLoop *l;
 
                if (BM_elem_flag_test(f, BM_ELEM_SELECT)) bm->totfacesel -= 1;
-               BM_elem_flag_disable(&(f->head), BM_ELEM_SELECT);
+               BM_elem_flag_disable(f, BM_ELEM_SELECT);
 
                /* flush down to edges */
                BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
@@ -427,7 +427,7 @@
                for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = 
BM_iter_step(&verts))
                        BM_elem_flag_disable(v, 0);
                for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = 
BM_iter_step(&edges)) {
-                       if (BM_elem_flag_test(&(e->head), BM_ELEM_SELECT)) {
+                       if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
                                BM_edge_select_set(bm, e, TRUE);
                        }
                }
@@ -437,7 +437,7 @@
                for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = 
BM_iter_step(&edges))
                        BM_elem_flag_disable(e, 0);

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to