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.
This commit is contained in:
Sergey Sharybin 2015-03-31 00:21:04 +05:00
parent 5ca59f7134
commit abb92632f8
Notes: blender-bot 2023-02-14 09:19:01 +01:00
Referenced by issue #44193, Hair intersection with duplis causes flickering
1 changed files with 11 additions and 6 deletions

View File

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