[Bf-blender-cvs] [19ff231ff5b] soc-2017-normal-tools: Fixed issues with Point Normals.

Rohan Rathi noreply at git.blender.org
Tue Jun 13 08:04:56 CEST 2017


Commit: 19ff231ff5bbc62425a5c81b00bd3712bc34e01b
Author: Rohan Rathi
Date:   Tue Jun 13 11:34:03 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB19ff231ff5bbc62425a5c81b00bd3712bc34e01b

Fixed issues with Point Normals.

Added header, fixed bugs and logic errors in point normals to target. Target location is now editable from UI.
Also renamed 'bmspacearr' to 'lnor_spacearr'

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

M	source/blender/bmesh/bmesh_class.h
M	source/blender/bmesh/intern/bmesh_mesh.c
M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/transform/transform.c

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

diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index 58079678454..dcaceef8ac9 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -256,7 +256,7 @@ typedef struct BMesh {
 
 	void *py_handle;
 
-	struct MLoopNorSpaceArray *bmspacearr;  /* Stores MLoopNorSpaceArray for this BMesh */
+	struct MLoopNorSpaceArray *lnor_spacearr;  /* Stores MLoopNorSpaceArray for this BMesh */
 	char spacearr_dirty;
 } BMesh;
 
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 7745438fceb..e1d110fb486 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -270,9 +270,9 @@ void BM_mesh_data_free(BMesh *bm)
 
 	BLI_freelistN(&bm->selected);
 
-	if (bm->bmspacearr) {
-		BKE_lnor_spacearr_free(bm->bmspacearr);
-		MEM_freeN(bm->bmspacearr);
+	if (bm->lnor_spacearr) {
+		BKE_lnor_spacearr_free(bm->lnor_spacearr);
+		MEM_freeN(bm->lnor_spacearr);
 	}
 
 	BMO_error_clear(bm);
@@ -987,7 +987,7 @@ void BM_loops_calc_normal_vcos(
 
 void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3])
 {
-	BLI_assert(bm->bmspacearr != NULL);
+	BLI_assert(bm->lnor_spacearr != NULL);
 
 	if (!CustomData_has_layer(&bm->ldata, CD_CUSTOMLOOPNORMAL)) {
 		BM_data_layer_add(bm, &bm->ldata, CD_CUSTOMLOOPNORMAL);
@@ -995,7 +995,7 @@ void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3])
 
 	int cd_loop_clnors_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
 
-	BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, bm->bmspacearr, NULL, cd_loop_clnors_offset, false);
+	BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, bm->lnor_spacearr, NULL, cd_loop_clnors_offset, false);
 	bm->spacearr_dirty &= ~(BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL);
 }
 
@@ -1038,7 +1038,7 @@ void BM_lnorspace_invalidate(BMesh *bm, bool inval_all)
 
 void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
 {
-	BLI_assert(bm->bmspacearr != NULL);
+	BLI_assert(bm->lnor_spacearr != NULL);
 
 	if (!(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL))) {
 		return;
@@ -1057,7 +1057,7 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
 	}
 
 	if (preserve_clnor) {
-		BLI_assert(bm->bmspacearr->lspacearr != NULL);
+		BLI_assert(bm->lnor_spacearr->lspacearr != NULL);
 
 		BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
 			BM_ITER_ELEM(l, &liter, f, BM_LOOPS_OF_FACE) {
@@ -1066,12 +1066,12 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
 					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_data_to_normal(bm->bmspacearr->lspacearr[l_index], *clnor, oldnors[l_index]);
+					BKE_lnor_space_custom_data_to_normal(bm->lnor_spacearr->lspacearr[l_index], *clnor, oldnors[l_index]);
 				}
 			}
 		}
 	}
-	BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, bm->bmspacearr, NULL, cd_loop_clnors_offset, true);
+	BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, bm->lnor_spacearr, NULL, cd_loop_clnors_offset, true);
 	MEM_freeN(r_lnors);
 
 	BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
@@ -1082,12 +1082,12 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
 #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);
+				BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[l_index], l->v->no, *clnor);
 #else
 				if (preserve_clnor) {
 					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], oldnors[l_index], *clnor);
+					BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[l_index], oldnors[l_index], *clnor);
 				}
 #endif
 				BM_elem_flag_disable(l, BM_ELEM_LNORSPACE);
@@ -1102,10 +1102,10 @@ void BM_lnorspace_update(BMesh *bm)
 {
 	float(*lnors)[3] = MEM_callocN(sizeof(*lnors) * bm->totloop, "__func__");
 
-	if (bm->bmspacearr == NULL) {
-		bm->bmspacearr = MEM_callocN(sizeof(*bm->bmspacearr), __func__);
+	if (bm->lnor_spacearr == NULL) {
+		bm->lnor_spacearr = MEM_callocN(sizeof(*bm->lnor_spacearr), __func__);
 	}
-	if (bm->bmspacearr->lspacearr == NULL) {
+	if (bm->lnor_spacearr->lspacearr == NULL) {
 		BM_lnorspacearr_store(bm, lnors);
 	}
 	else if(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL)){
@@ -1130,15 +1130,15 @@ int BM_total_loop_select(BMesh *bm)
 
 void InitTransDataNormal(BMesh *bm, TransDataLoopNormal *tld, BMVert *v, BMLoop *l, int offset)
 {
-	BLI_assert(bm->bmspacearr != NULL);
-	BLI_assert(bm->bmspacearr->lspacearr != NULL);
+	BLI_assert(bm->lnor_spacearr != NULL);
+	BLI_assert(bm->lnor_spacearr->lspacearr != NULL);
 
 	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);
+	BKE_lnor_space_custom_data_to_normal(bm->lnor_spacearr->lspacearr[l_index], clnors_data, custom_normal);
 
 	tld->clnors_data = clnors_data;
 	copy_v3_v3(tld->nloc, custom_normal);
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index e1aaa06c5b2..b16c27884f9 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -46,6 +46,7 @@
 #include "BLI_math.h"
 #include "BLI_rand.h"
 #include "BLI_sort_utils.h"
+#include "BLI_string.h"
 
 #include "BKE_material.h"
 #include "BKE_context.h"
@@ -5990,19 +5991,39 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
 	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);
+	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);
 
-	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) {
+	if (*vert_sel != -1) {
+		totloopsel = RNA_int_get(op->ptr, "loop_selected");
+		TransDataLoopNormal *tld = ld->normal = MEM_mallocN(sizeof(*tld) * totloopsel, "__func__");
+
+		for (int i = 0; i < length; i++, vert_sel++) {
+			v = BM_vert_at_index_find_or_table(bm, *vert_sel);
 
+			BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
 				InitTransDataNormal(bm, tld, v, l, cd_custom_normal_offset);
 				tld++;
 			}
 		}
 	}
+	else {
+		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;
@@ -6011,10 +6032,11 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
 	return totloopsel;
 }
 
-static void apply_point_normals(bContext *C, wmOperator *op, float target[3], bool vert)
+static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *event, float target[3], bool vert)
 {
 	Object *obedit = CTX_data_edit_object(C);
 	BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
+	BMLoop *l;
 	BMIter liter;
 	LoopNormalData *ld = op->customdata;
 	TransDataLoopNormal *tld = ld->normal;
@@ -6025,7 +6047,6 @@ static void apply_point_normals(bContext *C, wmOperator *op, float target[3], bo
 		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;
@@ -6039,7 +6060,6 @@ static void apply_point_normals(bContext *C, wmOperator *op, float target[3], bo
 			tld = ld->normal;
 		}
 	}
-
 	for (int i = 0; i < ld->totloop; i++, tld++) {
 		sub_v3_v3v3(tld->nloc, target, tld->loc);
 		normalize_v3(tld->nloc);
@@ -6048,11 +6068,21 @@ static void apply_point_normals(bContext *C, wmOperator *op, float target[3], bo
 			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);
+			BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[tld->loop_index], tld->nloc, tld->clnors_data);
 		}
 	}
 }
 
+static void point_normals_free(bContext *C, wmOperator *op)
+{
+	LoopNormalData *ld = op->customdata;
+	MEM_freeN(ld->normal);
+	MEM_freeN(ld);
+	op->customdata = NULL;
+
+	ED_area_headerprint(CTX_wm_area(C), NULL);
+}
+
 static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
 	View3D *v3d = CTX_wm_view3d(C);
@@ -6060,20 +6090,18 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
 	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");
+	bool handled = false;
+	PropertyRNA *prop = RNA_struct_find_property(op->ptr, "Target Location");
 
 	if (ele_ref) {
 		BMElem *ele_new = BM_mesh_active_elem_get(bm);
 		if (ele_ref == ele_new) {
 			ele_ref = NULL;
+			point_normals_free

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list