Fix to prevent undefined normals being generated with `add_face_normals()', from triangles with zero area.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user