[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52596] trunk/blender/source/blender: py/ bmesh api - add support for single item buffers ( odd feature but used quite a bit with bmesh operators).

Campbell Barton ideasman42 at gmail.com
Tue Nov 27 10:21:59 CET 2012


Revision: 52596
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52596
Author:   campbellbarton
Date:     2012-11-27 09:21:57 +0000 (Tue, 27 Nov 2012)
Log Message:
-----------
py/bmesh api - add support for single item buffers (odd feature but used quite a bit with bmesh operators).
also add utility functions BMO_slot_buffer_from_single(), BMO_slot_buffer_get_single()

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    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_removedoubles.c
    trunk/blender/source/blender/bmesh/operators/bmo_slide.c
    trunk/blender/source/blender/bmesh/operators/bmo_utils.c
    trunk/blender/source/blender/editors/mesh/editmesh_slide.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_ops.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-11-27 08:19:34 UTC (rev 52595)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-11-27 09:21:57 UTC (rev 52596)
@@ -1546,7 +1546,7 @@
 	"slide_vert",
 	/* slots_in */
 	{{"vert", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BMO_OP_SLOT_SUBTYPE_ELEM_IS_SINGLE}},
-	 {"edge", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE | BMO_OP_SLOT_SUBTYPE_ELEM_IS_SINGLE}},
+	 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
 	 {"distance_t", BMO_OP_SLOT_FLT},
 	 {{'\0'}},
 	},

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h	2012-11-27 08:19:34 UTC (rev 52595)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h	2012-11-27 09:21:57 UTC (rev 52596)
@@ -417,6 +417,10 @@
                                          BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name,
                                          const char htype, const char hflag);
 
+void  BMO_slot_buffer_from_single(BMOperator *op, BMOpSlot *slot, BMHeader *ele);
+void *BMO_slot_buffer_get_single(BMOpSlot *slot);
+
+
 /* counts number of elements inside a slot array. */
 int BMO_slot_buffer_count(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name);
 int BMO_slot_map_count(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-11-27 08:19:34 UTC (rev 52595)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-11-27 09:21:57 UTC (rev 52596)
@@ -867,6 +867,29 @@
 	bmo_slot_buffer_from_hflag(bm, op, slot_args, slot_name, htype, hflag, FALSE);
 }
 
+void BMO_slot_buffer_from_single(BMOperator *op, BMOpSlot *slot, BMHeader *ele)
+{
+	BMO_ASSERT_SLOT_IN_OP(slot, op);
+	BLI_assert(slot->slot_type == BMO_OP_SLOT_ELEMENT_BUF);
+	BLI_assert(slot->slot_subtype.elem & BMO_OP_SLOT_SUBTYPE_ELEM_IS_SINGLE);
+	BLI_assert(slot->len == 0 || slot->len == 1);
+
+	BLI_assert(slot->slot_subtype.elem & ele->htype);
+
+	slot->data.buf = BLI_memarena_alloc(op->arena, sizeof(void *) * 4);  /* XXX, why 'x4' ? */
+	slot->len = 1;
+	*slot->data.buf = ele;
+}
+
+void *BMO_slot_buffer_get_single(BMOpSlot *slot)
+{
+	BLI_assert(slot->slot_type == BMO_OP_SLOT_ELEMENT_BUF);
+	BLI_assert(slot->slot_subtype.elem & BMO_OP_SLOT_SUBTYPE_ELEM_IS_SINGLE);
+	BLI_assert(slot->len == 0 || slot->len == 1);
+
+	return slot->len ? (BMHeader *)slot->data.buf[0] : NULL;
+}
+
 /**
  * Copies the values from another slot to the end of the output slot.
  */
@@ -1580,12 +1603,11 @@
 				}
 				case 'e':
 				{
+					/* XXX we have 'e' but no equivalent for verts/faces - why? we could use (V/E/P)*/
 					BMHeader *ele = va_arg(vlist, void *);
 					BMOpSlot *slot = BMO_slot_get(op->slots_in, slot_name);
 
-					slot->data.buf = BLI_memarena_alloc(op->arena, sizeof(void *) * 4);
-					slot->len = 1;
-					*slot->data.buf = ele;
+					BMO_slot_buffer_from_single(op, slot, ele);
 
 					state = 1;
 					break;

Modified: trunk/blender/source/blender/bmesh/operators/bmo_removedoubles.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_removedoubles.c	2012-11-27 08:19:34 UTC (rev 52595)
+++ trunk/blender/source/blender/bmesh/operators/bmo_removedoubles.c	2012-11-27 09:21:57 UTC (rev 52596)
@@ -263,7 +263,7 @@
 	float fac;
 	int i, tot;
 
-	snapv = BMO_iter_new(&siter, op->slots_in, "snapv", BM_VERT);
+	snapv = BMO_slot_buffer_get_single(BMO_slot_get(op->slots_in, "snapv"));
 	tot = BM_vert_face_count(snapv);
 
 	if (!tot)

Modified: trunk/blender/source/blender/bmesh/operators/bmo_slide.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_slide.c	2012-11-27 08:19:34 UTC (rev 52595)
+++ trunk/blender/source/blender/bmesh/operators/bmo_slide.c	2012-11-27 09:21:57 UTC (rev 52596)
@@ -56,9 +56,8 @@
 	const float distance_t = BMO_slot_float_get(op->slots_in, "distance_t");
 
 	/* Get start vertex */
-	vertex = BMO_iter_new(&oiter, op->slots_in, "vert", BM_VERT);
+	vertex = BMO_slot_buffer_get_single(BMO_slot_get(op->slots_in, "vert"));
 
-
 	if (!vertex) {
 		if (G.debug & G_DEBUG) {
 			fprintf(stderr, "slide_vert: No vertex selected...");
@@ -67,15 +66,13 @@
 		return;
 	}
 
+	/* BMESH_TODO - this is odd, it only uses one edge, why take a list at all? */
 	/* Count selected edges */
-	BMO_ITER (h, &oiter, op->slots_in, "edge", BM_VERT | BM_EDGE) {
-		switch (h->htype) {
-			case BM_EDGE:
-				selected_edges++;
-				/* Mark all selected edges (cast BMHeader->BMEdge) */
-				BMO_elem_flag_enable(bm, (BMElemF *)h, EDGE_MARK);
-				break;
-		}
+	BMO_ITER (h, &oiter, op->slots_in, "edges", BM_EDGE) {
+		selected_edges++;
+		/* Mark all selected edges (cast BMHeader->BMEdge) */
+		BMO_elem_flag_enable(bm, (BMElemF *)h, EDGE_MARK);
+		break;
 	}
 
 	/* Only allow sliding if an edge is selected */

Modified: trunk/blender/source/blender/bmesh/operators/bmo_utils.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2012-11-27 08:19:34 UTC (rev 52595)
+++ trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2012-11-27 09:21:57 UTC (rev 52596)
@@ -701,9 +701,8 @@
 
 void bmo_shortest_path_exec(BMesh *bm, BMOperator *op)
 {
-	BMOIter vs_iter /* , vs2_iter */;	/* selected verts iterator */
 	BMIter v_iter;		/* mesh verts iterator */
-	BMVert *vs, *sv, *ev;	/* starting vertex, ending vertex */
+	BMVert *sv, *ev;	/* starting vertex, ending vertex */
 	BMVert *v;		/* mesh vertex */
 	Heap *h = NULL;
 
@@ -712,13 +711,8 @@
 	int num_total = 0 /*, num_sels = 0 */, i = 0;
 	const int type = BMO_slot_int_get(op->slots_in, "type");
 
-	/* BMESH_TODO use BMO_slot_buffer_elem_first here? */
-	BMO_ITER (vs, &vs_iter, op->slots_in, "startv", BM_VERT) {
-		sv = vs;
-	}
-	BMO_ITER (vs, &vs_iter, op->slots_in, "endv", BM_VERT) {
-		ev = vs;
-	}
+	sv = BMO_slot_buffer_get_single(BMO_slot_get(op->slots_in, "startv"));
+	ev = BMO_slot_buffer_get_single(BMO_slot_get(op->slots_in, "endv"));
 
 	num_total = BM_mesh_elem_count(bm, BM_VERT);
 

Modified: trunk/blender/source/blender/editors/mesh/editmesh_slide.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_slide.c	2012-11-27 08:19:34 UTC (rev 52595)
+++ trunk/blender/source/blender/editors/mesh/editmesh_slide.c	2012-11-27 09:21:57 UTC (rev 52596)
@@ -729,7 +729,7 @@
 
 	/* Prepare operator */
 	if (!EDBM_op_init(em, &bmop, op,
-	                  "slide_vert vert=%e edge=%hev distance_t=%f",
+	                  "slide_vert vert=%e edges=%he distance_t=%f",
 	                  start_vert, BM_ELEM_SELECT, distance_t))
 	{
 		return OPERATOR_CANCELLED;
@@ -738,10 +738,10 @@
 	BMO_op_exec(bm, &bmop);
 
 	/* Deselect the input edges */
-	BMO_slot_buffer_hflag_disable(bm, bmop.slots_in, "edge", BM_ALL_NOLOOP, BM_ELEM_SELECT, TRUE);
+	BMO_slot_buffer_hflag_disable(bm, bmop.slots_in, "edges", BM_EDGE, BM_ELEM_SELECT, TRUE);
 
 	/* Select the output vert */
-	BMO_slot_buffer_hflag_enable(bm, bmop.slots_out, "verts.out", BM_ALL_NOLOOP, BM_ELEM_SELECT, TRUE);
+	BMO_slot_buffer_hflag_enable(bm, bmop.slots_out, "verts.out", BM_VERT, BM_ELEM_SELECT, TRUE);
 
 	/* Flush the select buffers */
 	EDBM_selectmode_flush(em);

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_ops.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_ops.c	2012-11-27 08:19:34 UTC (rev 52595)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_ops.c	2012-11-27 09:21:57 UTC (rev 52596)
@@ -224,16 +224,37 @@
 				}
 				case BMO_OP_SLOT_ELEMENT_BUF:
 				{
-					/* there are many ways we could interpret arguments, for now...
-					 * - verts/edges/faces from the mesh direct,
-					 *   this way the operator takes every item.
-					 * - `TODO` a plain python sequence (list) of elements.
-					 * - `TODO`  an iterator. eg.
-					 *   face.verts
-					 * - `TODO`  (type, flag) pair, eg.
-					 *   ('VERT', {'TAG'})
-					 */
+					if (slot->slot_subtype.elem & BMO_OP_SLOT_SUBTYPE_ELEM_IS_SINGLE) {
+						if (!BPy_BMElem_Check(value) ||
+						    !(((BPy_BMElem *)value)->ele->head.htype & slot->slot_subtype.elem))
+						{
+							PyErr_Format(PyExc_TypeError,
+							             "%.200s: keyword \"%.200s\" expected a %.200s not *.200s",
+							             self->opname, slot_name,
+							             BPy_BMElem_StringFromHType(slot->slot_subtype.elem & BM_ALL_NOLOOP),
+							             Py_TYPE(value)->tp_name);
+							return NULL;
+						}
+						else if (((BPy_BMElem *)value)->bm == NULL) {
+							PyErr_Format(PyExc_TypeError,
+							             "%.200s: keyword \"%.200s\" invalidated element",
+							             self->opname, slot_name);
+							return NULL;
+						}
 
+						BMO_slot_buffer_from_single(&bmop, slot, &((BPy_BMElem *)value)->ele->head);
+					}
+					else {
+						/* there are many ways we could interpret arguments, for now...
+						 * - verts/edges/faces from the mesh direct,
+						 *   this way the operator takes every item.
+						 * - `TODO` a plain python sequence (list) of elements.
+						 * - `TODO`  an iterator. eg.
+						 *   face.verts
+						 * - `TODO`  (type, flag) pair, eg.
+						 *   ('VERT', {'TAG'})
+						 */
+
 #define BPY_BM_GENERIC_MESH_TEST(type_string)  \
 	if (((BPy_BMGeneric *)value)->bm != bm) {                                             \
 	    PyErr_Format(PyExc_NotImplementedError,                                           \
@@ -248,76 +269,76 @@
 	                 "%.200s: keyword \"%.200s\" expected " \
 	                 "a list of %.200s not " type_string, \
 	                 self->opname, slot_name, \
-	                 BPy_BMElem_StringFromHType(slot->slot_subtype.elem & BM_ALL)); \
+	                 BPy_BMElem_StringFromHType(slot->slot_subtype.elem & BM_ALL_NOLOOP)); \
 	    return NULL; \
 	} (void)0
 
-					if (BPy_BMVertSeq_Check(value)) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list