[Bf-blender-cvs] [66199cf5409] soc-2017-normal-tools: Added normals to follow mouse location.

Rohan Rathi noreply at git.blender.org
Mon Jun 19 07:31:09 CEST 2017


Commit: 66199cf5409cbc275974ffc92e1981c227758bfb
Author: Rohan Rathi
Date:   Mon Jun 19 11:00:48 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB66199cf5409cbc275974ffc92e1981c227758bfb

Added normals to follow mouse location.

Now M key can be used after ALT - L to have clnors point to mouse location.

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

M	source/blender/editors/mesh/editmesh_tools.c

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

diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 9d2fd2fa77b..848cd16b8f3 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -5978,6 +5978,7 @@ void MESH_OT_mark_freestyle_face(wmOperatorType *ot)
 	RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
+/* Initialize loop normal data */
 static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
 {
 	Object *obedit = CTX_data_edit_object(C);
@@ -5993,10 +5994,13 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
 
 	PropertyRNA *prop = RNA_struct_find_property(op->ptr, "selected");
 	int length = RNA_property_array_length(op->ptr, prop);
+
 	int *vert_sel = MEM_mallocN(sizeof(*vert_sel) * length, "__func__");
-	RNA_int_get_array(op->ptr, "selected", vert_sel);
+	RNA_int_get_array(op->ptr, "selected", vert_sel);				/* Get loop indices of previous selected vertices */
+
+	/* This if statement is required as if we RMB on mesh then prev selected loop data is lost */
 
-	if (*vert_sel != -1) {
+	if (*vert_sel != -1) {											/* Means  function is called by exec() */
 		totloopsel = RNA_int_get(op->ptr, "loop_selected");
 		TransDataLoopNormal *tld = ld->normal = MEM_mallocN(sizeof(*tld) * totloopsel, "__func__");
 		int *vert_cur = vert_sel;
@@ -6005,13 +6009,13 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
 			v = BM_vert_at_index_find_or_table(bm, *vert_cur);
 
 			BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
-				InitTransDataNormal(bm, tld, v, l, cd_custom_normal_offset);
+				InitTransDataNormal(bm, tld, v, l, cd_custom_normal_offset);		/* Init those loop normals used in previous call */
 				tld++;
 			}
 		}
 	}
 	else {
-		totloopsel = BM_total_loop_select(bm);
+		totloopsel = BM_total_loop_select(bm);		/* Invoke operation */
 		TransDataLoopNormal *tld = ld->normal = MEM_mallocN(sizeof(*tld) * totloopsel, "__func__");
 		BM_mesh_elem_index_ensure(bm, BM_LOOP);
 
@@ -6025,10 +6029,12 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
 			}
 		}
 	}
+
 	MEM_freeN(vert_sel);
 
 	ld->totloop = totloopsel;
 	ld->offset = cd_custom_normal_offset;
+	ld->funcdata = NULL;
 	op->customdata = ld;
 
 	return totloopsel;
@@ -6042,17 +6048,19 @@ static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *even
 	BMIter liter;
 	LoopNormalData *ld = op->customdata;
 	TransDataLoopNormal *tld = ld->normal;
-	bool point_away = RNA_boolean_get(op->ptr, "point_away");
-	int i = 0;
 
-	if (vert) {
+	const bool point_away = RNA_boolean_get(op->ptr, "point_away");
+
+	if (vert) {					/* if active vert is pivot, keep its normal same */
 		BMElem *ele;
 		ele = BM_mesh_active_elem_get(bm);
+
 		if (ele->head.htype == BM_VERT) {
 			BM_ITER_ELEM(l, &liter, ((BMVert *)ele), BM_LOOPS_OF_VERT) {
 				int loop_index = BM_elem_index_get(l);
 				tld = ld->normal;
-				for (i = 0; i < ld->totloop; i++, tld++) {
+
+				for (int i = 0; i < ld->totloop; i++, tld++) {
 					if (tld->loop_index == loop_index) {
 						tld->loop_index = -1;
 						break;
@@ -6075,9 +6083,12 @@ static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *even
 	}
 }
 
-static void point_normals_free(bContext *C, wmOperator *op)
+static void point_normals_free(bContext *C, wmOperator *op, const bool align)
 {
 	LoopNormalData *ld = op->customdata;
+	if (align) {
+		MEM_freeN(ld->normal->loc);
+	}
 	MEM_freeN(ld->normal);
 	MEM_freeN(ld);
 	op->customdata = NULL;
@@ -6085,6 +6096,60 @@ static void point_normals_free(bContext *C, wmOperator *op)
 	ED_area_headerprint(CTX_wm_area(C), NULL);
 }
 
+static int point_normals_mouse(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	View3D *v3d = CTX_wm_view3d(C);
+	Object *obedit = CTX_data_edit_object(C);
+	ARegion *ar = CTX_wm_region(C);
+	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+	BMesh *bm = em->bm;
+	BMVert *v;
+	BMIter viter;
+	int i = 0;
+
+	float target[3], center[3];
+
+	RNA_float_get_array(op->ptr, "target_location", target);
+
+	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);
+
+	ED_view3d_win_to_3d_int(v3d, ar, center, event->mval, target);
+
+	PropertyRNA *prop = RNA_struct_find_property(op->ptr, "align");
+	RNA_def_property_clear_flag(prop, PROP_HIDDEN);
+
+	const bool check_vert = RNA_boolean_get(op->ptr, "check_vert"),
+		  align = RNA_boolean_get(op->ptr, "align");
+
+	apply_point_normals(C, op, event, target, check_vert);
+	EDBM_update_generic(em, true, false);
+
+	if (event->type == LEFTMOUSE) {
+		RNA_float_set_array(op->ptr, "target_location", target);
+		point_normals_free(C, op, align);
+		return OPERATOR_FINISHED;
+	}
+
+	else if ((ISKEYBOARD(event->type) || event->type == RIGHTMOUSE) && event->type != MKEY) {
+		LoopNormalData *ld = op->customdata;
+		TransDataLoopNormal *tld = ld->normal;
+
+		for (i = 0; i < ld->totloop; i++, tld++) {				/* Reset custom normal data */
+			BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[tld->loop_index], tld->niloc, tld->clnors_data);
+		}
+		point_normals_free(C, op, align);
+		return OPERATOR_CANCELLED;
+	}
+	return OPERATOR_PASS_THROUGH;
+}
+
 static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
 	View3D *v3d = CTX_wm_view3d(C);
@@ -6098,17 +6163,27 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 
 	bool handled = false;
 	PropertyRNA *prop = RNA_struct_find_property(op->ptr, "target_location");
+	LoopNormalData *ld = op->customdata;
+
+	if (ld->funcdata) {				/* executes point_normals_mouse */
+		int(*apply)(bContext *, wmOperator *, const wmEvent *);
+		apply = ld->funcdata;
+		return apply(C, op, event);
+	}
 
 	if (ele_ref) {
 		BMElem *ele_new = BM_mesh_active_elem_get(bm);
 		if (ele_ref == ele_new) {
 			ele_ref = NULL;
-			point_normals_free(C, op);
+			point_normals_free(C, op, false);
+			ED_area_headerprint(CTX_wm_area(C), NULL);
+
 			return OPERATOR_CANCELLED;
 		}
 		RNA_boolean_set(op->ptr, "check_vert", true);
 		ED_object_editmode_calc_active_center(obedit, false, target);
 		RNA_property_float_set_array(op->ptr, prop, target);
+
 		handled = true;
 		ele_ref = NULL;
 	}
@@ -6121,11 +6196,12 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 			ED_view3d_cursor3d_update(C, event->mval);
 			copy_v3_v3(target, ED_view3d_cursor3d_get(scene, v3d));
 			RNA_property_float_set_array(op->ptr, prop, target);
+
 			handled = true;
 		}
 		if (event->type == RIGHTMOUSE) {
 			ele_ref = BM_mesh_active_elem_get(bm);
-			int *vert_sel = MEM_mallocN(sizeof(*vert_sel) * bm->totvertsel, "__func_"), index;
+			int *vert_sel = MEM_mallocN(sizeof(*vert_sel) * bm->totvertsel, "__func__"), index;
 
 			BM_ITER_MESH_INDEX(v, &viter, bm, BM_VERTS_OF_MESH, index) {
 				if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
@@ -6133,7 +6209,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 					i++;
 				}
 			}
-			RNA_int_set_array(op->ptr, "selected", vert_sel);
+			RNA_int_set_array(op->ptr, "selected", vert_sel);		//Store selected verts, will be lost as selected elem changes
 			MEM_freeN(vert_sel);
 		}
 		else if (event->type == LKEY) {
@@ -6163,6 +6239,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 			case V3D_AROUND_CENTER_MEAN:
 				if (RNA_int_get(op->ptr, "loop_selected")) {
 					zero_v3(target);
+
 					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);
@@ -6172,7 +6249,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 					mul_v3_fl(target, 1.0f / (float)i);
 				}
 				else {
-					point_normals_free(C, op);
+					point_normals_free(C, op, false);
 					return OPERATOR_CANCELLED;	/* Mechanism to free mem with every cancel, other than ot->cancel() */
 				}
 				RNA_property_float_set_array(op->ptr, prop, target);
@@ -6194,29 +6271,69 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 
 			default:
 				BKE_report(op->reports, RPT_ERROR, "Does not support Indivisual Origin as pivot");
-				point_normals_free(C, op);
+				point_normals_free(C, op, false);
 				return OPERATOR_CANCELLED;
 			}
 			handled = true;
 		}
+		else if (event->type == MKEY) {
+			ld->funcdata = point_normals_mouse;
+
+			const bool align = RNA_boolean_get(op->ptr, "align");
+
+			if (align) {								/* Set TransData loc to center loc if align true */
+				float *center = MEM_mallocN(sizeof(*center) * 3, "__func__");
+				TransDataLoopNormal *t = ld->normal;
+				int i = 0;
+
+				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);
+
+				for (i = 0; i < ld->totloop; i++, t++) {
+					t->loc = center;
+				}
+			}
+
+			char header[UI_MAX_DRAW_STR];
+			BLI_snprintf(header, sizeof(header), IFACE_("Left Click to Confirm. Right click to Cancel."));
+
+			ED_area_headerprint(CTX_wm_area(C), header);
+		}
 		else if (event->type == OKEY) {
 			copy_v3_v3(target, obedit->loc);
 			RNA_property_float_set_array(op->ptr, prop, target);
 			handled = true;
 		}
 		else if (ISKEYBOARD(event->type) && event->type != RIGHTALTKEY) {
-			point_normals_free(C, op);
+			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;
 		}
 	}
+	
+	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) {
 		bool check_vert = RNA_boolean_get(op->ptr, "check_vert");
 		apply_point_normals(C, op, event, target, check_vert);
+
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list