diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-02-22 12:53:28 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-02-22 12:54:36 +0300 |
commit | 36c4fc1ea9d987ec88b27c04927ac44e12a49778 (patch) | |
tree | fc91b50d4e4e13c08980f7ac9f34463abaad4291 /source/blender/blenkernel | |
parent | 2c30fd83f1513b4e9f146024501b15bd31ee4804 (diff) |
Cycles: Fix shading with autosmooth and custom normals
New logic of split_faces was leaving mesh in a proper state
from Blender's point of view, but Cycles wanted loop normals
to be "flushed" to vertex normals.
Now we do such a flush from Cycles side again, so we don't
leave bad meshes behind.
Thanks Bastien for assistance here!
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 6 |
2 files changed, 5 insertions, 3 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index e42692622f4..b83bec5a302 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -131,7 +131,7 @@ bool BKE_mesh_uv_cdlayer_rename(struct Mesh *me, const char *old_name, const cha float (*BKE_mesh_vertexCos_get(const struct Mesh *me, int *r_numVerts))[3]; -void BKE_mesh_split_faces(struct Mesh *mesh); +void BKE_mesh_split_faces(struct Mesh *mesh, bool free_loop_normals); struct Mesh *BKE_mesh_new_from_object(struct Main *bmain, struct Scene *sce, struct Object *ob, int apply_modifiers, int settings, int calc_tessface, int calc_undeformed); diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 7a27c43e28f..918032b2df8 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -2338,7 +2338,7 @@ static void split_faces_split_new_edges( * 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) +void BKE_mesh_split_faces(Mesh *mesh, bool free_loop_normals) { const int num_polys = mesh->totpoly; @@ -2392,7 +2392,9 @@ void BKE_mesh_split_faces(Mesh *mesh) /* Note: after this point mesh is expected to be valid again. */ /* CD_NORMAL is expected to be temporary only. */ - CustomData_free_layers(&mesh->ldata, CD_NORMAL, mesh->totloop); + if (free_loop_normals) { + CustomData_free_layers(&mesh->ldata, CD_NORMAL, mesh->totloop); + } if (lnors_spacearr) { /* Also frees new_verts/edges temp data, since we used its memarena to allocate them. */ |