24 uint *r_num_recorded_hits;
39# define SET_HIPRT_RAY(RAY_RT, RAY) \
40 RAY_RT.direction = RAY->D; \
41 RAY_RT.origin = RAY->P; \
42 RAY_RT.maxT = RAY->tmax; \
43 RAY_RT.minT = RAY->tmin;
45# if defined(HIPRT_SHARED_STACK)
46# define GET_TRAVERSAL_STACK() \
47 Stack stack(kg->global_stack_buffer, kg->shared_stack); \
48 Instance_Stack instance_stack;
50# define GET_TRAVERSAL_STACK()
53# ifdef HIPRT_SHARED_STACK
54# define GET_TRAVERSAL_ANY_HIT(FUNCTION_TABLE, RAY_TYPE, RAY_TIME) \
55 hiprtSceneTraversalAnyHitCustomStack<Stack, Instance_Stack> traversal( \
56 (hiprtScene)kernel_data.device_bvh, \
61 hiprtTraversalHintDefault, \
63 kernel_params.FUNCTION_TABLE, \
67# define GET_TRAVERSAL_CLOSEST_HIT(FUNCTION_TABLE, RAY_TYPE, RAY_TIME) \
68 hiprtSceneTraversalClosestCustomStack<Stack, Instance_Stack> traversal( \
69 (hiprtScene)kernel_data.device_bvh, \
74 hiprtTraversalHintDefault, \
76 kernel_params.FUNCTION_TABLE, \
80# define GET_TRAVERSAL_ANY_HIT(FUNCTION_TABLE) \
81 hiprtSceneTraversalAnyHit traversal(kernel_data.device_bvh, \
85 hiprtTraversalHintDefault, \
87# define GET_TRAVERSAL_CLOSEST_HIT(FUNCTION_TABLE) \
88 hiprtSceneTraversalClosest traversal(kernel_data.device_bvh, \
92 hiprtTraversalHintDefault, \
106 isect->prim = hit.primID + prim_offset;
107 isect->object = object_id;
121 RayPayload *local_payload = (RayPayload *)payload;
137 int prim_offset = data_offset.
y;
142# ifdef __SHADOW_LINKING__
152 float ray_time = local_payload->ray_time;
159 if (ray_time < prims_time.x || ray_time > prims_time.
y) {
164 bool b_hit = curve_intersect(kg,
171 curve_index + prim_offset,
178 hit.primID = isect.
prim;
179 local_payload->prim_type = isect.
type;
189 RayPayload *local_payload = (RayPayload *)payload;
195 int prim_id_local =
kernel_data_fetch(custom_prim_info, hit.primID + data_offset.
x).x;
196 int prim_id_global = prim_id_local + prim_offset;
209 local_payload->ray_time,
210 local_payload->visibility,
219 hit.primID = isect.
prim;
220 local_payload->prim_type = isect.
type;
225ccl_device_inline bool motion_triangle_custom_local_intersect(
const hiprtRay &ray,
230# ifdef __OBJECT_MOTION__
231 LocalPayload *local_payload = (LocalPayload *)payload;
233 int object_id = local_payload->local_object;
238 int prim_id_local =
kernel_data_fetch(custom_prim_info, hit.primID + data_offset.
x).x;
239 int prim_id_global = prim_id_local + prim_offset;
246 bool b_hit = motion_triangle_intersect_local(kg,
250 local_payload->ray_time,
256 local_payload->lcg_state,
257 local_payload->max_hits);
268ccl_device_inline bool motion_triangle_custom_volume_intersect(
const hiprtRay &ray,
273# ifdef __OBJECT_MOTION__
274 RayPayload *local_payload = (RayPayload *)payload;
285 int prim_id_local =
kernel_data_fetch(custom_prim_info, hit.primID + data_offset.
x).x;
286 int prim_id_global = prim_id_local + prim_offset;
299 local_payload->ray_time,
300 local_payload->visibility,
309 hit.primID = isect.
prim;
310 local_payload->prim_type = isect.
type;
326# if defined(__POINTCLOUD__) && 0
327 RayPayload *local_payload = (RayPayload *)payload;
335 int prim_id_local = prim_info.
x;
336 int prim_id_global = prim_id_local + prim_offset;
338 int type = prim_info.
y;
340# ifdef __SHADOW_LINKING__
350 float ray_time = local_payload->ray_time;
357 if (ray_time < prims_time.x || ray_time > prims_time.
y) {
364 bool b_hit = point_intersect(kg,
379 hit.primID = isect.
prim;
380 local_payload->prim_type = isect.
type;
395 RayPayload *payload = (RayPayload *)user_data;
398 int prim = hit.primID + prim_offset;
400# ifdef __SHADOW_LINKING__
421 ShadowPayload *payload = (ShadowPayload *)user_data;
423 uint num_hits = payload->num_hits;
424 uint num_recorded_hits = *(payload->r_num_recorded_hits);
425 uint max_hits = payload->max_hits;
426 int state = payload->in_state;
432 int prim = hit.primID + prim_offset;
434 float ray_tmax = hit.t;
436# ifdef __SHADOW_LINKING__
443# ifdef __VISIBILITY_FLAG__
445 if ((
kernel_data_fetch(objects,
object).visibility & payload->visibility) == 0) {
458# ifndef __TRANSPARENT_SHADOWS__
464 if (num_hits >= max_hits ||
470 uint record_index = num_recorded_hits;
473 num_recorded_hits += 1;
474 payload->num_hits = num_hits;
475 *(payload->r_num_recorded_hits) = num_recorded_hits;
478 if (record_index >= max_record_hits) {
480 uint max_recorded_hit = 0;
482 for (
int i = 1; i < max_record_hits; i++) {
484 if (isect_t > max_recorded_t) {
485 max_recorded_t = isect_t;
486 max_recorded_hit = i;
490 if (ray_tmax >= max_recorded_t) {
495 record_index = max_recorded_hit;
515 ShadowPayload *payload = (ShadowPayload *)user_data;
517 uint num_hits = payload->num_hits;
518 uint num_recorded_hits = *(payload->r_num_recorded_hits);
519 uint max_hits = payload->max_hits;
524 int prim = hit.primID;
526 float ray_tmax = hit.t;
528# ifdef __SHADOW_LINKING__
536# ifdef __VISIBILITY_FLAG__
538 if ((
kernel_data_fetch(objects,
object).visibility & payload->visibility) == 0) {
550 if (u == 0.0f || u == 1.0f) {
555 int type = payload->prim_type;
557# ifndef __TRANSPARENT_SHADOWS__
563 if (num_hits >= max_hits ||
569 float throughput = *payload->r_throughput;
571 *payload->r_throughput = throughput;
572 payload->num_hits += 1;
589 LocalPayload *payload = (LocalPayload *)user_data;
591 int object_id = payload->local_object;
593 int prim = hit.primID + prim_offset;
594# ifndef __RAY_OFFSET__
599 uint max_hits = payload->max_hits;
604 if (payload->lcg_state) {
605 for (
int i =
min(max_hits, payload->local_isect->num_hits) - 1; i >= 0; --i) {
606 if (hit.t == payload->local_isect->hits[i].t) {
610 hit_index = payload->local_isect->num_hits++;
611 if (payload->local_isect->num_hits > max_hits) {
612 hit_index =
lcg_step_uint(payload->lcg_state) % payload->local_isect->num_hits;
613 if (hit_index >= max_hits) {
619 if (payload->local_isect->num_hits && hit.t > payload->local_isect->hits[0].t) {
622 payload->local_isect->num_hits = 1;
624 Intersection *isect = &payload->local_isect->hits[hit_index];
627 isect->
object = object_id;
633 payload->local_isect->Ng[hit_index] = hit.normal;
645 RayPayload *payload = (RayPayload *)user_data;
648 int prim = hit.primID + prim_offset;
659HIPRT_DEVICE
bool intersectFunc(
uint geomType,
661 const hiprtFuncTableHeader &tableHeader,
666 const uint index = tableHeader.numGeomTypes * rayType + geomType;
667 const void *data = tableHeader.funcDataSets[index].filterFuncData;
671 return curve_custom_intersect(ray, data, payload, hit);
674 return motion_triangle_custom_intersect(ray, data, payload, hit);
676 return motion_triangle_custom_local_intersect(ray, data, payload, hit);
678 return motion_triangle_custom_volume_intersect(ray, data, payload, hit);
681 return point_custom_intersect(ray, data, payload, hit);
688HIPRT_DEVICE
bool filterFunc(
uint geomType,
690 const hiprtFuncTableHeader &tableHeader,
695 const uint index = tableHeader.numGeomTypes * rayType + geomType;
696 const void *data = tableHeader.funcDataSets[index].intersectFuncData;
699 return closest_intersection_filter(ray, data, payload, hit);
701 return shadow_intersection_filter_curves(ray, data, payload, hit);
705 return shadow_intersection_filter(ray, data, payload, hit);
708 return local_intersection_filter(ray, data, payload, hit);
711 return volume_intersection_filter(ray, data, payload, hit);
ATTR_WARN_UNUSED_RESULT const BMVert * v
ccl_device_forceinline int intersection_get_shader_flags(KernelGlobals kg, const int prim, const int type)
ccl_device_inline bool intersection_skip_self_local(ccl_ray_data const RaySelfPrimitives &self, const int prim)
ccl_device_inline bool intersection_skip_self(ccl_ray_data const RaySelfPrimitives &self, const int object, const int prim)
ccl_device_inline bool intersection_skip_shadow_link(KernelGlobals kg, ccl_ray_data const RaySelfPrimitives &self, const int isect_object)
#define CURVE_SHADOW_TRANSPARENCY_CUTOFF
ccl_device_inline float intersection_curve_shadow_transparency(KernelGlobals kg, const int object, const int prim, const int type, const float u)
ccl_device_inline bool intersection_skip_self_shadow(ccl_ray_data const RaySelfPrimitives &self, const int object, const int prim)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device_inline
@ Motion_Triangle_Filter_Volume
@ Motion_Triangle_Filter_Local
@ Triangle_Filter_Closest
@ Motion_Triangle_Filter_Shadow
@ Motion_Triangle_Intersect_Shadow
@ Curve_Intersect_Function
@ Motion_Triangle_Intersect_Function
@ Point_Intersect_Function
@ Motion_Triangle_Intersect_Volume
@ Motion_Triangle_Intersect_Local
@ SD_HAS_TRANSPARENT_SHADOW
@ PRIMITIVE_MOTION_TRIANGLE
#define INTEGRATOR_SHADOW_ISECT_SIZE
CCL_NAMESPACE_BEGIN ccl_device uint lcg_step_uint(T rng)
ccl_device_inline bool motion_triangle_intersect(KernelGlobals kg, ccl_private Intersection *isect, float3 P, float3 dir, float tmin, float tmax, float time, uint visibility, int object, int prim, int prim_addr)
#define INTEGRATOR_STATE_ARRAY_WRITE(state, nested_struct, array_index, member)
#define INTEGRATOR_STATE_ARRAY(state, nested_struct, array_index, member)