[Bf-blender-cvs] [abb9263] blender-v2.74-release: Fix T44193: Hair intersection with duplis causes flickering

Sergey Sharybin noreply at git.blender.org
Tue Mar 31 15:19:01 CEST 2015


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;
 	}
 }




More information about the Bf-blender-cvs mailing list