forked from bartvdbraak/blender
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.
This commit is contained in:
parent
ab7ebf2b10
commit
01a0649354
@ -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,
|
||||
|
@ -345,6 +345,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]];
|
||||
|
@ -120,6 +120,13 @@ float3 Mesh::Triangle::compute_normal(const float3 *verts) const
|
||||
return norm / normlen;
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -72,6 +72,8 @@ public:
|
||||
float3 r_verts[3]) const;
|
||||
|
||||
float3 compute_normal(const float3 *verts) const;
|
||||
|
||||
bool valid(const float3 *verts) const;
|
||||
};
|
||||
|
||||
Triangle get_triangle(size_t i) const
|
||||
|
Loading…
Reference in New Issue
Block a user