[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55834] trunk/blender/source/blender: add relative offset option for poke tool.

Campbell Barton ideasman42 at gmail.com
Sat Apr 6 05:03:39 CEST 2013


Revision: 55834
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55834
Author:   campbellbarton
Date:     2013-04-06 03:03:37 +0000 (Sat, 06 Apr 2013)
Log Message:
-----------
add relative offset option for poke tool.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    trunk/blender/source/blender/bmesh/operators/bmo_poke.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2013-04-06 02:45:43 UTC (rev 55833)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2013-04-06 03:03:37 UTC (rev 55834)
@@ -1581,7 +1581,8 @@
 	/* slots_in */
 	{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},   /* input faces */
 	 {"offset", BMO_OP_SLOT_FLT}, /* center vertex offset along normal */
-	{"center_mode", BMO_OP_SLOT_INT}, /* calculation mode for center vertex */
+	 {"center_mode", BMO_OP_SLOT_INT}, /* calculation mode for center vertex */
+	 {"use_relative_offset", BMO_OP_SLOT_BOOL}, /* apply offset */
 	 {{'\0'}},
 	},
 	/* slots_out */

Modified: trunk/blender/source/blender/bmesh/operators/bmo_poke.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_poke.c	2013-04-06 02:45:43 UTC (rev 55833)
+++ trunk/blender/source/blender/bmesh/operators/bmo_poke.c	2013-04-06 03:03:37 UTC (rev 55834)
@@ -52,8 +52,8 @@
 	BMFace *f;
 
 	const float offset = BMO_slot_float_get(op->slots_in, "offset");
+	const bool use_relative_offset = BMO_slot_bool_get(op->slots_in,  "use_relative_offset");
 	const int center_mode = BMO_slot_int_get(op->slots_in, "center_mode");
-
 	void (*bm_face_calc_center_fn)(BMFace *f, float r_cent[3]);
 
 	switch (center_mode) {
@@ -80,6 +80,9 @@
 		 * then copy to all others in the fan */
 		BMLoop *l_center_example;
 
+		/* 1.0 or the average length from the center to the face verts */
+		float offset_fac;
+
 		int i;
 
 		bm_face_calc_center_fn(f, f_center);
@@ -89,6 +92,13 @@
 		/* handled by BM_loop_interp_from_face */
 		// BM_vert_interp_from_face(bm, v_center, f);
 
+		if (use_relative_offset) {
+			offset_fac = 0.0f;
+		}
+		else {
+			offset_fac = 1.0f;
+		}
+
 		i = 0;
 		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
 		do {
@@ -110,10 +120,20 @@
 			BM_elem_attrs_copy(bm, bm, l_iter->next, l_new->next);
 
 			BMO_elem_flag_enable(bm, f_new, ELE_NEW);
+
+			if (use_relative_offset) {
+				offset_fac += len_v3v3(f_center, l_iter->v->co);
+			}
+
 		} while (i++, (l_iter = l_iter->next) != l_first);
 
+		if (use_relative_offset) {
+			offset_fac /= (float)f->len;
+		}
+		/* else remain at 1.0 */
+
 		copy_v3_v3(v_center->no, f->no);
-		madd_v3_v3fl(v_center->co, v_center->no, offset);
+		madd_v3_v3fl(v_center->co, v_center->no, offset * offset_fac);
 
 		/* Kill Face */
 		BM_face_kill(bm, f);

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-04-06 02:45:43 UTC (rev 55833)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-04-06 03:03:37 UTC (rev 55834)
@@ -2641,9 +2641,11 @@
 	BMOperator bmop;
 
 	const float offset = RNA_float_get(op->ptr, "offset");
+	const bool use_relative_offset = RNA_boolean_get(op->ptr, "use_relative_offset");
 	const int center_mode = RNA_enum_get(op->ptr, "center_mode");
 
-	EDBM_op_init(em, &bmop, op, "poke faces=%hf offset=%f center_mode=%i", BM_ELEM_SELECT, offset, center_mode);
+	EDBM_op_init(em, &bmop, op, "poke faces=%hf offset=%f use_relative_offset=%b center_mode=%i",
+	             BM_ELEM_SELECT, offset, use_relative_offset, center_mode);
 	BMO_op_exec(em->bm, &bmop);
 
 	EDBM_flag_disable_all(em, BM_ELEM_SELECT);
@@ -2662,6 +2664,34 @@
 	return OPERATOR_FINISHED;
 
 }
+
+void MESH_OT_poke(wmOperatorType *ot)
+{
+
+	static EnumPropertyItem poke_center_modes[] = {
+		{BMOP_POKE_MEAN_WEIGHTED, "MEAN_WEIGHTED", 0, "Weighted Mean", "Weighted Mean Face Center"},
+		{BMOP_POKE_MEAN, "MEAN", 0, "Mean", "Mean Face Center"},
+		{BMOP_POKE_BOUNDS, "BOUNDS", 0, "Bounds", "Face Bounds Center"},
+		{0, NULL, 0, NULL, NULL}};
+
+
+	/* identifiers */
+	ot->name = "Poke Faces";
+	ot->idname = "MESH_OT_poke";
+	ot->description = "Splits a face into a fan";
+
+	/* api callbacks */
+	ot->exec = edbm_poke_face_exec;
+	ot->poll = ED_operator_editmesh;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+	RNA_def_float(ot->srna, "offset", 0.0f, -FLT_MAX, FLT_MAX, "Poke Offset", "Poke Offset", -1.0f, 1.0f);
+	RNA_def_boolean(ot->srna, "use_relative_offset", false, "Offset Relative", "Scale the offset by surrounding geometry");
+	RNA_def_enum(ot->srna, "center_mode", poke_center_modes, BMOP_POKE_MEAN_WEIGHTED, "Poke Center", "Poke Face Center Calculation");
+}
+
 /********************** Quad/Tri Operators *************************/
 
 static int edbm_quads_convert_to_tris_exec(bContext *C, wmOperator *op)
@@ -2690,32 +2720,7 @@
 	return OPERATOR_FINISHED;
 }
 
-void MESH_OT_poke(wmOperatorType *ot)
-{
 
-	static EnumPropertyItem poke_center_modes[] = {
-		{BMOP_POKE_MEAN_WEIGHTED, "MEAN_WEIGHTED", 0, "Weighted Mean", "Weighted Mean Face Center"},
-		{BMOP_POKE_MEAN, "MEAN", 0, "Mean", "Mean Face Center"},
-		{BMOP_POKE_BOUNDS, "BOUNDS", 0, "Bounds", "Face Bounds Center"},
-		{0, NULL, 0, NULL, NULL}};
-
-
-	/* identifiers */
-	ot->name = "Poke Faces";
-	ot->idname = "MESH_OT_poke";
-	ot->description = "Splits a face into a fan";
-
-	/* api callbacks */
-	ot->exec = edbm_poke_face_exec;
-	ot->poll = ED_operator_editmesh;
-
-	/* flags */
-	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
-	RNA_def_float(ot->srna, "offset", 0.0f, -FLT_MAX, FLT_MAX, "Poke Offset", "Poke Offset", -1.0f, 1.0f);
-	RNA_def_enum(ot->srna, "center_mode", poke_center_modes, BMOP_POKE_MEAN_WEIGHTED, "Poke Center", "Poke Face Center Calculation");
-}
-
 void MESH_OT_quads_convert_to_tris(wmOperatorType *ot)
 {
 	/* identifiers */




More information about the Bf-blender-cvs mailing list