Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-09-17 01:05:43 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-09-17 01:05:43 +0400
commit2228c455f98f4987a7b6acc8f1d4d1b57079d832 (patch)
treed770c6ba5b3cd4c0ffe795e364b1a045c3ee6b63 /intern
parent2513886f437d66e2609eac37f75c92d7c0ace648 (diff)
Fix #36738: object ray visibility flags not working in cycles viewport if there
is only a single object in the scene.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/bvh/bvh_build.cpp26
1 files changed, 17 insertions, 9 deletions
diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp
index 022c4c8d294..5d0e461fba3 100644
--- a/intern/cycles/bvh/bvh_build.cpp
+++ b/intern/cycles/bvh/bvh_build.cpp
@@ -284,9 +284,13 @@ BVHNode* BVHBuild::build_node(const BVHObjectBinning& range, int level)
float leafSAH = params.sah_triangle_cost * range.leafSAH;
float splitSAH = params.sah_node_cost * range.bounds().half_area() + params.sah_triangle_cost * range.splitSAH;
- /* make leaf node when threshold reached or SAH tells us */
- if(params.small_enough_for_leaf(size, level) || (size <= params.max_leaf_size && leafSAH < splitSAH))
- return create_leaf_node(range);
+ /* have at least one inner node on top level, for performance and correct
+ * visibility tests, since object instances do not check visibility flag */
+ if(!(params.top_level && level == 0)) {
+ /* make leaf node when threshold reached or SAH tells us */
+ if(params.small_enough_for_leaf(size, level) || (size <= params.max_leaf_size && leafSAH < splitSAH))
+ return create_leaf_node(range);
+ }
/* perform split */
BVHObjectBinning left, right;
@@ -322,17 +326,21 @@ BVHNode* BVHBuild::build_node(const BVHRange& range, int level)
return NULL;
/* small enough or too deep => create leaf. */
- if(params.small_enough_for_leaf(range.size(), level)) {
- progress_count += range.size();
- return create_leaf_node(range);
+ if(!(params.top_level && level == 0)) {
+ if(params.small_enough_for_leaf(range.size(), level)) {
+ progress_count += range.size();
+ return create_leaf_node(range);
+ }
}
/* splitting test */
BVHMixedSplit split(this, range, level);
- if(split.no_split) {
- progress_count += range.size();
- return create_leaf_node(range);
+ if(!(params.top_level && level == 0)) {
+ if(split.no_split) {
+ progress_count += range.size();
+ return create_leaf_node(range);
+ }
}
/* do split */