Commit: 075950ad66b02cea5aa436e04221d94571f55409
Author: Sergey Sharybin
Date:   Wed Oct 18 12:19:53 2017 +0200
Branches: blender-v2.79a-release
https://developer.blender.org/rB075950ad66b02cea5aa436e04221d94571f55409

Cycles: Fix wrong shading when some mesh triangle has non-finite coordinate

This is fully unpredictable for artists when one damaged object makes the whole
scene to render incorrectly. This involves two main changes:

- It is not enough to check triangle bounds to be valid when building BVH.
  This is because triangle might have some finite vertices and some non-finite.

- We shouldn't add non-finite triangle area to the overall area for MIS.

===================================================================

M       intern/cycles/bvh/bvh_build.cpp
M       intern/cycles/render/light.cpp
M       intern/cycles/render/mesh.cpp
M       intern/cycles/render/mesh.h

===================================================================

diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp
index 224dcbaf3fc..ab0e2ddd7cf 100644
--- a/intern/cycles/bvh/bvh_build.cpp
+++ b/intern/cycles/bvh/bvh_build.cpp
@@ -129,7 +129,7 @@ void BVHBuild::add_reference_triangles(BoundBox& root, 
BoundBox& center, Mesh *m
                if(attr_mP == NULL) {
                        BoundBox bounds = BoundBox::empty;
                        t.bounds_grow(verts, bounds);
-                       if(bounds.valid()) {
+                       if(bounds.valid() && t.valid(verts)) {
                                references.push_back(BVHReference(bounds,
                                                                  j,
                                                                  i,
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index 93d88c5642c..aeaf303bce2 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -348,6 +348,9 @@ void LightManager::device_update_distribution(Device 
*device, DeviceScene *dscen
                                offset++;
 
                                Mesh::Triangle t = mesh->get_triangle(i);
+                               if(!t.valid(&mesh->verts[0])) {
+                                       continue;
+                               }
                                float3 p1 = mesh->verts[t.v[0]];
                                float3 p2 = mesh->verts[t.v[1]];
                                float3 p3 = mesh->verts[t.v[2]];
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 03825f780e0..d160b4d4139 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -107,6 +107,13 @@ void Mesh::Triangle::verts_for_step(const float3 *verts,
        }
 }
 
+bool Mesh::Triangle::valid(const float3 *verts) const
+{
+       return isfinite3_safe(verts[v[0]]) &&
+              isfinite3_safe(verts[v[1]]) &&
+              isfinite3_safe(verts[v[2]]);
+}
+
 /* Curve */
 
 void Mesh::Curve::bounds_grow(const int k, const float3 *curve_keys, const 
float *curve_radius, BoundBox& bounds) const
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 043ce9d0ffc..f079021c915 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -70,6 +70,8 @@ public:
                                    size_t num_steps,
                                    size_t step,
                                    float3 r_verts[3]) const;
+
+               bool valid(const float3 *verts) const;
        };
 
        Triangle get_triangle(size_t i) const

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to