33 const uint visibility,
34 const uint max_transparent_hits,
55 float tmin = ray->tmin;
57 uint num_transparent_hits = 0;
62 const float tmax = ray->tmax;
63 float tmax_hits = tmax;
67 *r_num_recorded_hits = 0;
75 int node_addr_child1, traverse_mask;
94 if (traverse_mask == 3) {
96 bool is_closest_child1 = (dist[1] < dist[0]);
97 if (is_closest_child1) {
99 node_addr = node_addr_child1;
100 node_addr_child1 = tmp;
105 traversal_stack[stack_ptr] = node_addr_child1;
109 if (traverse_mask == 2) {
110 node_addr = node_addr_child1;
112 else if (traverse_mask == 0) {
114 node_addr = traversal_stack[stack_ptr];
125 if (prim_addr >= 0) {
130 node_addr = traversal_stack[stack_ptr];
134 for (; prim_addr < prim_addr2; prim_addr++) {
152#ifdef __SHADOW_LINKING__
161 kg, &isect,
P, dir, tmin, tmax, visibility, prim_object, prim, prim_addr);
164#if BVH_FEATURE(BVH_MOTION)
180#if BVH_FEATURE(BVH_HAIR) && defined(__HAIR__)
189 if (ray->time < prim_time.
x || ray->time > prim_time.
y) {
196 hit = curve_intersect(
197 kg, &isect,
P, dir, tmin, tmax, prim_object, prim, ray->time, curve_type);
202#if BVH_FEATURE(BVH_POINTCLOUD) && defined(__POINTCLOUD__)
207 if (ray->time < prim_time.
x || ray->time > prim_time.
y) {
214 hit = point_intersect(
215 kg, &isect,
P, dir, tmin, tmax, prim_object, prim, ray->time, point_type);
241 state, isect.object, isect.prim, *r_num_recorded_hits))
248 if (num_transparent_hits > max_transparent_hits) {
252 bool record_intersection =
true;
257 kg, isect.object, isect.prim, isect.type, isect.u);
263 record_intersection =
false;
267 if (record_intersection) {
272 ++(*r_num_recorded_hits);
275 if (*r_num_recorded_hits <= max_record_hits || isect.t < tmax_hits) {
278 if (*r_num_recorded_hits >= max_record_hits) {
283 for (
uint i = 1;
i < max_record_hits; ++
i) {
285 if (isect_t > tmax_hits) {
292 isect_index = *r_num_recorded_hits;
303#if BVH_FEATURE(BVH_MOTION)
304 bvh_instance_motion_push(kg,
object, ray, &
P, &dir, &idir);
318 if (stack_ptr >= 0) {
325 node_addr = traversal_stack[stack_ptr];
ccl_device_inline void bvh_instance_push(KernelGlobals kg, const int object, const ccl_private Ray *ray, ccl_private float3 *P, ccl_private float3 *dir, ccl_private float3 *idir)
ccl_device_inline bool motion_triangle_intersect(KernelGlobals kg, ccl_private Intersection *isect, const float3 P, const float3 dir, const float tmin, const float tmax, const float time, const uint visibility, const int object, const int prim, const int prim_addr)
CCL_NAMESPACE_BEGIN ccl_device_inline bool triangle_intersect(KernelGlobals kg, ccl_private Intersection *isect, const float3 P, const float3 dir, const float tmin, const float tmax, const uint visibility, const int object, const int prim, const int prim_addr)