[Bf-blender-cvs] [9673aa8c151] soc-2017-normal-tools: Added point normals to target. Moved common loop functions and made changes to structure

Rohan Rathi noreply at git.blender.org
Sun Jun 11 21:37:43 CEST 2017


Commit: 9673aa8c151b463e05922b192bcd403c2c7c319e
Author: Rohan Rathi
Date:   Sun Jun 11 23:21:42 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB9673aa8c151b463e05922b192bcd403c2c7c319e

Added point normals to target.
Moved common loop functions and made changes to structure

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

M	source/blender/bmesh/bmesh_class.h
M	source/blender/bmesh/intern/bmesh_mesh.c
M	source/blender/bmesh/intern/bmesh_mesh.h
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/editors/transform/transform.c
M	source/blender/editors/transform/transform.h
M	source/blender/editors/transform/transform_ops.c

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

diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index cc6a96a59cd..a35bc2b3141 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -268,6 +268,24 @@ enum {
 	BM_FACE = 8
 };
 
+typedef struct TransDataLoopNormal {
+	int loop_index;
+	float mtx[3][3];
+	float smtx[3][3];
+	float niloc[3];
+	float nloc[3];
+	float *loc;
+	short *clnors_data;
+} TransDataLoopNormal;
+
+typedef struct LoopNormalData {
+	TransDataLoopNormal *normal;
+
+	int offset;
+	int totloop;
+	void *funcdata;
+} LoopNormalData;
+
 #define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE)
 #define BM_ALL_NOLOOP (BM_VERT | BM_EDGE | BM_FACE)
 
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 5cbd8fd7472..d6d61404b0e 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -647,7 +647,6 @@ static void bm_mesh_loops_calc_normals(
 		do {
 			if (rebuild && !BM_elem_flag_test(l_curr, BM_ELEM_LNORSPACE) && !(bm->spacearr_dirty & BM_SPACEARR_DIRTY_ALL))
 				continue;
-
 			/* A smooth edge, we have to check for cyclic smooth fan case.
 			 * If we find a new, never-processed cyclic smooth fan, we can do it now using that loop/edge as
 			 * 'entry point', otherwise we can skip it. */
@@ -1070,7 +1069,7 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
 
 			if (BM_elem_flag_test(l, BM_ELEM_LNORSPACE)) {
 
-#ifdef _DEBUG
+#if 0
 				short(*clnor)[2] = BM_ELEM_CD_GET_VOID_P(l, cd_loop_clnors_offset);
 				int l_index = BM_elem_index_get(l);
 				BKE_lnor_space_custom_normal_to_data(bm->bmspacearr.lspacearr[l_index], l->v->no, *clnor);
@@ -1089,6 +1088,54 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
 	bm->spacearr_dirty &= ~(BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL);
 }
 
+void BM_lnorspace_update(BMesh *bm)
+{
+	float(*lnors)[3] = MEM_callocN(sizeof(*lnors) * bm->totloop, "__func__");
+
+	if (bm->bmspacearr.lspacearr == NULL) {
+		BM_lnorspacearr_store(bm, lnors);
+	}
+	else if(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL)){
+		BM_lnorspace_rebuild(bm, false);
+	}
+	MEM_freeN(lnors);
+}
+
+int BM_total_loop_select(BMesh *bm)
+{
+	int r_sel = 0;
+	BMVert *v;
+	BMIter viter;
+
+	BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+		if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+			r_sel += BM_vert_face_count(v);
+		}
+	}
+	return r_sel;
+}
+
+void InitTransDataNormal(BMesh *bm, TransDataLoopNormal *tld, BMVert *v, BMLoop *l, int offset)
+{
+	int l_index = BM_elem_index_get(l);
+	tld->loop_index = l_index;
+	short *clnors_data = BM_ELEM_CD_GET_VOID_P(l, offset);
+
+	float custom_normal[3];
+	BKE_lnor_space_custom_data_to_normal(bm->bmspacearr.lspacearr[l_index], clnors_data, custom_normal);
+
+	tld->clnors_data = clnors_data;
+	copy_v3_v3(tld->nloc, custom_normal);
+	copy_v3_v3(tld->niloc, custom_normal);
+
+	if (v) {
+		tld->loc = v->co;
+	}
+	else {
+		tld->loc = NULL;
+	}
+}
+
 static void UNUSED_FUNCTION(bm_mdisps_space_set)(Object *ob, BMesh *bm, int from, int to)
 {
 	/* switch multires data out of tangent space */
diff --git a/source/blender/bmesh/intern/bmesh_mesh.h b/source/blender/bmesh/intern/bmesh_mesh.h
index bf1a24d9ce4..b74394276eb 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.h
+++ b/source/blender/bmesh/intern/bmesh_mesh.h
@@ -55,6 +55,11 @@ void BM_loops_calc_normal_vcos(
 void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3]);
 void BM_lnorspace_invalidate(BMesh *bm, bool inval_all);
 void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor);
+void BM_lnorspace_update(BMesh *bm);
+
+/* Loop Generics */
+int BM_total_loop_select(BMesh *bm);
+void InitTransDataNormal(BMesh *bm, TransDataLoopNormal *tld, BMVert *v, BMLoop *l, int offset);
 
 void bmesh_edit_begin(BMesh *bm, const BMOpTypeFlag type_flag);
 void bmesh_edit_end(BMesh *bm, const BMOpTypeFlag type_flag);
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 1f90b60a1f5..01fceb7c715 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -5976,4 +5976,261 @@ void MESH_OT_mark_freestyle_face(wmOperatorType *ot)
 	RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
+static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	Object *obedit = CTX_data_edit_object(C);
+	BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
+	BMVert *v;
+	BMLoop *l;
+	BMIter viter, liter;
+
+	BM_lnorspace_update(bm);
+	LoopNormalData *ld = MEM_mallocN(sizeof(LoopNormalData), "__func__");
+	int cd_custom_normal_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
+	int totloopsel = 0;
+
+	totloopsel = BM_total_loop_select(bm);
+	TransDataLoopNormal *tld = ld->normal = MEM_mallocN(sizeof(*tld) * totloopsel, "__func__");
+	BM_mesh_elem_index_ensure(bm, BM_LOOP);
+
+	BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+		if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+			BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
+
+				InitTransDataNormal(bm, tld, v, l, cd_custom_normal_offset);
+				tld++;
+			}
+		}
+	}
+
+	ld->totloop = totloopsel;
+	ld->offset = cd_custom_normal_offset;
+	op->customdata = ld;
+
+	return totloopsel;
+}
+
+static void apply_point_normals(bContext *C, wmOperator *op, float target[3], bool vert)
+{
+	Object *obedit = CTX_data_edit_object(C);
+	BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
+	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) {
+		BMElem *ele;
+		ele = BM_mesh_active_elem_get(bm);
+		if (ele->head.htype == BM_VERT) {
+			BMLoop *l;
+			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++) {
+					if (tld->loop_index == loop_index) {
+						tld->loop_index = -1;
+						break;
+					}
+				}
+			}
+			tld = ld->normal;
+		}
+	}
+
+	for (int i = 0; i < ld->totloop; i++, tld++) {
+		sub_v3_v3v3(tld->nloc, target, tld->loc);
+		normalize_v3(tld->nloc);
+
+		if (point_away) {
+			negate_v3(tld->nloc);
+		}
+		if (tld->loop_index != -1) {
+			BKE_lnor_space_custom_normal_to_data(bm->bmspacearr.lspacearr[tld->loop_index], tld->nloc, tld->clnors_data);
+		}
+	}
+}
+
+static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	View3D *v3d = CTX_wm_view3d(C);
+	Scene *scene = CTX_data_scene(C);
+	Object *obedit = CTX_data_edit_object(C);
+	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+	BMesh *bm = em->bm;
+	BMVert *v;
+	LoopNormalData *ld = op->customdata;
+	TransDataLoopNormal *tld = ld->normal;
+	float target[3];
+	static BMElem *ele_ref = NULL;
+	int i = 0;
+
+	bool point_away = RNA_boolean_get(op->ptr, "point_away"), handled = false;
+	PropertyRNA *prop = RNA_struct_find_property(op->ptr, "target");
+
+	if (ele_ref) {
+		BMElem *ele_new = BM_mesh_active_elem_get(bm);
+		if (ele_ref == ele_new) {
+			ele_ref = 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;
+	}
+
+	if (event->val == KM_PRESS) {
+		if (event->type == RIGHTMOUSE) {
+			ele_ref = BM_mesh_active_elem_get(bm);
+		}
+		else if (event->type == LKEY) {
+			BMIter viter;
+
+			switch (v3d->around) {
+			case V3D_AROUND_CENTER_BOUNDS:
+				/* calculateCenterBound */
+			{
+				float min[3], max[3];
+				BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+					if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+						if (i) {
+							minmax_v3v3_v3(min, max, v->co);
+						}
+						else {
+							copy_v3_v3(min, v->co);
+							copy_v3_v3(max, v->co);
+						}
+						i++;
+					}
+				}
+				mid_v3_v3v3(target, min, max);
+				RNA_property_float_set_array(op->ptr, prop, target);
+			}
+			break;
+
+			case V3D_AROUND_CENTER_MEAN:
+				if (ld->totloop) {
+					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);
+							i++;
+						}
+					}
+					mul_v3_fl(target, 1.0f / i);
+				}
+				else {
+					return OPERATOR_CANCELLED;
+				}
+				RNA_property_float_set_array(op->ptr, prop, target);
+				break;
+
+			case V3D_AROUND_CURSOR:
+				copy_v3_v3(target, ED_view3d_cursor3d_get(scene, v3d));
+				RNA_property_float_set_array(op->ptr, prop, target);
+				break;
+
+			case V3D_AROUND_ACTIVE:
+				if (!ED_object_editmode_calc_active_center(obedit, false, target)) {
+					return OPERATOR_CANCELLED;
+				}
+				RNA_boolean_set(op->ptr, "check_vert", true);
+				RNA_property_float_set_array(op->ptr, prop, target);
+				break;
+
+			default:
+				BKE_report(op->reports, RPT_ERROR, "Does not support Indivisual Origin as pivot");
+				return OPERATOR_CANCELLED;
+			}
+			handled = true;
+		}
+		else if (ISKEYBOARD(event->type) && event->type != RIGHTALTKEY) {
+			return OPERATOR_CANCELLED;
+		}
+	}
+
+	if (handled) {
+		bool check_vert = RNA_boolean_get(op->ptr, "check_vert");
+		apply_point_normals(C, op, target, check_vert);
+		EDBM_update_generic(em, true, false);	/* Recheck bools */
+		return OPERATOR_FINISHED;
+	}
+	return OPERATOR_PASS_THROUGH;
+}
+
+static int edbm_point_normals_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	Object *obedit = CTX_data_edit_object(C);
+	if ((((Mesh *)(obedit->data))->flag & ME_AUTOSMOOTH) == 0) {
+		BKE_report(op->reports, RPT_ERROR, "Auto Smooth is turned off");
+		return OPERATOR_CANCELLED;
+	}
+
+	if (!init_point_normals(C, op, event)) {
+		return OPERATOR_CANCELLED;
+	}
+
+	WM_event_add_modal_handler(C, op);
+
+	return OPERATOR_RUNNING_MODAL;
+}
+
+static int edbm_point_normals_exec(bContext *C, wmOperator *op)
+{
+	Object *obedit = CTX_data_edit_object(C);
+	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+	BMesh *bm = em->bm;
+	PropertyRNA *prop;
+
+	if (!init_point_normals(C, op, NULL)) {
+		return OPERATOR_CANCELLED;
+	}
+
+	LoopNormalData *ld = op->customdata;
+	T

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list