diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-11-12 18:29:52 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-11-12 18:29:52 +0400 |
commit | fc42a6185ddeb6a24ec92287dfa7b89beb059716 (patch) | |
tree | cdd34b01d77f6c104ed38c30719426c11c01a96e /intern/cycles/render/mesh.cpp | |
parent | 817b6cb9a8990483a2bfce7a11e690c829e75ddc (diff) |
Cycles:
* Fix object scaling update issue with interactive rendering + static BVH.
* Fix negative scaling issue with static BVH.
* Fix #29217: excessive fireflies in first sample.
Diffstat (limited to 'intern/cycles/render/mesh.cpp')
-rw-r--r-- | intern/cycles/render/mesh.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 2fef54605a1..19992771c1d 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -42,6 +42,7 @@ Mesh::Mesh() { need_update = true; transform_applied = false; + transform_negative_scaled = false; displacement_method = DISPLACE_BUMP; bvh = NULL; @@ -75,6 +76,9 @@ void Mesh::clear() attributes.clear(); used_shaders.clear(); + + transform_applied = false; + transform_negative_scaled = false; } void Mesh::add_triangle(int v0, int v1, int v2, int shader_, bool smooth_) @@ -116,6 +120,7 @@ void Mesh::add_face_normals() /* compute face normals */ size_t triangles_size = triangles.size(); + bool flip = transform_negative_scaled; if(triangles_size) { float3 *verts_ptr = &verts[0]; @@ -128,6 +133,9 @@ void Mesh::add_face_normals() float3 v2 = verts_ptr[t.v[2]]; fN[i] = normalize(cross(v1 - v0, v2 - v0)); + + if(flip) + fN[i] = -fN[i]; } } } @@ -150,6 +158,7 @@ void Mesh::add_vertex_normals() size_t verts_size = verts.size(); size_t triangles_size = triangles.size(); + bool flip = transform_negative_scaled; if(triangles_size) { Triangle *triangles_ptr = &triangles[0]; @@ -159,8 +168,11 @@ void Mesh::add_vertex_normals() vN[triangles_ptr[i].v[j]] += fN[i]; } - for(size_t i = 0; i < verts_size; i++) + for(size_t i = 0; i < verts_size; i++) { vN[i] = normalize(vN[i]); + if(flip) + vN[i] = -vN[i]; + } } void Mesh::pack_normals(Scene *scene, float4 *normal, float4 *vnormal) |