8 #include <embree3/rtcore_ray.h>
9 #include <embree3/rtcore_scene.h>
24 #define EMBREE_IS_HAIR(x) (x & 1)
79 rtcInitIntersectContext(&
context);
90 const uint visibility)
92 rtc_ray.org_x = ray.
P.
x;
93 rtc_ray.org_y = ray.
P.
y;
94 rtc_ray.org_z = ray.
P.
z;
95 rtc_ray.dir_x = ray.
D.
x;
96 rtc_ray.dir_y = ray.
D.
y;
97 rtc_ray.dir_z = ray.
D.
z;
98 rtc_ray.tnear = ray.
tmin;
99 rtc_ray.tfar = ray.
tmax;
100 rtc_ray.time = ray.
time;
101 rtc_ray.mask = visibility;
106 const uint visibility)
109 rayhit.hit.geomID = RTC_INVALID_GEOMETRY_ID;
110 rayhit.hit.instID[0] = RTC_INVALID_GEOMETRY_ID;
119 if (hit->instID[0] != RTC_INVALID_GEOMETRY_ID) {
120 object = hit->instID[0] / 2;
122 RTCScene inst_scene = (RTCScene)rtcGetGeometryUserData(
123 rtcGetGeometry(
kernel_data.device_bvh, hit->instID[0]));
125 (
intptr_t)rtcGetGeometryUserData(rtcGetGeometry(inst_scene, hit->geomID));
132 object = hit->geomID / 2;
142 const bool is_hair = hit->geomID & 1;
155 isect->
t = ray->tfar;
156 if (hit->instID[0] != RTC_INVALID_GEOMETRY_ID) {
157 RTCScene inst_scene = (RTCScene)rtcGetGeometryUserData(
158 rtcGetGeometry(
kernel_data.device_bvh, hit->instID[0]));
159 isect->
prim = hit->primID +
160 (
intptr_t)rtcGetGeometryUserData(rtcGetGeometry(inst_scene, hit->geomID));
161 isect->
object = hit->instID[0] / 2;
164 isect->
prim = hit->primID + (
intptr_t)rtcGetGeometryUserData(
165 rtcGetGeometry(
kernel_data.device_bvh, hit->geomID));
166 isect->
object = hit->geomID / 2;
169 const bool is_hair = hit->geomID & 1;
189 isect->
t = ray->tfar;
190 RTCScene inst_scene = (RTCScene)rtcGetGeometryUserData(
191 rtcGetGeometry(
kernel_data.device_bvh,
object * 2));
192 isect->
prim = hit->primID +
193 (
intptr_t)rtcGetGeometryUserData(rtcGetGeometry(inst_scene, hit->geomID));
207 assert(args->N == 1);
209 RTCHit *hit = (RTCHit *)args->hit;
212 const Ray *cray = ctx->ray;
227 assert(args->N == 1);
229 const RTCRay *ray = (RTCRay *)args->ray;
230 RTCHit *hit = (RTCHit *)args->hit;
233 const Ray *cray = ctx->
ray;
255 kg, current_isect.
object, current_isect.
prim, current_isect.
type, current_isect.
u);
273 uint isect_index = num_recorded_hits;
274 if (num_recorded_hits + 1 >= max_record_hits) {
276 uint max_recorded_hit = 0;
278 for (
uint i = 1; i < num_recorded_hits; ++i) {
280 max_recorded_hit = i;
285 if (num_recorded_hits >= max_record_hits) {
286 isect_index = max_recorded_hit;
293 ctx->
max_t =
max(current_isect.
t, max_t);
296 ctx->
isect_s[isect_index] = current_isect;
345 if (local_isect->
hits[i].
t == ray->tfar) {
355 hit_idx = local_isect->
num_hits - 1;
371 if (local_isect->
num_hits && current_isect.
t > local_isect->
hits[0].
t) {
380 local_isect->
hits[hit_idx] = current_isect;
398 *isect = current_isect;
422 const RTCRay *ray = (RTCRay *)args->ray;
423 RTCHit *hit = (RTCHit *)args->hit;
427 make_float3(hit->Ng_x, hit->Ng_y, hit->Ng_z)) > 0.0f) {
434 const Ray *cray = ctx->
ray;
442 const RTCFilterFunctionNArguments *args)
444 const RTCRay *ray = (RTCRay *)args->ray;
445 RTCHit *hit = (RTCHit *)args->hit;
449 make_float3(hit->Ng_x, hit->Ng_y, hit->Ng_z)) > 0.0f) {
461 const uint visibility,
464 isect->t = ray->tmax;
471 if (ray_hit.hit.geomID == RTC_INVALID_GEOMETRY_ID ||
472 ray_hit.hit.primID == RTC_INVALID_GEOMETRY_ID) {
492 ctx.lcg_state = lcg_state;
493 ctx.max_hits = max_hits;
495 ctx.local_isect = local_isect;
497 local_isect->num_hits = 0;
499 ctx.local_object_id = local_object;
506 RTCGeometry geom = rtcGetGeometry(
kernel_data.device_bvh, local_object * 2);
511 bvh_instance_motion_push(kg, local_object, ray, &
P, &dir, &idir);
516 rtc_ray.dir_x = dir.
x;
517 rtc_ray.dir_y = dir.
y;
518 rtc_ray.dir_z = dir.
z;
519 rtc_ray.tnear = ray->tmin;
520 rtc_ray.tfar = ray->tmax;
521 RTCScene
scene = (RTCScene)rtcGetGeometryUserData(geom);
524 rtcOccluded1(
scene, &rtc_ctx.context, &rtc_ray);
529 rtcOccluded1(
kernel_data.device_bvh, &rtc_ctx.context, &rtc_ray);
533 return (local_isect && local_isect->num_hits > 0) || (rtc_ray.tfar < 0);
537 #ifdef __SHADOW_RECORD_ALL__
548 ctx.isect_s = isect_array;
549 ctx.max_hits = max_hits;
554 rtcOccluded1(
kernel_data.device_bvh, &rtc_ctx.context, &rtc_ray);
556 *num_recorded_hits = ctx.num_recorded_hits;
557 *throughput = ctx.throughput;
558 return ctx.opaque_hit;
567 const uint visibility)
571 ctx.max_hits = max_hits;
577 rtcOccluded1(
kernel_data.device_bvh, &rtc_ctx.context, &rtc_ray);
IntersectContext(CCLIntersectContext *ctx)
CCLIntersectContext * userRayExt
RTCIntersectContext context
#define kernel_assert(cond)
#define ccl_device_inline
#define CCL_NAMESPACE_END
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_private const RaySelfPrimitives &self, 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_shadow(ccl_private const RaySelfPrimitives &self, const int object, const int prim)
ccl_device_inline bool intersection_skip_self(ccl_private const RaySelfPrimitives &self, const int object, const int prim)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device_intersect
ccl_device_inline void kernel_embree_setup_rayhit(const Ray &ray, RTCRayHit &rayhit, const uint visibility)
ccl_device_inline bool kernel_embree_is_self_intersection(const KernelGlobals kg, const RTCHit *hit, const Ray *ray)
ccl_device_intersect bool kernel_embree_intersect(KernelGlobals kg, ccl_private const Ray *ray, const uint visibility, ccl_private Intersection *isect)
ccl_device void kernel_embree_filter_occluded_func(const RTCFilterFunctionNArguments *args)
ccl_device void kernel_embree_filter_occluded_func_backface_cull(const RTCFilterFunctionNArguments *args)
#define EMBREE_IS_HAIR(x)
ccl_device void kernel_embree_filter_intersection_func(const RTCFilterFunctionNArguments *args)
ccl_device_inline void kernel_embree_convert_sss_hit(KernelGlobals kg, const RTCRay *ray, const RTCHit *hit, Intersection *isect, int object)
ccl_device void kernel_embree_filter_func_backface_cull(const RTCFilterFunctionNArguments *args)
ccl_device_inline void kernel_embree_convert_hit(KernelGlobals kg, const RTCRay *ray, const RTCHit *hit, Intersection *isect)
ccl_device_inline void kernel_embree_setup_ray(const Ray &ray, RTCRay &rtc_ray, const uint visibility)
@ SD_HAS_TRANSPARENT_SHADOW
@ PATH_RAY_ALL_VISIBILITY
#define INTEGRATOR_SHADOW_ISECT_SIZE
@ SD_OBJECT_TRANSFORM_APPLIED
CCL_NAMESPACE_BEGIN ccl_device uint lcg_step_uint(T rng)
Segment< FEdge *, Vec3r > segment
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
vec_base< T, Size > normalize(const vec_base< T, Size > &v)
LocalIntersection * local_isect
CCLIntersectContext(KernelGlobals kg_, RayType type_)
struct Intersection hits[LOCAL_MAX_HITS]
float3 Ng[LOCAL_MAX_HITS]