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
path: root/intern
diff options
context:
space:
mode:
authorStuart Broadfoot <gbroadfoot@hotmail.com>2013-01-01 23:44:09 +0400
committerStuart Broadfoot <gbroadfoot@hotmail.com>2013-01-01 23:44:09 +0400
commit178a877a95c15e386f4e68d4094391e5265770fa (patch)
tree7555a4f01d97535ea209b3cba2f1e6d47f1ce06f /intern
parent247c7078bc1ae60a21748f16f331390d4f46d212 (diff)
Fix to prevent undefined normals being generated with `add_face_normals()', from triangles with zero area.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/blender/blender_mesh.cpp17
-rw-r--r--intern/cycles/render/mesh.cpp7
2 files changed, 19 insertions, 5 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);
}
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];