[Bf-blender-cvs] [96e76ea4a3e] soc-2017-normal-tools: Made workflow changes to copy, paste. Added add and multiply.

Rohan Rathi noreply at git.blender.org
Fri Aug 18 18:12:38 CEST 2017


Commit: 96e76ea4a3e0d988389ed3ba5464696e02028628
Author: Rohan Rathi
Date:   Fri Aug 18 20:44:15 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB96e76ea4a3e0d988389ed3ba5464696e02028628

Made workflow changes to copy, paste. Added add and multiply.

Did a cleanup of point_normals and split. Added ability to spherize in point_normals. Added reset. Added normal smoothing based on adjacent vertices. Did a cleanup of UI.
The set of normal tools now share the normal vector in UI. The copy/paste operator now contains all these methods and has been renamed.

===================================================================

M	release/scripts/startup/bl_ui/space_view3d_toolbar.py
M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/mesh/mesh_intern.h
M	source/blender/editors/mesh/mesh_ops.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_scene.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 82766ac7ad0..a86585a0ece 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -442,6 +442,7 @@ class VIEW3D_PT_tools_normal(View3DPanel, Panel):
 
 	def draw(self, context):
 		layout = self.layout
+		toolsettings = context.tool_settings
 
 		col = layout.column(align=True)
 		col.operator("transform.rotate_normal", text = "Rotate Normal")
@@ -459,10 +460,20 @@ class VIEW3D_PT_tools_normal(View3DPanel, Panel):
 		col.operator_menu_enum("mesh.average_loop_normals", "average_type")
 		
 		col = layout.column(align=True)
-		col.label(text="Copy/Paste Normal")
+		col.label(text="Normal Vector: ")
+		col.operator("mesh.custom_normal_tools", text="Reset").mode = "Reset"
+		col.prop(toolsettings, "normal_vector", text = '')
+
+		row = col.row(align=True)
+		row.operator("mesh.custom_normal_tools", text="Copy").mode = "Copy"
+		row.operator("mesh.custom_normal_tools", text="Paste").mode = "Paste"
+
 		row = col.row(align=True)
-		row.operator("mesh.copy_normal", text="Copy").copy = True
-		row.operator("mesh.copy_normal", text="Paste").copy = False
+		row.operator("mesh.custom_normal_tools", text = "Multiply").mode = "Multiply"
+		row.operator("mesh.custom_normal_tools", text="Add").mode = "Add"
+
+		col = layout.column(align=True)
+		col.operator("mesh.smoothen_custom_normals", text="Smoothen")
 
 
 class VIEW3D_PT_tools_uvs(View3DPanel, Panel):
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 9868674815c..9ef463db893 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -6006,16 +6006,39 @@ static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *even
 	LoopNormalData *ld = op->customdata;
 	TransDataLoopNormal *tld = ld->normal;
 
-	const bool point_away = RNA_boolean_get(op->ptr, "point_away");
+	const bool point_away = RNA_boolean_get(op->ptr, "point_away"), spherize = RNA_boolean_get(op->ptr, "spherize");
+	float zero[3] = { 0 };
+
+	PropertyRNA *prop = RNA_struct_find_property(op->ptr, "strength");
+	if (spherize) {
+		RNA_def_property_clear_flag(prop, PROP_HIDDEN);
+	}
+	else {
+		RNA_def_property_flag(prop, PROP_HIDDEN);
+	}
 
 	for (int i = 0; i < ld->totloop; i++, tld++) {
-		sub_v3_v3v3(tld->nloc, target, tld->loc);
-		normalize_v3(tld->nloc);
+
+		if (spherize) {
+			float strength = RNA_float_get(op->ptr, "strength");
+			float spherized_normal[3] = { 0 };
+
+			sub_v3_v3v3(spherized_normal, target, tld->loc);
+			sub_v3_v3(spherized_normal, obedit->loc);
+			mul_v3_fl(spherized_normal, strength);
+			mul_v3_fl(tld->nloc, 1.0f - strength);
+			sub_v3_v3(tld->nloc, spherized_normal);
+		}
+		else {
+			sub_v3_v3v3(tld->nloc, target, tld->loc);
+			sub_v3_v3(tld->nloc, obedit->loc);
+		}
 
 		if (point_away) {
 			negate_v3(tld->nloc);
 		}
-		if (tld->loop_index != -1 && !is_zero_v3(tld->nloc)) {
+		if (tld->loop_index != -1 && !compare_v3v3(tld->nloc, zero, 1e-4f)) {
+			normalize_v3(tld->nloc);
 			BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[tld->loop_index], tld->nloc, tld->clnors_data);
 		}
 	}
@@ -6053,16 +6076,13 @@ static int point_normals_mouse(bContext *C, wmOperator *op, const wmEvent *event
 	BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
 		if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
 			add_v3_v3(center, v->co);
+			add_v3_v3(center, obedit->loc);
 			i++;
 		}
 	}
 	mul_v3_fl(center, 1.0f / (float)i);
 
 	ED_view3d_win_to_3d_int(v3d, ar, center, event->mval, target);
-	sub_v3_v3(target, obedit->loc);
-
-	PropertyRNA *prop = RNA_struct_find_property(op->ptr, "align");
-	RNA_def_property_clear_flag(prop, PROP_HIDDEN);
 
 	const bool align = RNA_boolean_get(op->ptr, "align");
 
@@ -6115,7 +6135,6 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 		if (event->type == LEFTMOUSE) {
 			ED_view3d_cursor3d_update(C, event->mval);
 			copy_v3_v3(target, ED_view3d_cursor3d_get(scene, v3d));
-			sub_v3_v3(target, obedit->loc);
 			RNA_property_float_set_array(op->ptr, prop, target);
 
 			handled = true;
@@ -6129,6 +6148,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 				return OPERATOR_CANCELLED;
 			}
 			ED_object_editmode_calc_active_center(obedit, false, target);
+			add_v3_v3(target, obedit->loc);
 			RNA_property_float_set_array(op->ptr, prop, target);
 			handled = true;
 		}
@@ -6152,6 +6172,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 					}
 				}
 				mid_v3_v3v3(target, min, max);
+				add_v3_v3(target, obedit->loc);
 				RNA_property_float_set_array(op->ptr, prop, target);
 			}
 			break;
@@ -6162,6 +6183,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 				BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
 					if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
 						add_v3_v3(target, v->co);
+						add_v3_v3(target, obedit->loc);
 						i++;
 					}
 				}
@@ -6171,14 +6193,15 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 
 			case V3D_AROUND_CURSOR:
 				copy_v3_v3(target, ED_view3d_cursor3d_get(scene, v3d));
-				sub_v3_v3(target, obedit->loc);
 				RNA_property_float_set_array(op->ptr, prop, target);
 				break;
 
 			case V3D_AROUND_ACTIVE:
 				if (!ED_object_editmode_calc_active_center(obedit, false, target)) {
+					point_normals_free(C, op, false);
 					return OPERATOR_CANCELLED;
 				}
+				add_v3_v3(target, obedit->loc);
 				RNA_property_float_set_array(op->ptr, prop, target);
 				break;
 
@@ -6226,7 +6249,6 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 		else if (ISKEYBOARD(event->type) && event->type != RIGHTALTKEY) {
 			prop = RNA_struct_find_property(op->ptr, "align");
 			RNA_property_boolean_set(op->ptr, prop, false);
-			RNA_def_property_flag(prop, PROP_HIDDEN);
 
 			point_normals_free(C, op, false);
 			return OPERATOR_CANCELLED;
@@ -6236,7 +6258,6 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 	if (handled || event->type == RIGHTMOUSE) {
 		prop = RNA_struct_find_property(op->ptr, "align");
 		RNA_property_boolean_set(op->ptr, prop, false);
-		RNA_def_property_flag(prop, PROP_HIDDEN);
 	}
 
 	if (handled) {
@@ -6294,8 +6315,18 @@ static int edbm_point_normals_exec(bContext *C, wmOperator *op)
 		LoopNormalData *ld = op->customdata;
 		TransDataLoopNormal *t = ld->normal;
 		int i = 0;
+		BMVert *v;
+		BMIter viter;
+
+		zero_v3(center);
+		BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+			if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+				add_v3_v3(center, v->co);
+				i++;
+			}
+		}
+		mul_v3_fl(center, 1.0f / (float)i);
 
-		copy_v3_v3(center, obedit->loc);
 		for (i = 0; i < ld->totloop; i++, t++) {
 			t->loc = center;
 		}
@@ -6311,31 +6342,6 @@ static int edbm_point_normals_exec(bContext *C, wmOperator *op)
 	return OPERATOR_FINISHED;
 }
 
-static void edbm_point_normals_ui(bContext *UNUSED(C), wmOperator *op)
-{
-	uiLayout *layout = op->layout, *row, *col;
-	PointerRNA ptr;
-
-	const bool align = RNA_boolean_get(op->ptr, "align");
-
-	RNA_pointer_create(NULL, op->type->srna, op->properties, &ptr);
-
-	uiItemR(layout, &ptr, "point_away", 0, NULL, ICON_NONE);
-
-	uiItemR(layout, &ptr, "align", 0, NULL, ICON_NONE);
-	row = uiLayoutRow(layout, false);
-
-	if (align) {
-		col = uiLayoutColumn(row, false);
-		uiItemR(col, &ptr, "target_location", UI_ITEM_R_EXPAND, "", ICON_NONE);
-		uiItemR(row, &ptr, "target_location", 0, "", ICON_NONE);
-	}
-	else {
-		col = uiLayoutColumn(layout, false);
-		uiItemR(col, &ptr, "target_location", UI_ITEM_R_EXPAND, "", ICON_NONE);
-	}
-}
-
 void MESH_OT_point_normals(struct wmOperatorType *ot)
 {
 	/* identifiers */
@@ -6347,23 +6353,24 @@ void MESH_OT_point_normals(struct wmOperatorType *ot)
 	ot->exec = edbm_point_normals_exec;
 	ot->invoke = edbm_point_normals_invoke;
 	ot->modal = edbm_point_normals_modal;
-	ot->ui = edbm_point_normals_ui;
 	ot->poll = ED_operator_editmesh_auto_smooth;
 
 	/* flags */
 	ot->flag = OPTYPE_BLOCKING | OPTYPE_REGISTER | OPTYPE_UNDO;
 
 	ot->prop = RNA_def_boolean(ot->srna, "point_away", false, "Point Away", "Point Away from target");
+	
+	ot->prop = RNA_def_boolean(ot->srna, "align", false, "Align", "Align normal with mouse location");
 
 	PropertyRNA *prop;
 
-	prop = RNA_def_boolean(ot->srna, "align", false, "Align", "Align normal with mouse location");
-	RNA_def_property_flag(prop, PROP_HIDDEN);
-
-	prop = RNA_def_property(ot->srna, "target_location", PROP_FLOAT, PROP_DIRECTION);
+	prop = RNA_def_property(ot->srna, "target_location", PROP_FLOAT, PROP_XYZ);
 	RNA_def_property_array(prop, 3);
-	RNA_def_property_flag(prop, PROP_ANIMATABLE);
 	RNA_def_property_ui_text(prop, "Target", "Target location where normals will point");
+
+	prop = RNA_def_boolean(ot->srna, "spherize", false, "Spherize Normal", "Add normal vector of target to custom normal with given proportion");
+
+	prop = RNA_def_float(ot->srna, "strength", 0.1, 0.0f, 1.0f, "Strength", "Ratio of spherized normal to original normal", 0.0f, 1.0f);
 }
 
 /********************** Split/Merge Loop Normals **********************/
@@ -6429,19 +6436,17 @@ static bool split_loop(bContext *C, wmOperator *op, LoopNormalData *ld)
 	BMIter fiter, liter;
 
 	TransDataLoopNormal *tld = ld->normal;
-	void **loops;
-
-	loops = MEM_mallocN(sizeof(void *) * bm->totloop, "__func__");		/* temp loop index table */
+	BMLoop **loop_at_index = MEM_mallocN(sizeof(void *) * bm->totloop, "__func__");		/* temp loop index table */
 	BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
 		BM_ITER_ELEM(l, &liter, f, BM_LOOPS_OF_FACE) {
-			loops[BM_elem_index_get(l)] = l;
+			loop_at_index[BM_elem_index_get(l)] = l;
 		}
 	}
 	for (int i = 0; i < ld->totloop; i++, tld++) {
-		BMLoop *loop_at_index = loops[tld->loop_index];
-		BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[tld->loop_index], loop_at_index->f->no, tld->clnors_data);
+		BMLoop *l_curr = loop_at_index[tld-

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list