Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2015-02-06 22:14:18 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2015-02-06 22:14:18 +0300
commita42553f986baa8f457b2b9db0b97d8e86bfca1cf (patch)
treefa3f1069c55fbc5417a4cb0d2cc9c9b12b8a7c2b /source/blender/bmesh
parentb12f3cbee73633d663f9b3811827deaf79f3031b (diff)
Fix T43579: FBX Export shading issue (Broken normals?)
Error in custom split normals work, non-autosmooth normals != vertex normals! Loops from flat faces shall take normal of their face, not their vertex. Tsst...
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 6700ffe314e..9a2869b64ef 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -815,7 +815,8 @@ static void bm_mesh_loops_calc_normals(
}
}
-static void bm_mesh_loops_from_vert_normals(BMesh *bm, const float (*vnos)[3], float (*r_lnos)[3])
+static void bm_mesh_loops_calc_normals_no_autosmooth(
+ BMesh *bm, const float (*vnos)[3], const float (*fnos)[3], float (*r_lnos)[3])
{
BMIter fiter;
BMFace *f_curr;
@@ -825,15 +826,20 @@ static void bm_mesh_loops_from_vert_normals(BMesh *bm, const float (*vnos)[3], f
if (vnos) {
htype |= BM_VERT;
}
+ if (fnos) {
+ htype |= BM_FACE;
+ }
BM_mesh_elem_index_ensure(bm, htype);
}
BM_ITER_MESH (f_curr, &fiter, bm, BM_FACES_OF_MESH) {
BMLoop *l_curr, *l_first;
+ const bool is_face_flat = !BM_elem_flag_test(f_curr, BM_ELEM_SMOOTH);
l_curr = l_first = BM_FACE_FIRST_LOOP(f_curr);
do {
- const float *no = vnos ? vnos[BM_elem_index_get(l_curr->v)] : l_curr->v->no;
+ const float *no = is_face_flat ? (fnos ? fnos[BM_elem_index_get(f_curr)] : f_curr->no) :
+ (vnos ? vnos[BM_elem_index_get(l_curr->v)] : l_curr->v->no);
copy_v3_v3(r_lnos[BM_elem_index_get(l_curr)], no);
} while ((l_curr = l_curr->next) != l_first);
@@ -863,7 +869,7 @@ void BM_mesh_loop_normals_update(
}
else {
BLI_assert(!r_lnors_spacearr);
- bm_mesh_loops_from_vert_normals(bm, NULL, r_lnos);
+ bm_mesh_loops_calc_normals_no_autosmooth(bm, NULL, NULL, r_lnos);
}
}
#endif
@@ -891,7 +897,7 @@ void BM_loops_calc_normal_vcos(
}
else {
BLI_assert(!r_lnors_spacearr);
- bm_mesh_loops_from_vert_normals(bm, vnos, r_lnos);
+ bm_mesh_loops_calc_normals_no_autosmooth(bm, vnos, fnos, r_lnos);
}
}