[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