forked from bartvdbraak/blender
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:
parent
2b226d9578
commit
91bbaaa271
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user