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 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;
|
||||||
|
Loading…
Reference in New Issue
Block a user