Fix T52452: OSL trace broken after shadow catcher recent changes.
We should only early out with any hit in BVH traversal if the only visibility bits used are opaque shadow. Not when opaque shadow is one of multiple bits.
This commit is contained in:
@@ -244,14 +244,14 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
|
||||
{
|
||||
/* shadow ray early termination */
|
||||
#if defined(__KERNEL_SSE2__)
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
return true;
|
||||
tsplat = ssef(0.0f, 0.0f, -isect->t, -isect->t);
|
||||
# if BVH_FEATURE(BVH_HAIR)
|
||||
tfar = ssef(isect->t);
|
||||
# endif
|
||||
#else
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
@@ -274,14 +274,14 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
|
||||
{
|
||||
/* shadow ray early termination */
|
||||
# if defined(__KERNEL_SSE2__)
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
return true;
|
||||
tsplat = ssef(0.0f, 0.0f, -isect->t, -isect->t);
|
||||
# if BVH_FEATURE(BVH_HAIR)
|
||||
tfar = ssef(isect->t);
|
||||
# endif
|
||||
# else
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
return true;
|
||||
# endif
|
||||
}
|
||||
@@ -328,14 +328,14 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
|
||||
if(hit) {
|
||||
/* shadow ray early termination */
|
||||
# if defined(__KERNEL_SSE2__)
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
return true;
|
||||
tsplat = ssef(0.0f, 0.0f, -isect->t, -isect->t);
|
||||
# if BVH_FEATURE(BVH_HAIR)
|
||||
tfar = ssef(isect->t);
|
||||
# endif
|
||||
# else
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
return true;
|
||||
# endif
|
||||
}
|
||||
|
@@ -340,7 +340,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
|
||||
prim_addr)) {
|
||||
tfar = ssef(isect->t);
|
||||
/* Shadow ray early termination. */
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE) {
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -362,7 +362,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
|
||||
prim_addr)) {
|
||||
tfar = ssef(isect->t);
|
||||
/* Shadow ray early termination. */
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE) {
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -409,7 +409,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
|
||||
if(hit) {
|
||||
tfar = ssef(isect->t);
|
||||
/* Shadow ray early termination. */
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE) {
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user