17 const int child_addr = node_addr + child * 3;
30 const uint visibility,
35#ifdef __VISIBILITY_FLAG__
43 float c0lox = (node0.
x -
P.x) * idir.
x;
44 float c0hix = (node0.
z -
P.x) * idir.
x;
45 float c0loy = (node1.
x -
P.y) * idir.
y;
46 float c0hiy = (node1.
z -
P.y) * idir.
y;
47 float c0loz = (node2.
x -
P.z) * idir.
z;
48 float c0hiz = (node2.
z -
P.z) * idir.
z;
49 float c0min =
max4(tmin,
min(c0lox, c0hix),
min(c0loy, c0hiy),
min(c0loz, c0hiz));
50 float c0max =
min4(tmax,
max(c0lox, c0hix),
max(c0loy, c0hiy),
max(c0loz, c0hiz));
52 float c1lox = (node0.
y -
P.x) * idir.
x;
53 float c1hix = (node0.
w -
P.x) * idir.
x;
54 float c1loy = (node1.
y -
P.y) * idir.
y;
55 float c1hiy = (node1.
w -
P.y) * idir.
y;
56 float c1loz = (node2.
y -
P.z) * idir.
z;
57 float c1hiz = (node2.
w -
P.z) * idir.
z;
58 float c1min =
max4(tmin,
min(c1lox, c1hix),
min(c1loy, c1hiy),
min(c1loz, c1hiz));
59 float c1max =
min4(tmax,
max(c1lox, c1hix),
max(c1loy, c1hiy),
max(c1loz, c1hiz));
64#ifdef __VISIBILITY_FLAG__
66 return (((c0max >= c0min) && (
__float_as_uint(cnodes.
x) & visibility)) ? 1 : 0) |
69 return ((c0max >= c0min) ? 1 : 0) | ((c1max >= c1min) ? 2 : 0);
86 float3 lower_xyz = aligned_P * nrdir;
87 float3 upper_xyz = lower_xyz - nrdir;
88 const float near_x =
min(lower_xyz.
x, upper_xyz.
x);
89 const float near_y =
min(lower_xyz.
y, upper_xyz.
y);
90 const float near_z =
min(lower_xyz.
z, upper_xyz.
z);
91 const float far_x =
max(lower_xyz.
x, upper_xyz.
x);
92 const float far_y =
max(lower_xyz.
y, upper_xyz.
y);
93 const float far_z =
max(lower_xyz.
z, upper_xyz.
z);
94 const float tnear =
max4(tmin, near_x, near_y, near_z);
95 const float tfar =
min4(tmax, far_x, far_y, far_z);
106 const uint visibility,
110#ifdef __VISIBILITY_FLAG__
114#ifdef __VISIBILITY_FLAG__
122#ifdef __VISIBILITY_FLAG__
139 const uint visibility,
#define ccl_device_forceinline
#define kernel_data_fetch(name, index)
const ThreadKernelGlobalsCPU * KernelGlobals
#define CCL_NAMESPACE_END
ccl_device_inline float3 bvh_inverse_direction(const float3 dir)
@ PATH_RAY_NODE_UNALIGNED
ccl_device_inline T min4(const T &a, const T &b, const T &c, const T &d)
ccl_device_inline T max4(const T &a, const T &b, const T &c, const T &d)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
ccl_device_forceinline int bvh_unaligned_node_intersect(KernelGlobals kg, const float3 P, const float3 dir, const float tmin, const float tmax, const int node_addr, const uint visibility, float dist[2])
ccl_device_forceinline int bvh_aligned_node_intersect(KernelGlobals kg, const float3 P, const float3 idir, const float tmin, const float tmax, const int node_addr, const uint visibility, float dist[2])
ccl_device_forceinline int bvh_node_intersect(KernelGlobals kg, const float3 P, const float3 dir, const float3 idir, const float tmin, const float tmax, const int node_addr, const uint visibility, float dist[2])
ccl_device_forceinline bool bvh_unaligned_node_intersect_child(KernelGlobals kg, const float3 P, const float3 dir, const float tmin, const float tmax, const int node_addr, const int child, float dist[2])
CCL_NAMESPACE_BEGIN ccl_device_forceinline Transform bvh_unaligned_node_fetch_space(KernelGlobals kg, const int node_addr, const int child)