[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60177] trunk/blender/intern/cycles/bvh/ bvh_build.cpp: Fix #36738: object ray visibility flags not working in cycles viewport if there

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Sep 16 23:05:43 CEST 2013


Revision: 60177
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60177
Author:   blendix
Date:     2013-09-16 21:05:43 +0000 (Mon, 16 Sep 2013)
Log Message:
-----------
Fix #36738: object ray visibility flags not working in cycles viewport if there
is only a single object in the scene.

Modified Paths:
--------------
    trunk/blender/intern/cycles/bvh/bvh_build.cpp

Modified: trunk/blender/intern/cycles/bvh/bvh_build.cpp
===================================================================
--- trunk/blender/intern/cycles/bvh/bvh_build.cpp	2013-09-16 21:05:42 UTC (rev 60176)
+++ trunk/blender/intern/cycles/bvh/bvh_build.cpp	2013-09-16 21:05:43 UTC (rev 60177)
@@ -284,9 +284,13 @@
 	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 @@
 		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 */




More information about the Bf-blender-cvs mailing list