[Bf-blender-cvs] [91bbaaa] master: Cycles: Fix visibility check for instanced nodes

Sergey Sharybin noreply at git.blender.org
Sat Dec 27 19:35:36 CET 2014


Commit: 91bbaaa271d348776269a125a9e545a3a4edcce8
Author: Sergey Sharybin
Date:   Sat Dec 27 23:33:50 2014 +0500
Branches: master
https://developer.blender.org/rB91bbaaa271d348776269a125a9e545a3a4edcce8

Cycles: Fix visibility check for instanced nodes

The issue is that only instance node contains proper visibility flags,
nodes from instanced BVH are not correct.

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

M	intern/cycles/kernel/geom/geom_qbvh_shadow.h
M	intern/cycles/kernel/geom/geom_qbvh_traversal.h

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

diff --git a/intern/cycles/kernel/geom/geom_qbvh_shadow.h b/intern/cycles/kernel/geom/geom_qbvh_shadow.h
index 2d1ad49..09d05f1 100644
--- a/intern/cycles/kernel/geom/geom_qbvh_shadow.h
+++ b/intern/cycles/kernel/geom/geom_qbvh_shadow.h
@@ -194,6 +194,15 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 			/* If node is leaf, fetch triangle list. */
 			if(nodeAddr < 0) {
 				float4 leaf = kernel_tex_fetch(__bvh_nodes, (-nodeAddr-1)*BVH_QNODE_SIZE+6);
+#ifdef __VISIBILITY_FLAG__
+				if((__float_as_uint(leaf.z) & PATH_RAY_SHADOW) == 0) {
+					/* Pop. */
+					nodeAddr = traversalStack[stackPtr].addr;
+					--stackPtr;
+					continue;
+				}
+#endif
+
 				int primAddr = __float_as_int(leaf.x);
 
 #if BVH_FEATURE(BVH_INSTANCING)
@@ -205,12 +214,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 					nodeAddr = traversalStack[stackPtr].addr;
 					--stackPtr;
 
-#ifdef __VISIBILITY_FLAG__
-					if((__float_as_uint(leaf.z) & PATH_RAY_SHADOW) == 0) {
-						continue;
-					}
-#endif
-
 					/* Primitive intersection. */
 					while(primAddr < primAddr2) {
 						bool hit;
diff --git a/intern/cycles/kernel/geom/geom_qbvh_traversal.h b/intern/cycles/kernel/geom/geom_qbvh_traversal.h
index fdb2272..9989f83 100644
--- a/intern/cycles/kernel/geom/geom_qbvh_traversal.h
+++ b/intern/cycles/kernel/geom/geom_qbvh_traversal.h
@@ -247,7 +247,14 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 
 			/* If node is leaf, fetch triangle list. */
 			if(nodeAddr < 0) {
-				if(UNLIKELY(nodeDist > isect->t)) {
+				float4 leaf = kernel_tex_fetch(__bvh_nodes, (-nodeAddr-1)*BVH_QNODE_SIZE+6);
+
+				if(UNLIKELY((nodeDist > isect->t)
+#ifdef __VISIBILITY_FLAG__
+				            || ((__float_as_uint(leaf.z) & visibility) == 0)
+#endif
+				  ))
+				{
 					/* Pop. */
 					nodeAddr = traversalStack[stackPtr].addr;
 					nodeDist = traversalStack[stackPtr].dist;
@@ -255,7 +262,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 					continue;
 				}
 
-				float4 leaf = kernel_tex_fetch(__bvh_nodes, (-nodeAddr-1)*BVH_QNODE_SIZE+6);
 				int primAddr = __float_as_int(leaf.x);
 
 #if BVH_FEATURE(BVH_INSTANCING)
@@ -268,12 +274,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 					nodeDist = traversalStack[stackPtr].dist;
 					--stackPtr;
 
-#ifdef __VISIBILITY_FLAG__
-					if((__float_as_uint(leaf.z) & visibility) == 0) {
-						continue;
-					}
-#endif
-
 					/* Primitive intersection. */
 					while(primAddr < primAddr2) {
 						bool hit;




More information about the Bf-blender-cvs mailing list