Commit: abb92632f8cf5d988a99c474be8b5e94797147cf
Author: Sergey Sharybin
Date:   Tue Mar 31 00:21:04 2015 +0500
Branches: blender-v2.74-release
https://developer.blender.org/rBabb92632f8cf5d988a99c474be8b5e94797147cf

Fix T44193: Hair intersection with duplis causes flickering

It was an issue with what bounds to use for BVH node during construction.

Also corrected case when there are all 4 primitive types in the range and
also there're objects in the same range.

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

M       intern/cycles/bvh/bvh_build.cpp

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

diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp
index 4ce8f78..f9a761b 100644
--- a/intern/cycles/bvh/bvh_build.cpp
+++ b/intern/cycles/bvh/bvh_build.cpp
@@ -577,17 +577,22 @@ BVHNode* BVHBuild::create_leaf_node(const BVHRange& range)
                return new InnerNode(range.bounds(), leaves[0], leaves[1]);
        }
        else if(num_leaves == 3) {
-               BoundBox inner_bounds = merge(bounds[1], bounds[2]);
+               BoundBox inner_bounds = merge(leaves[1]->m_bounds, 
leaves[2]->m_bounds);
                BVHNode *inner = new InnerNode(inner_bounds, leaves[1], 
leaves[2]);
                return new InnerNode(range.bounds(), leaves[0], inner);
-       } else /*if(num_leaves == 4)*/ {
+       } else {
                /* Shpuld be doing more branches if more primitive types added. 
*/
-               assert(num_leaves == 4);
-               BoundBox inner_bounds_a = merge(bounds[0], bounds[1]);
-               BoundBox inner_bounds_b = merge(bounds[2], bounds[3]);
+               assert(num_leaves <= 5);
+               BoundBox inner_bounds_a = merge(leaves[0]->m_bounds, 
leaves[1]->m_bounds);
+               BoundBox inner_bounds_b = merge(leaves[2]->m_bounds, 
leaves[3]->m_bounds);
                BVHNode *inner_a = new InnerNode(inner_bounds_a, leaves[0], 
leaves[1]);
                BVHNode *inner_b = new InnerNode(inner_bounds_b, leaves[2], 
leaves[3]);
-               return new InnerNode(range.bounds(), inner_a, inner_b);
+               BoundBox inner_bounds_c = merge(inner_a->m_bounds, 
inner_b->m_bounds);
+               BVHNode *inner_c = new InnerNode(inner_bounds_c, inner_a, 
inner_b);
+               if(num_leaves == 5) {
+                       return new InnerNode(range.bounds(), inner_c, 
leaves[4]);
+               }
+               return inner_c;
        }
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to