diff options
author | Stuart Broadfoot <gbroadfoot@hotmail.com> | 2013-01-01 23:44:09 +0400 |
---|---|---|
committer | Stuart Broadfoot <gbroadfoot@hotmail.com> | 2013-01-01 23:44:09 +0400 |
commit | 178a877a95c15e386f4e68d4094391e5265770fa (patch) | |
tree | 7555a4f01d97535ea209b3cba2f1e6d47f1ce06f /intern/cycles/blender/blender_mesh.cpp | |
parent | 247c7078bc1ae60a21748f16f331390d4f46d212 (diff) |
Fix to prevent undefined normals being generated with `add_face_normals()', from triangles with zero area.
Diffstat (limited to 'intern/cycles/blender/blender_mesh.cpp')
-rw-r--r-- | intern/cycles/blender/blender_mesh.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index e9250ec3eff..a01b2e9ee38 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -223,10 +223,19 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector< int shader = used_shaders[mi]; bool smooth = f->use_smooth(); - mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth); - - if(n == 4) - mesh->add_triangle(vi[0], vi[2], vi[3], shader, smooth); + if(n == 4) { + if(len_squared(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) == 0.0f || + len_squared(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])) == 0.0f) { + mesh->add_triangle(vi[0], vi[1], vi[3], shader, smooth); + mesh->add_triangle(vi[2], vi[3], vi[1], shader, smooth); + } + else { + mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth); + mesh->add_triangle(vi[0], vi[2], vi[3], shader, smooth); + } + } + else + mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth); nverts.push_back(n); } |