[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44441] trunk/blender/source/blender: bmesh api cleanup

Campbell Barton ideasman42 at gmail.com
Sat Feb 25 23:23:46 CET 2012


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. @@



More information about the Bf-blender-cvs mailing list