9#include <embree4/rtcore_geometry.h>
10#include <embree4/rtcore_ray.h>
11#include <embree4/rtcore_scene.h>
13#ifdef __KERNEL_ONEAPI__
30#ifdef __KERNEL_ONEAPI__
39#if RTC_VERSION < 40400
40# define RTCTraversable RTCScene
41# define rtcGetGeometryUserDataFromTraversable rtcGetGeometryUserDataFromScene
42# define rtcTraversableIntersect1 rtcIntersect1
43# define rtcTraversableOccluded1 rtcOccluded1
46#ifdef __KERNEL_ONEAPI__
47# define CYCLES_EMBREE_USED_FEATURES \
48 (kernel_handler.get_specialization_constant<oneapi_embree_features>())
50# define CYCLES_EMBREE_USED_FEATURES \
51 (RTCFeatureFlags)(RTC_FEATURE_FLAG_TRIANGLE | RTC_FEATURE_FLAG_INSTANCE | \
52 RTC_FEATURE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS | RTC_FEATURE_FLAG_POINT | \
53 RTC_FEATURE_FLAG_MOTION_BLUR | RTC_FEATURE_FLAG_ROUND_CATMULL_ROM_CURVE | \
54 RTC_FEATURE_FLAG_FLAT_CATMULL_ROM_CURVE | \
55 RTC_FEATURE_FLAG_ROUND_LINEAR_CURVE)
58#define EMBREE_IS_HAIR(x) (x & 1)
93#ifdef __VOLUME_RECORD_ALL__
104 const uint visibility)
106 rtc_ray.org_x = ray.
P.
x;
107 rtc_ray.org_y = ray.
P.
y;
108 rtc_ray.org_z = ray.
P.
z;
109 rtc_ray.dir_x = ray.
D.
x;
110 rtc_ray.dir_y = ray.
D.
y;
111 rtc_ray.dir_z = ray.
D.
z;
112 rtc_ray.tnear = ray.
tmin;
113 rtc_ray.tfar = ray.
tmax;
114 rtc_ray.time = ray.
time;
115 rtc_ray.mask = visibility;
120 const uint visibility)
123 rayhit.hit.geomID = RTC_INVALID_GEOMETRY_ID;
124 rayhit.hit.instID[0] = RTC_INVALID_GEOMETRY_ID;
129 return (hit->instID[0] != RTC_INVALID_GEOMETRY_ID ? hit->instID[0] : hit->geomID) / 2;
135 const intptr_t prim_offset)
141 prim = hit->primID + prim_offset;
147 const bool is_hair = hit->geomID & 1;
159 const intptr_t prim_offset)
161 isect->
t = ray->tfar;
162 isect->
prim = hit->primID + prim_offset;
165 const bool is_hair = hit->geomID & 1;
168 isect->
type = segment.type;
169 isect->
prim = segment.prim;
185 intptr_t prim_offset;
186 if (hit->instID[0] != RTC_INVALID_GEOMETRY_ID) {
192 prim_offset = intptr_t(
203 const intptr_t prim_offset)
207 isect->
t = ray->tfar;
208 isect->
prim = hit->primID + prim_offset;
220 const RTCFilterFunctionNArguments *args)
225 RTCHit *hit = (RTCHit *)args->hit;
227#ifdef __KERNEL_ONEAPI__
232 const Ray *cray = ctx->
ray;
235 kg, hit, cray,
reinterpret_cast<intptr_t
>(args->geometryUserPtr)))
241#ifdef __SHADOW_LINKING__
255 const RTCFilterFunctionNArguments *args)
260 const RTCRay *ray = (RTCRay *)args->ray;
261 RTCHit *hit = (RTCHit *)args->hit;
263#ifdef __KERNEL_ONEAPI__
268 const Ray *cray = ctx->
ray;
272 kg, ray, hit, ¤t_isect,
reinterpret_cast<intptr_t
>(args->geometryUserPtr));
278#ifdef __SHADOW_LINKING__
310 kg, current_isect.
object, current_isect.
prim, current_isect.
type, current_isect.
u);
337 if (isect_index >= max_record_hits) {
340 if (current_isect.
t >= ctx->
max_t) {
346 float second_largest_t = 0.0f;
350 if (isect_t > max_t) {
351 second_largest_t = max_t;
352 max_recorded_hit =
i;
355 else if (isect_t > second_largest_t) {
356 second_largest_t = isect_t;
360 if (isect_index == max_record_hits && current_isect.
t >= max_t) {
367 isect_index = max_recorded_hit;
371 ctx->
max_t =
max(second_largest_t, current_isect.
t);
378 const RTCFilterFunctionNArguments *args)
383 const RTCRay *ray = (RTCRay *)args->ray;
384 RTCHit *hit = (RTCHit *)args->hit;
386#ifdef __KERNEL_ONEAPI__
391 const Ray *cray = ctx->
ray;
401 reinterpret_cast<intptr_t
>(args->geometryUserPtr));
405 kg, ray, hit, ¤t_isect,
reinterpret_cast<intptr_t
>(args->geometryUserPtr));
435 if (local_isect->
hits[
i].
t == ray->tfar) {
445 hit_idx = local_isect->
num_hits - 1;
461 if (local_isect->
num_hits && current_isect.
t > local_isect->
hits[0].
t) {
470 local_isect->
hits[hit_idx] = current_isect;
477 const RTCFilterFunctionNArguments *args)
482 const RTCRay *ray = (RTCRay *)args->ray;
483 RTCHit *hit = (RTCHit *)args->hit;
485#ifdef __KERNEL_ONEAPI__
490 const Ray *cray = ctx->
ray;
492#ifdef __VOLUME_RECORD_ALL__
494 if (ctx->
num_hits < ctx->max_hits) {
498 kg, ray, hit, ¤t_isect,
reinterpret_cast<intptr_t
>(args->geometryUserPtr));
506 *isect = current_isect;
512#ifndef __VOLUME_RECORD_ALL__
518#ifdef __VOLUME_RECORD_ALL__
525#ifdef __KERNEL_ONEAPI__
528kernel_embree_filter_intersection_func_static(
const RTCFilterFunctionNArguments *args)
530 RTCHit *hit = (RTCHit *)args->hit;
532 ONEAPIKernelContext *
context =
static_cast<ONEAPIKernelContext *
>(ctx->
kg);
533 context->kernel_embree_filter_intersection_func_impl(args);
537kernel_embree_filter_occluded_shadow_all_func_static(
const RTCFilterFunctionNArguments *args)
539 RTCHit *hit = (RTCHit *)args->hit;
541 ONEAPIKernelContext *
context =
static_cast<ONEAPIKernelContext *
>(ctx->
kg);
542 context->kernel_embree_filter_occluded_shadow_all_func_impl(args);
546kernel_embree_filter_occluded_local_func_static(
const RTCFilterFunctionNArguments *args)
548 RTCHit *hit = (RTCHit *)args->hit;
550 ONEAPIKernelContext *
context =
static_cast<ONEAPIKernelContext *
>(ctx->
kg);
551 context->kernel_embree_filter_occluded_local_func_impl(args);
555kernel_embree_filter_occluded_volume_all_func_static(
const RTCFilterFunctionNArguments *args)
557 RTCHit *hit = (RTCHit *)args->hit;
559 ONEAPIKernelContext *
context =
static_cast<ONEAPIKernelContext *
>(ctx->
kg);
560 context->kernel_embree_filter_occluded_volume_all_func_impl(args);
563# define kernel_embree_filter_intersection_func \
564 ONEAPIKernelContext::kernel_embree_filter_intersection_func_static
565# define kernel_embree_filter_occluded_shadow_all_func \
566 ONEAPIKernelContext::kernel_embree_filter_occluded_shadow_all_func_static
567# define kernel_embree_filter_occluded_local_func \
568 ONEAPIKernelContext::kernel_embree_filter_occluded_local_func_static
569# define kernel_embree_filter_occluded_volume_all_func \
570 ONEAPIKernelContext::kernel_embree_filter_occluded_volume_all_func_static
572# define kernel_embree_filter_intersection_func kernel_embree_filter_intersection_func_impl
573# define kernel_embree_filter_occluded_shadow_all_func \
574 kernel_embree_filter_occluded_shadow_all_func_impl
575# define kernel_embree_filter_occluded_local_func kernel_embree_filter_occluded_local_func_impl
576# define kernel_embree_filter_occluded_volume_all_func \
577 kernel_embree_filter_occluded_volume_all_func_impl
584 const uint visibility,
587 isect->t = ray->tmax;
589 rtcInitRayQueryContext(&ctx);
590#ifdef __KERNEL_ONEAPI__
604 RTCIntersectArguments args;
605 rtcInitIntersectArguments(&args);
610 if (ray_hit.hit.geomID == RTC_INVALID_GEOMETRY_ID ||
611 ray_hit.hit.primID == RTC_INVALID_GEOMETRY_ID)
624 const int local_object,
631 rtcInitRayQueryContext(&ctx);
632# ifdef __KERNEL_ONEAPI__
647 local_isect->num_hits = 0;
653 RTCOccludedArguments args;
654 rtcInitOccludedArguments(&args);
664# ifdef __OBJECT_MOTION__
665 bvh_instance_motion_push(kg, local_object, ray, &
P, &dir, &idir);
673 rtc_ray.dir_x = dir.
x;
674 rtc_ray.dir_y = dir.
y;
675 rtc_ray.dir_z = dir.
z;
676 rtc_ray.tnear = ray->tmin;
677 rtc_ray.tfar = ray->tmax;
690 return (local_isect && local_isect->num_hits > 0) || (rtc_ray.tfar < 0);
694#ifdef __SHADOW_RECORD_ALL__
698 const uint visibility,
699 const uint max_transparent_hits,
704 rtcInitRayQueryContext(&ctx);
705# ifdef __KERNEL_ONEAPI__
719 ctx.
max_t = ray->tmax;
723 RTCOccludedArguments args;
724 rtcInitOccludedArguments(&args);
725 args.filter =
reinterpret_cast<RTCFilterFunctionN
>(
744 const uint visibility)
747 rtcInitRayQueryContext(&ctx);
748# ifdef __KERNEL_ONEAPI__
758# ifdef __VOLUME_RECORD_ALL__
765 RTCOccludedArguments args;
766 rtcInitOccludedArguments(&args);
767 args.filter =
reinterpret_cast<RTCFilterFunctionN
>(
ccl_device_forceinline int intersection_get_shader_flags(KernelGlobals kg, const int prim, const int type)
ccl_device_forceinline bool intersection_skip_shadow_already_recoded(IntegratorShadowState state, const int object, const int prim, const int num_hits)
ccl_device_inline bool intersection_skip_shadow_link(KernelGlobals kg, const ccl_ray_data RaySelfPrimitives &self, const int isect_object)
ccl_device_inline bool intersection_skip_self_shadow(const ccl_ray_data RaySelfPrimitives &self, const int object, const int prim)
ccl_device_inline bool intersection_skip_self(const ccl_ray_data RaySelfPrimitives &self, const int object, const int prim)
#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_local(const ccl_ray_data RaySelfPrimitives &self, const int prim)
#define kernel_assert(cond)
#define ccl_device_forceinline
#define kernel_data_fetch(name, index)
#define ccl_always_inline
#define INTEGRATOR_SHADOW_ISECT_SIZE
#define __VOLUME_RECORD_ALL__
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
#define assert(assertion)
VecBase< float, D > normalize(VecOp< float, D >) RET
#define ccl_device_intersect
#define rtcTraversableOccluded1
ccl_device_inline void kernel_embree_convert_hit(KernelGlobals kg, const RTCRay *ray, const RTCHit *hit, Intersection *isect, const intptr_t prim_offset)
ccl_device_forceinline void kernel_embree_filter_occluded_local_func_impl(const RTCFilterFunctionNArguments *args)
#define CYCLES_EMBREE_USED_FEATURES
ccl_device_inline void kernel_embree_convert_sss_hit(KernelGlobals kg, const RTCRay *ray, const RTCHit *hit, Intersection *isect, const int object, const intptr_t prim_offset)
ccl_device_forceinline void kernel_embree_filter_occluded_volume_all_func_impl(const RTCFilterFunctionNArguments *args)
ccl_device_forceinline void kernel_embree_filter_occluded_shadow_all_func_impl(const RTCFilterFunctionNArguments *args)
ccl_device_intersect bool kernel_embree_intersect(KernelGlobals kg, const ccl_private Ray *ray, const uint visibility, ccl_private Intersection *isect)
ccl_device_inline void kernel_embree_setup_rayhit(const Ray &ray, RTCRayHit &rayhit, const uint visibility)
#define kernel_embree_filter_occluded_volume_all_func
#define kernel_embree_filter_intersection_func
#define rtcGetGeometryUserDataFromTraversable
ccl_device_inline int kernel_embree_get_hit_object(const RTCHit *hit)
ccl_device_inline bool kernel_embree_is_self_intersection(const KernelGlobals kg, const RTCHit *hit, const Ray *ray, const intptr_t prim_offset)
#define EMBREE_IS_HAIR(x)
#define rtcTraversableIntersect1
#define kernel_embree_filter_occluded_local_func
ccl_device_forceinline void kernel_embree_filter_intersection_func_impl(const RTCFilterFunctionNArguments *args)
#define kernel_embree_filter_occluded_shadow_all_func
ccl_device_inline void kernel_embree_setup_ray(const Ray &ray, RTCRay &rtc_ray, const uint visibility)
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)
@ SD_HAS_TRANSPARENT_SHADOW
@ PATH_RAY_ALL_VISIBILITY
@ SD_OBJECT_TRANSFORM_APPLIED
CCL_NAMESPACE_BEGIN ccl_device uint lcg_step_uint(T rng)
int context(const bContext *C, const char *member, bContextDataResult *result)
IntegratorShadowStateCPU * IntegratorShadowState
#define INTEGRATOR_STATE_ARRAY(state, nested_struct, array_index, member)
ccl_device_forceinline void integrator_state_write_shadow_isect(IntegratorShadowState state, const ccl_private Intersection *ccl_restrict isect, const int index)
LocalIntersection * local_isect
numhit_t num_recorded_hits
numhit_t max_transparent_hits
IntegratorShadowState isect_s
numhit_t num_transparent_hits
struct Intersection hits[LOCAL_MAX_HITS]
float3 Ng[LOCAL_MAX_HITS]