[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55866] trunk/blender/source/blender: mesh inset tool - option to interpolate UV's vcols etc, on by default since this is almost always what you'd want.

Campbell Barton ideasman42 at gmail.com
Sun Apr 7 07:13:01 CEST 2013


Revision: 55866
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55866
Author:   campbellbarton
Date:     2013-04-07 05:13:00 +0000 (Sun, 07 Apr 2013)
Log Message:
-----------
mesh inset tool - option to interpolate UV's vcols etc, on by default since this is almost always what you'd want.
currently only working for inset-individual, inset-region coming next.

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

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2013-04-07 03:24:30 UTC (rev 55865)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2013-04-07 05:13:00 UTC (rev 55866)
@@ -1511,6 +1511,7 @@
 	 {"thickness", BMO_OP_SLOT_FLT},
 	 {"depth", BMO_OP_SLOT_FLT},
 	 {"use_even_offset", BMO_OP_SLOT_BOOL},
+	 {"use_interpolate", BMO_OP_SLOT_BOOL},
 	 {{'\0'}},
 	},
 	/* slots_out */

Modified: trunk/blender/source/blender/bmesh/operators/bmo_inset.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_inset.c	2013-04-07 03:24:30 UTC (rev 55865)
+++ trunk/blender/source/blender/bmesh/operators/bmo_inset.c	2013-04-07 05:13:00 UTC (rev 55866)
@@ -74,6 +74,7 @@
 	const float thickness = BMO_slot_float_get(op->slots_in, "thickness");
 	const float depth = BMO_slot_float_get(op->slots_in, "depth");
 	const bool use_even_offset = BMO_slot_bool_get(op->slots_in, "use_even_offset");
+	const bool use_interpolate = BMO_slot_bool_get(op->slots_in, "use_interpolate");
 
 	/* Only tag faces in slot */
 	BM_mesh_elem_hflag_disable_all(bm, BM_FACE, BM_ELEM_TAG, false);
@@ -81,6 +82,7 @@
 	BMO_slot_buffer_hflag_enable(bm, op->slots_in, "faces", BM_FACE, BM_ELEM_TAG, false);
 
 	BMO_ITER(f, &oiter, op->slots_in, "faces", BM_FACE) {
+		BMFace *f_new_inner;
 		BMLoop *l_iter, *l_first;
 		BMLoop *l_iter_inner = NULL;
 		int i;
@@ -152,20 +154,26 @@
 			copy_v3_v3(eiinfo_arr[index].e_new->v1->co, v_new_co);
 		} while ((l_iter = l_iter->next) != l_first);
 
-		{
-			BMFace *f_new_inner;
-			/* Create New Inset Faces */
-			f_new_inner = BM_face_create(bm, f_verts, f_edges, f->len, 0);
-			BLI_assert(f_new_inner != NULL);  /* no reason it should fail */
 
-			/* Copy Face Data */
-			BM_elem_attrs_copy(bm, bm, f, f_new_inner);
-			// Don't tag, gives more useful inner/outer select option
-			// BMO_elem_flag_enable(bm, f_new_inner, ELE_NEW);
+		/* Create New Inset Faces */
+		f_new_inner = BM_face_create(bm, f_verts, f_edges, f->len, 0);
+		BLI_assert(f_new_inner != NULL);  /* no reason it should fail */
 
-			l_iter_inner = BM_FACE_FIRST_LOOP(f_new_inner);
+
+		// Don't tag, gives more useful inner/outer select option
+		// BMO_elem_flag_enable(bm, f_new_inner, ELE_NEW);
+
+
+		/* Copy Face Data */
+		/* interpolate loop data or just stretch */
+		if (use_interpolate) {
+			BM_face_interp_from_face(bm, f_new_inner, f);
 		}
+		else {
+			BM_elem_attrs_copy(bm, bm, f, f_new_inner);
+		}
 
+		l_iter_inner = BM_FACE_FIRST_LOOP(f_new_inner);
 		l_iter = l_first;
 		do {
 			BMFace *f_new_outer;
@@ -173,7 +181,9 @@
 			BMLoop *l_a;
 			BMLoop *l_b;
 
-			BM_elem_attrs_copy(bm, bm, l_iter, l_iter_inner);
+			if (use_interpolate == false) {
+				BM_elem_attrs_copy(bm, bm, l_iter, l_iter_inner);
+			}
 
 			f_new_outer = BM_face_create_quad_tri(bm,
 			                                      l_iter->v,
@@ -203,8 +213,8 @@
 
 			/* This loop should always have >1 radials
 			 * (associated edge connects new and old face) */
-			BM_elem_attrs_copy(bm, bm, l_iter, l_b);
-			BM_elem_attrs_copy(bm, bm, l_iter->next, l_a);
+			BM_elem_attrs_copy(bm, bm, l_iter_inner, l_b);
+			BM_elem_attrs_copy(bm, bm, use_interpolate ? l_iter_inner->next : l_iter->next, l_a);
 
 		} while ((l_iter_inner = l_iter_inner->next),
 		         (l_iter = l_iter->next) != l_first);

Modified: trunk/blender/source/blender/editors/mesh/editmesh_inset.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_inset.c	2013-04-07 03:24:30 UTC (rev 55865)
+++ trunk/blender/source/blender/editors/mesh/editmesh_inset.c	2013-04-07 05:13:00 UTC (rev 55866)
@@ -99,7 +99,7 @@
 		             opdata->modify_depth ? IFACE_("On") : IFACE_("Off"),
 		             RNA_boolean_get(op->ptr, "use_outset") ? IFACE_("On") : IFACE_("Off"),
 		             RNA_boolean_get(op->ptr, "use_boundary") ? IFACE_("On") : IFACE_("Off"),
-		             RNA_boolean_get(op->ptr, "individual") ? IFACE_("On") : IFACE_("Off")
+		             RNA_boolean_get(op->ptr, "use_individual") ? IFACE_("On") : IFACE_("Off")
 		            );
 
 		ED_area_headerprint(sa, msg);
@@ -192,7 +192,8 @@
 	const float depth              = RNA_float_get(op->ptr,   "depth");
 	const bool use_outset          = RNA_boolean_get(op->ptr, "use_outset");
 	const bool use_select_inset    = RNA_boolean_get(op->ptr, "use_select_inset"); /* not passed onto the BMO */
-	const bool individual          = RNA_boolean_get(op->ptr, "individual");
+	const bool use_individual      = RNA_boolean_get(op->ptr, "use_individual");
+	const bool use_interpolate     = RNA_boolean_get(op->ptr, "use_interpolate");
 
 	opdata = op->customdata;
 	em = opdata->em;
@@ -201,10 +202,10 @@
 		EDBM_redo_state_restore(opdata->mesh_backup, em, false);
 	}
 
-	if (individual) {
+	if (use_individual) {
 		EDBM_op_init(em, &bmop, op,
-		             "inset_individual faces=%hf thickness=%f depth=%f use_even_offset=%b",
-		             BM_ELEM_SELECT, thickness, depth, use_even_offset);
+		             "inset_individual faces=%hf thickness=%f depth=%f use_even_offset=%b use_interpolate=%b",
+		             BM_ELEM_SELECT, thickness, depth, use_even_offset, use_interpolate);
 	}
 	else {
 		EDBM_op_init(em, &bmop, op,
@@ -420,8 +421,8 @@
 			break;
 		case IKEY:
 			if (event->val == KM_PRESS) {
-				int individual = RNA_boolean_get(op->ptr, "individual");
-				RNA_boolean_set(op->ptr, "individual", !individual);
+				const bool use_individual = RNA_boolean_get(op->ptr, "use_individual");
+				RNA_boolean_set(op->ptr, "use_individual", !use_individual);
 				if (edbm_inset_calc(op)) {
 					edbm_inset_update_header(op, C);
 				}
@@ -470,5 +471,6 @@
 
 	RNA_def_boolean(ot->srna, "use_outset", false, "Outset", "Outset rather than inset");
 	RNA_def_boolean(ot->srna, "use_select_inset", true, "Select Outer", "Select the new inset faces");
-	RNA_def_boolean(ot->srna, "individual", false, "Individual", "Individual Face Inset");
+	RNA_def_boolean(ot->srna, "use_individual", false, "Individual", "Individual Face Inset");
+	RNA_def_boolean(ot->srna, "use_interpolate", true, "Interpolate", "Blend face data across the inset");
 }




More information about the Bf-blender-cvs mailing list