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