diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-02-20 13:56:02 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-02-20 13:56:02 +0300 |
commit | 696836af1dbda1ed104167f9eb535d4603d23f49 (patch) | |
tree | 1401d609a921b8450eed52b12f2bbf8461ea664a | |
parent | 75ce4ebc1221445028b74e9ef2504663e0c99bcf (diff) |
Fix T50718: Regression: Split Normals Render Problem with Cycles
The issue seems to be caused by vertex normal being re-calculated
to something else than loop normal, which also caused wrong loop
normals after re-calculation.
For now issue is solved by preserving CD_NORMAL for loops after
split_faces() is finished, so render engine can access original
proper value.
-rw-r--r-- | intern/cycles/blender/blender_util.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 7 |
2 files changed, 3 insertions, 5 deletions
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h index 4411181dbcc..8120de96362 100644 --- a/intern/cycles/blender/blender_util.h +++ b/intern/cycles/blender/blender_util.h @@ -80,7 +80,6 @@ static inline BL::Mesh object_to_mesh(BL::BlendData& data, } else { me.split_faces(); - me.calc_normals_split(); } } if(subdivision_type == Mesh::SUBDIVISION_NONE) { diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 5a3f7fabcb0..73fcd7615f7 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -2334,6 +2334,9 @@ static void split_faces_split_edges(Mesh *mesh, /* Split faces based on the edge angle. * Matches behavior of face splitting in render engines. + * + * NOTE: Will leave CD_NORMAL loop data layer which is + * used by render engines to set shading up. */ void BKE_mesh_split_faces(Mesh *mesh) { @@ -2377,10 +2380,6 @@ void BKE_mesh_split_faces(Mesh *mesh) /* Perform actual split of vertices and adjacent edges. */ split_faces_split_verts(mesh, num_new_verts, vert_flags); split_faces_split_edges(mesh, num_new_edges, edge_flags); - /* CD_NORMAL is expected to be temporary only, and it's invalid at - * this point anyway. - */ - CustomData_free_layers(&mesh->ldata, CD_NORMAL, mesh->totloop); MEM_freeN(vert_flags); MEM_freeN(edge_flags); #ifdef VALIDATE_MESH |