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); } diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index a2d545d51c0..b20e5cebdc5 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -178,7 +178,12 @@ void Mesh::add_face_normals() float3 v1 = verts_ptr[t.v[1]]; float3 v2 = verts_ptr[t.v[2]]; - fN[i] = normalize(cross(v1 - v0, v2 - v0)); + float3 norm = cross(v1 - v0, v2 - v0); + float normlen = len(norm); + if(normlen == 0.0f) + fN[i] = make_float3(0.0f, 0.0f, 0.0f); + else + fN[i] = norm / normlen; if(flip) fN[i] = -fN[i];