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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to