[Bf-blender-cvs] [8b4d448ec70] soc-2017-normal-tools: Fixed issues with set_normal_from_faces

Rohan Rathi noreply at git.blender.org
Fri Jul 28 20:12:25 CEST 2017


Commit: 8b4d448ec70fe5e000d74e05333757d3cdbbe806
Author: Rohan Rathi
Date:   Fri Jul 28 23:42:01 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB8b4d448ec70fe5e000d74e05333757d3cdbbe806

Fixed issues with set_normal_from_faces

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

M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/modifiers/intern/MOD_weighted_normal.c

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

diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index f34c8b495fc..16b4167216f 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -6793,27 +6793,13 @@ static int edbm_set_normals_from_faces_exec(bContext *C, wmOperator *op)
 	BMFace *f;
 	BMVert *v;
 	BMEdge *e;
-	BMLoop *l;
-	BMIter fiter, viter, eiter, liter;
-	int index;
+	BMIter fiter, viter, eiter;
 
 	const bool keep_sharp = RNA_boolean_get(op->ptr, "keep_sharp");
-	BLI_bitmap *faces_sharp = BLI_BITMAP_NEW(bm->totface, __func__);
 
 	BM_lnorspace_update(bm);
 	BM_mesh_elem_index_ensure(bm, BM_ALL);
 
-	BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
-		bool all_edge_mark = true;
-		BM_ITER_ELEM(e, &eiter, f, BM_EDGES_OF_FACE) {
-			if (BM_elem_flag_test(e, BM_ELEM_SMOOTH))
-				all_edge_mark = false;
-		}
-		if (all_edge_mark) {
-			BLI_BITMAP_ENABLE(faces_sharp, BM_elem_index_get(f));
-		}
-	}
-
 	float(*vnors)[3] = MEM_callocN(sizeof(*vnors) * bm->totvert, "__func__");
 	BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
 		if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
@@ -6830,19 +6816,24 @@ static int edbm_set_normals_from_faces_exec(bContext *C, wmOperator *op)
 
 	int cd_clnors_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
 
-	BM_ITER_MESH_INDEX(v, &viter, bm, BM_VERTS_OF_MESH, index) {
-		BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
-			if (keep_sharp && BLI_BITMAP_TEST(faces_sharp, BM_elem_index_get(l->f)))
-				continue;
-
-			if (!is_zero_v3(vnors[index])) {
-				short *clnors = BM_ELEM_CD_GET_VOID_P(l, cd_clnors_offset);
-				int l_index = BM_elem_index_get(l);
-				BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[l_index], vnors[index], clnors);
+	BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
+		BM_ITER_ELEM(e, &eiter, f, BM_EDGES_OF_FACE) {
+			if (!keep_sharp || BM_elem_flag_test(e, BM_ELEM_SMOOTH)
+					&& BM_elem_flag_test(e, BM_ELEM_SELECT)) {
+
+				BM_ITER_ELEM(v, &viter, e, BM_VERTS_OF_EDGE) {
+					BMLoop *l = BM_face_vert_share_loop(f, v);
+					int loop_index = BM_elem_index_get(l);
+					int v_index = BM_elem_index_get(l->v);
+					if (!is_zero_v3(vnors[v_index])) {
+						short *clnors = BM_ELEM_CD_GET_VOID_P(l, cd_clnors_offset);
+						BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[loop_index], vnors[v_index], clnors);
+					}
+				}
 			}
-		 }
+		}
 	}
-	MEM_freeN(faces_sharp);
+
 	MEM_freeN(vnors);
 	EDBM_update_generic(em, true, false);
 
diff --git a/source/blender/modifiers/intern/MOD_weighted_normal.c b/source/blender/modifiers/intern/MOD_weighted_normal.c
index 6b42307332e..e0cd81abc79 100644
--- a/source/blender/modifiers/intern/MOD_weighted_normal.c
+++ b/source/blender/modifiers/intern/MOD_weighted_normal.c
@@ -129,6 +129,7 @@ static void WeightedNormal_FaceArea(
 
 	for (int mp_index = 0; mp_index < numPoly; mp_index++) {
 		face_area[mp_index].val = BKE_mesh_calc_poly_area(&mpoly[mp_index], &mloop[mpoly[mp_index].loopstart], mvert);
+		face_area[mp_index].val *= (mpoly[mp_index].flag ^ (1 << 0));
 		face_area[mp_index].index = mp_index;
 	}
 
@@ -154,7 +155,8 @@ static void WeightedNormal_CornerAngle(WeightedNormalModifierData *wnmd, Object
 
 		for (int i = l_start; i < l_start + mpoly[mp_index].totloop; i++) {
 			corner_angle[i].val = (float)M_PI - index_angle[i];
-			corner_angle[i].index = i;
+			corner_angle[i].val *= (mpoly[mp_index].flag ^ (1 << 0));
+			corner_angle[i].index = i; 
 			index_angle[i] = (float)mp_index;
 		}
 	}
@@ -183,6 +185,7 @@ static void WeightedNormal_FacewithAngle(WeightedNormalModifierData *wnmd, Objec
 
 		for (int i = l_start; i < l_start + mpoly[mp_index].totloop; i++) {
 			combined[i].val = ((float)M_PI - index_angle[i]) * face_area;		// in this case val is product of corner angle and face area
+			combined[i].val *= (mpoly[mp_index].flag ^ (1 << 0));
 			combined[i].index = i;
 			index_angle[i] = (float)mp_index;
 		}




More information about the Bf-blender-cvs mailing list