[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49096] trunk/blender/source/blender: add option so operators can be called with a flag, currently the only flag is to respect hidden geometry.

Campbell Barton ideasman42 at gmail.com
Sat Jul 21 02:58:03 CEST 2012


Revision: 49096
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49096
Author:   campbellbarton
Date:     2012-07-21 00:58:02 +0000 (Sat, 21 Jul 2012)
Log Message:
-----------
add option so operators can be called with a flag, currently the only flag is to respect hidden geometry.

this is useful for bmesh tools that operate in object mode or for modifiers which would previously use hidden faces in some cases.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh.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_bevel.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_extrude.c
    trunk/blender/source/blender/bmesh/operators/bmo_mesh_conv.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_removedoubles.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/editmesh_knife.c
    trunk/blender/source/blender/editors/mesh/editmesh_select.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/editmesh_utils.c
    trunk/blender/source/blender/modifiers/intern/MOD_array.c
    trunk/blender/source/blender/modifiers/intern/MOD_bevel.c
    trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c
    trunk/blender/source/blender/modifiers/intern/MOD_skin.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_ops.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c	2012-07-20 23:20:43 UTC (rev 49095)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c	2012-07-21 00:58:02 UTC (rev 49096)
@@ -318,7 +318,7 @@
 		return;
 	}
 	
-	BMO_op_initf(bm, &bmop, "recalc_face_normals faces=%af do_flip=%b", FALSE);
+	BMO_op_initf(bm, &bmop, BMO_FLAG_DEFAULTS, "recalc_face_normals faces=%af do_flip=%b", FALSE);
 	
 	BMO_push(bm, &bmop);
 	bmo_recalc_face_normals_exec(bm, &bmop);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h	2012-07-20 23:20:43 UTC (rev 49095)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h	2012-07-21 00:58:02 UTC (rev 49096)
@@ -135,13 +135,19 @@
 typedef struct BMOperator {
 	int type;
 	int slot_type;
-	int needflag;
-	int flag;
+	int type_flag;
+	int flag;  /* runtime options */
 	struct BMOpSlot slot_args[BMO_OP_MAX_SLOTS];
 	void (*exec)(BMesh *bm, struct BMOperator *op);
 	struct MemArena *arena;
 } BMOperator;
 
+enum {
+	BMO_FLAG_RESPECT_HIDE = 1,
+};
+
+#define BMO_FLAG_DEFAULTS  BMO_FLAG_RESPECT_HIDE
+
 #define MAX_SLOTNAME	32
 
 typedef struct BMOSlotType {
@@ -153,7 +159,7 @@
 	const char *name;
 	BMOSlotType slot_types[BMO_OP_MAX_SLOTS];
 	void (*exec)(BMesh *bm, BMOperator *op);
-	int flag;
+	int type_flag;
 } BMOpDefine;
 
 /* BMOpDefine->flag */
@@ -171,7 +177,7 @@
  * have it set directly.  and never use BMO_slot_ptr_set to
  * pass in a list of edges or any arrays, really.*/
 
-void BMO_op_init(BMesh *bm, BMOperator *op, const char *opname);
+void BMO_op_init(BMesh *bm, BMOperator *op, const int flag, const char *opname);
 
 /* executes an operator, pushing and popping a new tool flag
  * layer as appropriate.*/
@@ -194,7 +200,7 @@
  * this system is used to execute or initialize an operator,
  * using a formatted-string system.
  *
- * for example, BMO_op_callf(bm, "delete geom=%hf context=%i", BM_ELEM_SELECT, DEL_FACES);
+ * for example, BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "delete geom=%hf context=%i", BM_ELEM_SELECT, DEL_FACES);
  * . . .will execute the delete operator, feeding in selected faces, deleting them.
  *
  * the basic format for the format string is:
@@ -231,16 +237,16 @@
 void BMO_pop(BMesh *bm);
 
 /*executes an operator*/
-int BMO_op_callf(BMesh *bm, const char *fmt, ...);
+int BMO_op_callf(BMesh *bm, const int flag, const char *fmt, ...);
 
 /* initializes, but doesn't execute an operator.  this is so you can
  * gain access to the outputs of the operator.  note that you have
  * to execute/finish (BMO_op_exec and BMO_op_finish) yourself. */
-int BMO_op_initf(BMesh *bm, BMOperator *op, const char *fmt, ...);
+int BMO_op_initf(BMesh *bm, BMOperator *op, const int flag, const char *fmt, ...);
 
 /* va_list version, used to implement the above two functions,
  * plus EDBM_op_callf in editmesh_utils.c. */
-int BMO_op_vinitf(BMesh *bm, BMOperator *op, const char *fmt, va_list vlist);
+int BMO_op_vinitf(BMesh *bm, BMOperator *op, const int flag, const char *fmt, va_list vlist);
 
 /* test whether a named slot exists */
 int BMO_slot_exists(BMOperator *op, const char *slot_name);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-07-20 23:20:43 UTC (rev 49095)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-07-21 00:58:02 UTC (rev 49096)
@@ -126,7 +126,7 @@
  *
  * Initializes an operator structure to a certain type
  */
-void BMO_op_init(BMesh *bm, BMOperator *op, const char *opname)
+void BMO_op_init(BMesh *bm, BMOperator *op, const int flag, const char *opname)
 {
 	int i, opcode = bmo_opname_to_opcode(opname);
 
@@ -142,7 +142,8 @@
 
 	memset(op, 0, sizeof(BMOperator));
 	op->type = opcode;
-	op->flag = opdefines[opcode]->flag;
+	op->type_flag = opdefines[opcode]->type_flag;
+	op->flag = flag;
 	
 	/* initialize the operator slot types */
 	for (i = 0; opdefines[opcode]->slot_types[i].type; i++) {
@@ -697,13 +698,14 @@
 {
 	BMOpSlot *output = BMO_slot_get(op, slot_name);
 	int totelement = 0, i = 0;
+	const int respecthide = (op->flag & BMO_FLAG_RESPECT_HIDE) != 0;
 
 	BLI_assert(ELEM(test_for_enabled, TRUE, FALSE));
 
 	if (test_for_enabled)
-		totelement = BM_mesh_elem_hflag_count_enabled(bm, htype, hflag, TRUE);
+		totelement = BM_mesh_elem_hflag_count_enabled(bm, htype, hflag, respecthide);
 	else
-		totelement = BM_mesh_elem_hflag_count_disabled(bm, htype, hflag, TRUE);
+		totelement = BM_mesh_elem_hflag_count_disabled(bm, htype, hflag, respecthide);
 
 	if (totelement) {
 		BMIter iter;
@@ -715,7 +717,7 @@
 
 		if (htype & BM_VERT) {
 			BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
-				if (!BM_elem_flag_test(ele, BM_ELEM_HIDDEN) &&
+				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;
@@ -726,7 +728,7 @@
 
 		if (htype & BM_EDGE) {
 			BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
-				if (!BM_elem_flag_test(ele, BM_ELEM_HIDDEN) &&
+				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;
@@ -737,7 +739,7 @@
 
 		if (htype & BM_FACE) {
 			BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
-				if (!BM_elem_flag_test(ele, BM_ELEM_HIDDEN) &&
+				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;
@@ -1320,7 +1322,7 @@
 }
 
 /* Example:
- * BMO_op_callf(bm, "delete %i %hv", DEL_ONLYFACES, BM_ELEM_SELECT);
+ * BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "delete %i %hv", DEL_ONLYFACES, BM_ELEM_SELECT);
  *
  *  i - int
  *  b - boolean (same as int but 1/0 only)
@@ -1336,7 +1338,7 @@
  * Hv, He, Hf, Fv, Fe, Ff,
  */
 
-int BMO_op_vinitf(BMesh *bm, BMOperator *op, const char *_fmt, va_list vlist)
+int BMO_op_vinitf(BMesh *bm, BMOperator *op, const int flag, const char *_fmt, va_list vlist)
 {
 	BMOpDefine *def;
 	char *opname, *ofmt, *fmt;
@@ -1376,7 +1378,7 @@
 		return FALSE;
 	}
 
-	BMO_op_init(bm, op, opname);
+	BMO_op_init(bm, op, flag, opname);
 	def = opdefines[i];
 	
 	i = 0;
@@ -1556,12 +1558,12 @@
 }
 
 
-int BMO_op_initf(BMesh *bm, BMOperator *op, const char *fmt, ...)
+int BMO_op_initf(BMesh *bm, BMOperator *op, const int flag, const char *fmt, ...)
 {
 	va_list list;
 
 	va_start(list, fmt);
-	if (!BMO_op_vinitf(bm, op, fmt, list)) {
+	if (!BMO_op_vinitf(bm, op, flag, fmt, list)) {
 		printf("%s: failed\n", __func__);
 		va_end(list);
 		return FALSE;
@@ -1571,13 +1573,13 @@
 	return TRUE;
 }
 
-int BMO_op_callf(BMesh *bm, const char *fmt, ...)
+int BMO_op_callf(BMesh *bm, const int flag, const char *fmt, ...)
 {
 	va_list list;
 	BMOperator op;
 
 	va_start(list, fmt);
-	if (!BMO_op_vinitf(bm, &op, fmt, list)) {
+	if (!BMO_op_vinitf(bm, &op, flag, fmt, list)) {
 		printf("%s: failed, format is:\n    \"%s\"\n", __func__, fmt);
 		va_end(list);
 		return FALSE;

Modified: trunk/blender/source/blender/bmesh/operators/bmo_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_bevel.c	2012-07-20 23:20:43 UTC (rev 49095)
+++ trunk/blender/source/blender/bmesh/operators/bmo_bevel.c	2012-07-21 00:58:02 UTC (rev 49096)
@@ -865,7 +865,7 @@
 	}
 #endif
 
-	BMO_op_callf(bm, "delete geom=%fv context=%i", BEVEL_DEL, DEL_VERTS);
+	BMO_op_callf(bm, op->flag, "delete geom=%fv context=%i", BEVEL_DEL, DEL_VERTS);
 
 	/* clean up any edges that might not get properly delete */
 	BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
@@ -873,8 +873,8 @@
 			BMO_elem_flag_enable(bm, e, BEVEL_DEL);
 	}
 
-	BMO_op_callf(bm, "delete geom=%fe context=%i", BEVEL_DEL, DEL_EDGES);
-	BMO_op_callf(bm, "delete geom=%ff context=%i", BEVEL_DEL, DEL_FACES);
+	BMO_op_callf(bm, op->flag, "delete geom=%fe context=%i", BEVEL_DEL, DEL_EDGES);
+	BMO_op_callf(bm, op->flag, "delete geom=%ff context=%i", BEVEL_DEL, DEL_FACES);
 	
 	BLI_smallhash_release(&hash);
 	BLI_array_free(tags);

Modified: trunk/blender/source/blender/bmesh/operators/bmo_create.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_create.c	2012-07-20 23:20:43 UTC (rev 49095)
+++ trunk/blender/source/blender/bmesh/operators/bmo_create.c	2012-07-21 00:58:02 UTC (rev 49096)
@@ -1365,12 +1365,12 @@
 
 	/* call edgenet create */
 	/* call edgenet prepare op so additional face creation cases wore */
-	BMO_op_initf(bm, &op2, "edgenet_prepare edges=%fe", ELE_NEW);
+	BMO_op_initf(bm, &op2, op->flag, "edgenet_prepare edges=%fe", ELE_NEW);
 	BMO_op_exec(bm, &op2);
 	BMO_slot_buffer_flag_enable(bm, &op2, "edgeout", BM_EDGE, ELE_NEW);
 	BMO_op_finish(bm, &op2);
 
-	BMO_op_initf(bm, &op2,
+	BMO_op_initf(bm, &op2, op->flag,
 	             "edgenet_fill edges=%fe use_fill_check=%b mat_nr=%i use_smooth=%b",
 	             ELE_NEW, TRUE, mat_nr, use_smooth);
 
@@ -1386,7 +1386,7 @@
 	BMO_op_finish(bm, &op2);
 	
 	/* now call dissolve face */
-	BMO_op_initf(bm, &op2, "dissolve_faces faces=%ff", ELE_NEW);
+	BMO_op_initf(bm, &op2, op->flag, "dissolve_faces faces=%ff", ELE_NEW);
 	BMO_op_exec(bm, &op2);
 	
 	/* if we dissolved anything, then return */

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-07-20 23:20:43 UTC (rev 49095)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-07-21 00:58:02 UTC (rev 49096)
@@ -164,7 +164,7 @@
 
 	}
 
-	BMO_op_callf(bm, "delete geom=%ff context=%i", FACE_ORIG, DEL_FACES);
+	BMO_op_callf(bm, op->flag, "delete geom=%ff context=%i", FACE_ORIG, DEL_FACES);
 
 
 	if (use_verts) {
@@ -383,7 +383,7 @@
 		}
 	}
 
-	BMO_op_callf(bm, "dissolve_faces faces=%ff", FACE_MARK);
+	BMO_op_callf(bm, op->flag, "dissolve_faces faces=%ff", FACE_MARK);
 	if (BMO_error_occurred(bm)) {
 		const char *msg;
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dupe.c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list