[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52392] trunk/blender/source/blender: bmesh operator api edits, add macros and NULL the buffer if BMO_slot_buffer_alloc()'s len is zero.

Campbell Barton ideasman42 at gmail.com
Tue Nov 20 04:29:20 CET 2012


Revision: 52392
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52392
Author:   campbellbarton
Date:     2012-11-20 03:29:12 +0000 (Tue, 20 Nov 2012)
Log Message:
-----------
bmesh operator api edits, add macros and NULL the buffer if BMO_slot_buffer_alloc()'s len is zero.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h
    trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
    trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c
    trunk/blender/source/blender/bmesh/operators/bmo_unsubdivide.c
    trunk/blender/source/blender/modifiers/intern/MOD_triangulate.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_ops.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h	2012-11-20 02:56:42 UTC (rev 52391)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h	2012-11-20 03:29:12 UTC (rev 52392)
@@ -126,23 +126,31 @@
 		float f;
 		void *p;
 		float vec[3];
-		void *buf;
+		void **buf;
 		GHash *ghash;
 	} data;
 } BMOpSlot;
 
+/* mainly for use outside bmesh internal code */
+#define BMO_SLOT_AS_BOOL(slot)         ((slot)->data.i)
+#define BMO_SLOT_AS_INT(slot)          ((slot)->data.i)
+#define BMO_SLOT_AS_FLOAT(slot)        ((slot)->data.f)
+#define BMO_SLOT_AS_VECTOR(slot)       ((slot)->data.vec)
+#define BMO_SLOT_AS_MATRIX(slot )      ((float (*)[4])((slot)->data.p))
+#define BMO_SLOT_AS_BUFFER(slot )      ((slot)->data.buf)
+#define BMO_SLOT_AS_GHASH(slot )       ((slot)->data.ghash)
+
 /* way more than probably needed, compiler complains if limit hit */
 #define BMO_OP_MAX_SLOTS 16
 
 typedef struct BMOperator {
-	int type;
-	int slot_type;
-	int type_flag;
-	int flag;  /* runtime options */
 	struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS];
 	struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS];
 	void (*exec)(BMesh *bm, struct BMOperator *op);
 	struct MemArena *arena;
+	int type;
+	int type_flag;
+	int flag;  /* runtime options */
 } BMOperator;
 
 enum {

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-11-20 02:56:42 UTC (rev 52391)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-11-20 03:29:12 UTC (rev 52392)
@@ -389,7 +389,7 @@
 		return;
 
 	if (slot->data.p) {
-		copy_m4_m4(r_mat, (float (*)[4])slot->data.p);
+		copy_m4_m4(r_mat, BMO_SLOT_AS_MATRIX(slot));
 	}
 	else {
 		unit_m4(r_mat);
@@ -404,7 +404,7 @@
 		return;
 
 	if (slot->data.p) {
-		copy_m3_m4(r_mat, slot->data.p);
+		copy_m3_m4(r_mat, BMO_SLOT_AS_MATRIX(slot));
 	}
 	else {
 		unit_m3(r_mat);
@@ -471,8 +471,8 @@
 	/* could add support for mapping type */
 	BLI_assert(slot->slot_type == BMO_OP_SLOT_ELEMENT_BUF);
 
-	ret = MEM_mallocN(sizeof(void *) * slot->len, __func__);
-	memcpy(ret, slot->data.buf, sizeof(void *) * slot->len);
+	ret = MEM_mallocN(sizeof(void **) * slot->len, __func__);
+	memcpy(ret, slot->data.buf, sizeof(void **) * slot->len);
 	*len = slot->len;
 	return ret;
 }
@@ -685,8 +685,13 @@
 		return NULL;
 	
 	slot->len = len;
-	if (len)
+	if (len) {
 		slot->data.buf = BLI_memarena_alloc(op->arena, BMO_OPSLOT_TYPEINFO[slot->slot_type] * len);
+	}
+	else {
+		slot->data.buf = NULL;
+	}
+
 	return slot->data.buf;
 }
 
@@ -715,21 +720,21 @@
 
 		if (htype & BM_VERT) {
 			BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
-				((BMHeader **)output->data.p)[i] = ele;
+				output->data.buf[i] = ele;
 				i++;
 			}
 		}
 
 		if (htype & BM_EDGE) {
 			BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
-				((BMHeader **)output->data.p)[i] = ele;
+				output->data.buf[i] = ele;
 				i++;
 			}
 		}
 
 		if (htype & BM_FACE) {
 			BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
-				((BMHeader **)output->data.p)[i] = ele;
+				output->data.buf[i] = ele;
 				i++;
 			}
 		}
@@ -770,7 +775,7 @@
 				if ((!respecthide || !BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) &&
 				    BM_elem_flag_test_bool(ele, hflag) == test_for_enabled)
 				{
-					((BMElem **)output->data.p)[i] = ele;
+					output->data.buf[i] = ele;
 					i++;
 				}
 			}
@@ -781,7 +786,7 @@
 				if ((!respecthide || !BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) &&
 				    BM_elem_flag_test_bool(ele, hflag) == test_for_enabled)
 				{
-					((BMElem **)output->data.p)[i] = ele;
+					output->data.buf[i] = ele;
 					i++;
 				}
 			}
@@ -792,7 +797,7 @@
 				if ((!respecthide || !BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) &&
 				    BM_elem_flag_test_bool(ele, hflag) == test_for_enabled)
 				{
-					((BMElem **)output->data.p)[i] = ele;
+					output->data.buf[i] = ele;
 					i++;
 				}
 			}
@@ -882,7 +887,7 @@
 
 		BMO_slot_buffer_alloc(op, slot_args, slot_name, totelement);
 
-		ele_array = (BMHeader **)slot->data.p;
+		ele_array = (BMHeader **)slot->data.buf;
 
 		/* TODO - collapse these loops into one */
 
@@ -943,7 +948,7 @@
                                   const char htype, const char hflag, const char do_flush)
 {
 	BMOpSlot *slot = BMO_slot_get(slot_args, slot_name);
-	BMElem **data =  slot->data.p;
+	BMElem **data =  (BMElem **)slot->data.buf;
 	int i;
 	const char do_flush_select = (do_flush && (hflag & BM_ELEM_SELECT));
 	const char do_flush_hide = (do_flush && (hflag & BM_ELEM_HIDDEN));
@@ -977,7 +982,7 @@
                                    const char htype, const char hflag, const char do_flush)
 {
 	BMOpSlot *slot = BMO_slot_get(slot_args, slot_name);
-	BMElem **data =  slot->data.p;
+	BMElem **data =  (BMElem **)slot->data.buf;
 	int i;
 	const char do_flush_select = (do_flush && (hflag & BM_ELEM_SELECT));
 	const char do_flush_hide = (do_flush && (hflag & BM_ELEM_HIDDEN));
@@ -1052,7 +1057,7 @@
                                   const char htype, const short oflag)
 {
 	BMOpSlot *slot = BMO_slot_get(slot_args, slot_name);
-	BMHeader **data =  slot->data.p;
+	BMHeader **data = (BMHeader **)slot->data.buf;
 	int i;
 
 	BLI_assert(slot->slot_type == BMO_OP_SLOT_ELEMENT_BUF);
@@ -1211,7 +1216,7 @@
 	if (slot->slot_type != BMO_OP_SLOT_ELEMENT_BUF)
 		return NULL;
 
-	return slot->data.buf ? *(void **)slot->data.buf : NULL;
+	return slot->data.buf ? *slot->data.buf : NULL;
 }
 
 /**
@@ -1253,13 +1258,13 @@
 			return NULL;
 		}
 
-		h = ((void **)iter->slot->data.buf)[iter->cur++];
+		h = iter->slot->data.buf[iter->cur++];
 		while (!(iter->restrictmask & h->htype)) {
 			if (iter->cur >= iter->slot->len) {
 				return NULL;
 			}
 
-			h = ((void **)iter->slot->data.buf)[iter->cur++];
+			h = iter->slot->data.buf[iter->cur++];
 		}
 
 		return h;
@@ -1523,7 +1528,7 @@
 
 					slot->data.buf = BLI_memarena_alloc(op->arena, sizeof(void *) * 4);
 					slot->len = 1;
-					*((void **)slot->data.buf) = ele;
+					*slot->data.buf = ele;
 
 					state = 1;
 					break;

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-11-20 02:56:42 UTC (rev 52391)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-11-20 03:29:12 UTC (rev 52392)
@@ -486,6 +486,6 @@
 	const int do_dissolve_boundaries = BMO_slot_bool_get(op->slots_in, "use_dissolve_boundaries");
 
 	BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries,
-	                             vinput->data.p, vinput->len,
-	                             einput->data.p, einput->len);
+	                             (BMVert **)BMO_SLOT_AS_BUFFER(vinput), vinput->len,
+	                             (BMEdge **)BMO_SLOT_AS_BUFFER(einput), einput->len);
 }

Modified: trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c	2012-11-20 02:56:42 UTC (rev 52391)
+++ trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c	2012-11-20 03:29:12 UTC (rev 52392)
@@ -913,7 +913,7 @@
 
 	/* go through and split edges */
 	for (i = 0; i < einput->len; i++) {
-		edge = ((BMEdge **)einput->data.p)[i];
+		edge = einput->data.buf[i];
 		bm_subdivide_multicut(bm, edge, &params, edge->v1, edge->v2);
 	}
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_unsubdivide.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_unsubdivide.c	2012-11-20 02:56:42 UTC (rev 52391)
+++ trunk/blender/source/blender/bmesh/operators/bmo_unsubdivide.c	2012-11-20 03:29:12 UTC (rev 52392)
@@ -42,7 +42,7 @@
 	const int iterations = max_ii(1, BMO_slot_int_get(op->slots_in, "iterations"));
 
 	BMOpSlot *vinput = BMO_slot_get(op->slots_in, "verts");
-	BMVert **vinput_arr = (BMVert **)vinput->data.p;
+	BMVert **vinput_arr = (BMVert **)vinput->data.buf;
 	int v_index;
 
 	/* tag verts */

Modified: trunk/blender/source/blender/modifiers/intern/MOD_triangulate.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_triangulate.c	2012-11-20 02:56:42 UTC (rev 52391)
+++ trunk/blender/source/blender/modifiers/intern/MOD_triangulate.c	2012-11-20 03:29:12 UTC (rev 52392)
@@ -53,9 +53,6 @@
 	result = CDDM_from_bmesh(bm, FALSE);
 	BM_mesh_free(bm);
 
-	/* we don't really need to calc edges,
-	 * this is called to update the origindex values
-	 * This could be made into a different function? - Campbell */
 	CDDM_calc_edges(result);
 
 	CDDM_calc_normals(result);

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_ops.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_ops.c	2012-11-20 02:56:42 UTC (rev 52391)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_ops.c	2012-11-20 03:29:12 UTC (rev 52392)
@@ -147,7 +147,7 @@
 						return NULL;
 					}
 					else {
-						slot->data.i = param;
+						BMO_SLOT_AS_BOOL(slot) = param;
 					}
 
 					break;
@@ -170,7 +170,7 @@
 						return NULL;
 					}
 					else {
-						slot->data.i = (int)param;
+						BMO_SLOT_AS_INT(slot) = (int)param;
 					}
 					break;
 				}
@@ -184,7 +184,7 @@
 						return NULL;
 					}
 					else {
-						slot->data.f = param;
+						BMO_SLOT_AS_FLOAT(slot) = param;
 					}
 					break;
 				}
@@ -217,7 +217,7 @@
 				case BMO_OP_SLOT_VEC:
 				{
 					/* passing slot name here is a bit non-descriptive */
-					if (mathutils_array_parse(slot->data.vec, 3, 3, value, slot_name) == -1) {
+					if (mathutils_array_parse(BMO_SLOT_AS_VECTOR(slot), 3, 3, value, slot_name) == -1) {
 						return NULL;
 					}
 					break;
@@ -271,7 +271,7 @@
 
 						i = 0;
 						BM_ITER_BPY_BM_SEQ (ele, &iter, ((BPy_BMElemSeq *)value)) {
-							((void **)slot->data.buf)[i] = (void *)ele;
+							slot->data.buf[i] = ele;
 							i++;
 						}
 					}
@@ -339,28 +339,29 @@
 			/* keep switch in same order as above */
 			switch (slot->slot_type) {
 				case BMO_OP_SLOT_BOOL:
-					item = PyBool_FromLong(slot->data.i);
+					item = PyBool_FromLong((BMO_SLOT_AS_BOOL(slot)));
 					break;
 				case BMO_OP_SLOT_INT:

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list