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

Campbell Barton ideasman42 at gmail.com
Thu Mar 1 18:38:10 CET 2012


Revision: 44584
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44584
Author:   campbellbarton
Date:     2012-03-01 17:38:04 +0000 (Thu, 01 Mar 2012)
Log Message:
-----------
bmesh api:
* name bmesh operator func's BMO_slot_buffer_* rather then BMO_slot_* since it wasnt obvious some only dealt with buffer, some both.
* more typechecks and asserts of BMO_ functions (I lost some time calling a map with a buffer function that failed silently).
* small speedup for extrude check - test if the edge is wire _before_ doign a hash lookup.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/bmesh_operator_api.h
    trunk/blender/source/blender/bmesh/intern/bmesh_core.c
    trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
    trunk/blender/source/blender/bmesh/operators/bmo_bevel.c
    trunk/blender/source/blender/bmesh/operators/bmo_connect.c
    trunk/blender/source/blender/bmesh/operators/bmo_create.c
    trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
    trunk/blender/source/blender/bmesh/operators/bmo_dupe.c
    trunk/blender/source/blender/bmesh/operators/bmo_edgesplit.c
    trunk/blender/source/blender/bmesh/operators/bmo_extrude.c
    trunk/blender/source/blender/bmesh/operators/bmo_mirror.c
    trunk/blender/source/blender/bmesh/operators/bmo_primitive.c
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c
    trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
    trunk/blender/source/blender/bmesh/operators/bmo_utils.c
    trunk/blender/source/blender/editors/mesh/bmesh_tools.c

Modified: trunk/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh_operator_api.h	2012-03-01 17:13:02 UTC (rev 44583)
+++ trunk/blender/source/blender/bmesh/bmesh_operator_api.h	2012-03-01 17:38:04 UTC (rev 44584)
@@ -291,8 +291,8 @@
 
 /* puts every element of type type (which is a bitmask) with tool flag flag,
  * into a slot. */
-void BMO_slot_from_flag(BMesh *bm, BMOperator *op, const char *slotname,
-                        const short oflag, const char htype);
+void BMO_slot_buffer_from_flag(BMesh *bm, BMOperator *op, const char *slotname,
+                               const short oflag, const char htype);
 
 /* tool-flags all elements inside an element slot array with flag flag. */
 void BMO_slot_buffer_flag_enable(BMesh *bm, BMOperator *op, const char *slotname,
@@ -311,11 +311,11 @@
 /* puts every element of type type (which is a bitmask) with header flag
  * flag, into a slot.  note: ignores hidden elements (e.g. elements with
  * header flag BM_ELEM_HIDDEN set).*/
-void BMO_slot_from_hflag(BMesh *bm, BMOperator *op, const char *slotname,
+void BMO_slot_buffer_from_hflag(BMesh *bm, BMOperator *op, const char *slotname,
                          const char hflag, const char htype);
 
 /* counts number of elements inside a slot array. */
-int BMO_slot_buf_count(BMesh *bm, BMOperator *op, const char *slotname);
+int BMO_slot_buffer_count(BMesh *bm, BMOperator *op, const char *slotname);
 int BMO_slot_map_count(BMesh *bm, BMOperator *op, const char *slotname);
 
 void BMO_slot_map_insert(BMesh *UNUSED(bm), BMOperator *op, const char *slotname,
@@ -371,7 +371,7 @@
 	char restrictmask; /* bitwise '&' with BMHeader.htype */
 } BMOIter;
 
-void *BMO_slot_elem_first(BMOperator *op, const char *slotname);
+void *BMO_slot_buffer_elem_first(BMOperator *op, const char *slotname);
 
 /* restrictmask restricts the iteration to certain element types
  * (e.g. combination of BM_VERT, BM_EDGE, BM_FACE), if iterating

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2012-03-01 17:13:02 UTC (rev 44583)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2012-03-01 17:38:04 UTC (rev 44584)
@@ -1508,7 +1508,7 @@
 			BMESH_ASSERT(edok != FALSE);
 
 			/* Validate loop cycle of all faces attached to o */
-			for (i = 0, l = oe->l; i < radlen; i++, l = l->radial_next) {
+			for (i = 0, l = oe->l; i < radlen; i++, l = l) {
 				BMESH_ASSERT(l->e == oe);
 				edok = bmesh_verts_in_edge(l->v, l->next->v, oe);
 				BMESH_ASSERT(edok != FALSE);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-03-01 17:13:02 UTC (rev 44583)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-03-01 17:38:04 UTC (rev 44584)
@@ -248,46 +248,46 @@
 	if (source_slot == dest_slot)
 		return;
 
-	if (source_slot->slottype != dest_slot->slottype)
+	if (source_slot->slottype != dest_slot->slottype) {
+		/* possibly assert here? */
 		return;
-	
-	if (dest_slot->slottype > BMO_OP_SLOT_VEC) {
-		if (dest_slot->slottype != BMO_OP_SLOT_MAPPING) {
-			/* do buffer copy */
-			dest_slot->data.buf = NULL;
-			dest_slot->len = source_slot->len;
-			if (dest_slot->len) {
-				const int slot_alloc_size = BMO_OPSLOT_TYPEINFO[dest_slot->slottype] * dest_slot->len;
-				dest_slot->data.buf = BLI_memarena_alloc(dest_op->arena, slot_alloc_size);
-				memcpy(dest_slot->data.buf, source_slot->data.buf, slot_alloc_size);
-			}
+	}
+
+	if (dest_slot->slottype  == BMO_OP_SLOT_ELEMENT_BUF) {
+		/* do buffer copy */
+		dest_slot->data.buf = NULL;
+		dest_slot->len = source_slot->len;
+		if (dest_slot->len) {
+			const int slot_alloc_size = BMO_OPSLOT_TYPEINFO[dest_slot->slottype] * dest_slot->len;
+			dest_slot->data.buf = BLI_memarena_alloc(dest_op->arena, slot_alloc_size);
+			memcpy(dest_slot->data.buf, source_slot->data.buf, slot_alloc_size);
 		}
-		else {
-			GHashIterator it;
-			BMOElemMapping *srcmap, *dstmap;
+	}
+	else if (dest_slot->slottype  == BMO_OP_SLOT_MAPPING) {
+		GHashIterator it;
+		BMOElemMapping *srcmap, *dstmap;
 
-			/* sanity check */
-			if (!source_slot->data.ghash) {
-				return;
-			}
-			
-			if (!dest_slot->data.ghash) {
-				dest_slot->data.ghash = BLI_ghash_new(BLI_ghashutil_ptrhash,
-				                                      BLI_ghashutil_ptrcmp, "bmesh operator 2");
-			}
+		/* sanity check */
+		if (!source_slot->data.ghash) {
+			return;
+		}
 
-			BLI_ghashIterator_init(&it, source_slot->data.ghash);
-			for ( ; (srcmap = BLI_ghashIterator_getValue(&it));
-			      BLI_ghashIterator_step(&it))
-			{
-				dstmap = BLI_memarena_alloc(dest_op->arena, sizeof(*dstmap) + srcmap->len);
+		if (!dest_slot->data.ghash) {
+			dest_slot->data.ghash = BLI_ghash_new(BLI_ghashutil_ptrhash,
+												  BLI_ghashutil_ptrcmp, "bmesh operator 2");
+		}
 
-				dstmap->element = srcmap->element;
-				dstmap->len = srcmap->len;
-				memcpy(dstmap + 1, srcmap + 1, srcmap->len);
+		BLI_ghashIterator_init(&it, source_slot->data.ghash);
+		for ( ; (srcmap = BLI_ghashIterator_getValue(&it));
+			  BLI_ghashIterator_step(&it))
+		{
+			dstmap = BLI_memarena_alloc(dest_op->arena, sizeof(*dstmap) + srcmap->len);
 
-				BLI_ghash_insert(dest_slot->data.ghash, dstmap->element, dstmap);
-			}
+			dstmap->element = srcmap->element;
+			dstmap->len = srcmap->len;
+			memcpy(dstmap + 1, srcmap + 1, srcmap->len);
+
+			BLI_ghash_insert(dest_slot->data.ghash, dstmap->element, dstmap);
 		}
 	}
 	else {
@@ -504,13 +504,13 @@
 	}
 }
 
-int BMO_slot_buf_count(BMesh *UNUSED(bm), BMOperator *op, const char *slotname)
+int BMO_slot_buffer_count(BMesh *UNUSED(bm), BMOperator *op, const char *slotname)
 {
 	BMOpSlot *slot = BMO_slot_get(op, slotname);
-	BLI_assert(slot->slottype > BMO_OP_SLOT_VEC);
+	BLI_assert(slot->slottype == BMO_OP_SLOT_ELEMENT_BUF);
 	
 	/* check if its actually a buffer */
-	if (!(slot->slottype > BMO_OP_SLOT_VEC))
+	if (slot->slottype != BMO_OP_SLOT_ELEMENT_BUF)
 		return 0;
 
 	return slot->len;
@@ -553,14 +553,16 @@
 }
 
 #if 0
-void *BMO_Grow_Array(BMesh *bm, BMOperator *op, int slotcode, int totadd)
+void *bmo_slot_buffer_grow(BMesh *bm, BMOperator *op, int slotcode, int totadd)
 {
 	BMOpSlot *slot = &op->slots[slotcode];
 	void *tmp;
 	ssize_t allocsize;
 	
+	BLI_assert(slot->slottype == BMO_OP_SLOT_ELEMENT_BUF);
+
 	/* check if its actually a buffer */
-	if (!(slot->slottype > BMO_OP_SLOT_VEC))
+	if (slot->slottype != BMO_OP_SLOT_ELEMENT_BUF)
 		return NULL;
 
 	if (slot->flag & BMOS_DYNAMIC_ARRAY) {
@@ -616,11 +618,10 @@
 static void *bmo_slot_buffer_alloc(BMOperator *op, const char *slotname, int len)
 {
 	BMOpSlot *slot = BMO_slot_get(op, slotname);
+	BLI_assert(slot->slottype == BMO_OP_SLOT_ELEMENT_BUF);
 
-	BLI_assert(slot->slottype > BMO_OP_SLOT_VEC);
-
 	/* check if its actually a buffer */
-	if (!(slot->slottype > BMO_OP_SLOT_VEC))
+	if (slot->slottype != BMO_OP_SLOT_ELEMENT_BUF)
 		return NULL;
 	
 	slot->len = len;
@@ -634,7 +635,7 @@
  *
  * Copies all elements of a certain type into an operator slot.
  */
-static void BMO_slot_from_all(BMesh *bm, BMOperator *op, const char *slotname, const char htype)
+static void BMO_slot_buffer_from_all(BMesh *bm, BMOperator *op, const char *slotname, const char htype)
 {
 	BMIter elements;
 	BMHeader *e;
@@ -677,7 +678,7 @@
  * Copies elements of a certain type, which have a certain header flag set
  * into a slot for an operator.
  */
-void BMO_slot_from_hflag(BMesh *bm, BMOperator *op, const char *slotname,
+void BMO_slot_buffer_from_hflag(BMesh *bm, BMOperator *op, const char *slotname,
                          const char hflag, const char htype)
 {
 	BMIter elements;
@@ -685,7 +686,7 @@
 	BMOpSlot *output = BMO_slot_get(op, slotname);
 	int totelement = 0, i = 0;
 	
-	totelement = BM_mesh_count_flag(bm, htype, hflag, 1);
+	totelement = BM_mesh_count_flag(bm, htype, hflag, TRUE);
 
 	if (totelement) {
 		bmo_slot_buffer_alloc(op, slotname, totelement);
@@ -728,23 +729,27 @@
  * Copies elements of a certain type, which have a certain flag set
  * into an output slot for an operator.
  */
-void BMO_slot_from_flag(BMesh *bm, BMOperator *op, const char *slotname,
-                        const short oflag, const char htype)
+void BMO_slot_buffer_from_flag(BMesh *bm, BMOperator *op, const char *slotname,
+                               const short oflag, const char htype)
 {
 	BMIter elements;
-	BMHeader *ele;
-	BMOpSlot *output = BMO_slot_get(op, slotname);
+	BMOpSlot *slot = BMO_slot_get(op, slotname);
 	int totelement = BMO_mesh_flag_count(bm, oflag, htype), i = 0;
 
-	BLI_assert(output->slottype > BMO_OP_SLOT_VEC);
+	BLI_assert(slot->slottype == BMO_OP_SLOT_ELEMENT_BUF);
 
 	if (totelement) {
+		BMHeader *ele;
+		BMHeader **ele_array;
+
 		bmo_slot_buffer_alloc(op, slotname, totelement);
 
+		ele_array = (BMHeader **)slot->data.p;
+
 		if (htype & BM_VERT) {
 			for (ele = BM_iter_new(&elements, bm, BM_VERTS_OF_MESH, bm); ele; ele = BM_iter_step(&elements)) {
 				if (BMO_elem_flag_test(bm, (BMElemF *)ele, oflag)) {
-					((BMHeader **)output->data.p)[i] = ele;
+					ele_array[i] = ele;
 					i++;
 				}
 			}
@@ -753,7 +758,7 @@
 		if (htype & BM_EDGE) {
 			for (ele = BM_iter_new(&elements, bm, BM_EDGES_OF_MESH, bm); ele; ele = BM_iter_step(&elements)) {
 				if (BMO_elem_flag_test(bm, (BMElemF *)ele, oflag)) {
-					((BMHeader **)output->data.p)[i] = ele;
+					ele_array[i] = ele;
 					i++;
 				}
 			}
@@ -762,14 +767,14 @@
 		if (htype & BM_FACE) {
 			for (ele = BM_iter_new(&elements, bm, BM_FACES_OF_MESH, bm); ele; ele = BM_iter_step(&elements)) {
 				if (BMO_elem_flag_test(bm, (BMElemF *)ele, oflag)) {
-					((BMHeader **)output->data.p)[i] = ele;
+					ele_array[i] = ele;
 					i++;
 				}
 			}
 		}
 	}
 	else {
-		output->len = 0;
+		slot->len = 0;
 	}
 }
 
@@ -786,7 +791,7 @@
 	BMElem **data =  slot->data.p;
 	int i;
 
-	BLI_assert(slot->slottype > BMO_OP_SLOT_VEC);
+	BLI_assert(slot->slottype == BMO_OP_SLOT_ELEMENT_BUF);
 
 	if (!(hflag & BM_ELEM_SELECT)) {
 		do_flush_select = FALSE;
@@ -816,7 +821,7 @@
 	BMElem **data =  slot->data.p;
 	int i;
 
-	BLI_assert(slot->slottype > BMO_OP_SLOT_VEC);
+	BLI_assert(slot->slottype == BMO_OP_SLOT_ELEMENT_BUF);
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list