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.
This commit is contained in:
Sergey Sharybin 2014-12-27 23:33:50 +05:00
parent 2b226d9578
commit 91bbaaa271
2 changed files with 17 additions and 14 deletions

@ -194,6 +194,15 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
/* If node is leaf, fetch triangle list. */ /* If node is leaf, fetch triangle list. */
if(nodeAddr < 0) { if(nodeAddr < 0) {
float4 leaf = kernel_tex_fetch(__bvh_nodes, (-nodeAddr-1)*BVH_QNODE_SIZE+6); 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); int primAddr = __float_as_int(leaf.x);
#if BVH_FEATURE(BVH_INSTANCING) #if BVH_FEATURE(BVH_INSTANCING)
@ -205,12 +214,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
nodeAddr = traversalStack[stackPtr].addr; nodeAddr = traversalStack[stackPtr].addr;
--stackPtr; --stackPtr;
#ifdef __VISIBILITY_FLAG__
if((__float_as_uint(leaf.z) & PATH_RAY_SHADOW) == 0) {
continue;
}
#endif
/* Primitive intersection. */ /* Primitive intersection. */
while(primAddr < primAddr2) { while(primAddr < primAddr2) {
bool hit; bool hit;

@ -247,7 +247,14 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
/* If node is leaf, fetch triangle list. */ /* If node is leaf, fetch triangle list. */
if(nodeAddr < 0) { 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. */ /* Pop. */
nodeAddr = traversalStack[stackPtr].addr; nodeAddr = traversalStack[stackPtr].addr;
nodeDist = traversalStack[stackPtr].dist; nodeDist = traversalStack[stackPtr].dist;
@ -255,7 +262,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
continue; continue;
} }
float4 leaf = kernel_tex_fetch(__bvh_nodes, (-nodeAddr-1)*BVH_QNODE_SIZE+6);
int primAddr = __float_as_int(leaf.x); int primAddr = __float_as_int(leaf.x);
#if BVH_FEATURE(BVH_INSTANCING) #if BVH_FEATURE(BVH_INSTANCING)
@ -268,12 +274,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
nodeDist = traversalStack[stackPtr].dist; nodeDist = traversalStack[stackPtr].dist;
--stackPtr; --stackPtr;
#ifdef __VISIBILITY_FLAG__
if((__float_as_uint(leaf.z) & visibility) == 0) {
continue;
}
#endif
/* Primitive intersection. */ /* Primitive intersection. */
while(primAddr < primAddr2) { while(primAddr < primAddr2) {
bool hit; bool hit;