diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-12-27 21:33:50 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-12-27 21:33:50 +0300 |
commit | 91bbaaa271d348776269a125a9e545a3a4edcce8 (patch) | |
tree | 22802c30e08037bef821343bba236815fb58f8c9 | |
parent | 2b226d95786fd5e8dd846ffbe990c3e1bb1fd35e (diff) |
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.
-rw-r--r-- | intern/cycles/kernel/geom/geom_qbvh_shadow.h | 15 | ||||
-rw-r--r-- | intern/cycles/kernel/geom/geom_qbvh_traversal.h | 16 |
2 files changed, 17 insertions, 14 deletions
diff --git a/intern/cycles/kernel/geom/geom_qbvh_shadow.h b/intern/cycles/kernel/geom/geom_qbvh_shadow.h index 2d1ad498972..09d05f17e89 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 fdb22725ceb..9989f83c031 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; |