11 const int child_addr = node_addr + child * 3;
24 const uint visibility,
29 #ifdef __VISIBILITY_FLAG__
37 float c0lox = (node0.x -
P.x) * idir.
x;
38 float c0hix = (node0.z -
P.x) * idir.
x;
39 float c0loy = (node1.x -
P.y) * idir.
y;
40 float c0hiy = (node1.z -
P.y) * idir.
y;
41 float c0loz = (node2.x -
P.z) * idir.
z;
42 float c0hiz = (node2.z -
P.z) * idir.
z;
43 float c0min =
max4(tmin,
min(c0lox, c0hix),
min(c0loy, c0hiy),
min(c0loz, c0hiz));
44 float c0max =
min4(tmax,
max(c0lox, c0hix),
max(c0loy, c0hiy),
max(c0loz, c0hiz));
46 float c1lox = (node0.y -
P.x) * idir.
x;
47 float c1hix = (node0.w -
P.x) * idir.
x;
48 float c1loy = (node1.y -
P.y) * idir.
y;
49 float c1hiy = (node1.w -
P.y) * idir.
y;
50 float c1loz = (node2.y -
P.z) * idir.
z;
51 float c1hiz = (node2.w -
P.z) * idir.
z;
52 float c1min =
max4(tmin,
min(c1lox, c1hix),
min(c1loy, c1hiy),
min(c1loz, c1hiz));
53 float c1max =
min4(tmax,
max(c1lox, c1hix),
max(c1loy, c1hiy),
max(c1loz, c1hiz));
58 #ifdef __VISIBILITY_FLAG__
60 return (((c0max >= c0min) && (
__float_as_uint(cnodes.x) & visibility)) ? 1 : 0) |
61 (((c1max >= c1min) && (
__float_as_uint(cnodes.y) & visibility)) ? 2 : 0);
63 return ((c0max >= c0min) ? 1 : 0) | ((c1max >= c1min) ? 2 : 0);
80 float3 lower_xyz = aligned_P * nrdir;
81 float3 upper_xyz = lower_xyz - nrdir;
82 const float near_x =
min(lower_xyz.
x, upper_xyz.
x);
83 const float near_y =
min(lower_xyz.
y, upper_xyz.
y);
84 const float near_z =
min(lower_xyz.
z, upper_xyz.
z);
85 const float far_x =
max(lower_xyz.
x, upper_xyz.
x);
86 const float far_y =
max(lower_xyz.
y, upper_xyz.
y);
87 const float far_z =
max(lower_xyz.
z, upper_xyz.
z);
88 const float tnear =
max4(tmin, near_x, near_y, near_z);
89 const float tfar =
min4(tmax, far_x, far_y, far_z);
101 const uint visibility,
105 #ifdef __VISIBILITY_FLAG__
109 #ifdef __VISIBILITY_FLAG__
117 #ifdef __VISIBILITY_FLAG__
134 const uint visibility,
#define ccl_device_forceinline
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
ccl_device_inline float3 bvh_inverse_direction(float3 dir)
@ PATH_RAY_NODE_UNALIGNED
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
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_unaligned_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, int node_addr, int child, 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 Transform bvh_unaligned_node_fetch_space(KernelGlobals kg, int node_addr, int child)
ccl_device_inline uint __float_as_uint(float f)
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)