Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-12-27 21:33:50 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2014-12-27 21:33:50 +0300
commit91bbaaa271d348776269a125a9e545a3a4edcce8 (patch)
tree22802c30e08037bef821343bba236815fb58f8c9
parent2b226d95786fd5e8dd846ffbe990c3e1bb1fd35e (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.h15
-rw-r--r--intern/cycles/kernel/geom/geom_qbvh_traversal.h16
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;