36 #ifndef __KERNEL_OPTIX__
42 # define BVH_FUNCTION_NAME bvh_intersect
43 # define BVH_FUNCTION_FEATURES 0
46 # if defined(__HAIR__)
47 # define BVH_FUNCTION_NAME bvh_intersect_hair
48 # define BVH_FUNCTION_FEATURES BVH_HAIR
52 # if defined(__OBJECT_MOTION__)
53 # define BVH_FUNCTION_NAME bvh_intersect_motion
54 # define BVH_FUNCTION_FEATURES BVH_MOTION
58 # if defined(__HAIR__) && defined(__OBJECT_MOTION__)
59 # define BVH_FUNCTION_NAME bvh_intersect_hair_motion
60 # define BVH_FUNCTION_FEATURES BVH_HAIR | BVH_MOTION
66 # if defined(__BVH_LOCAL__)
67 # define BVH_FUNCTION_NAME bvh_intersect_local
68 # define BVH_FUNCTION_FEATURES BVH_HAIR
71 # if defined(__OBJECT_MOTION__)
72 # define BVH_FUNCTION_NAME bvh_intersect_local_motion
73 # define BVH_FUNCTION_FEATURES BVH_MOTION | BVH_HAIR
80 # if defined(__VOLUME__)
81 # define BVH_FUNCTION_NAME bvh_intersect_volume
82 # define BVH_FUNCTION_FEATURES BVH_HAIR
85 # if defined(__OBJECT_MOTION__)
86 # define BVH_FUNCTION_NAME bvh_intersect_volume_motion
87 # define BVH_FUNCTION_FEATURES BVH_MOTION | BVH_HAIR
94 # if defined(__SHADOW_RECORD_ALL__)
95 # define BVH_FUNCTION_NAME bvh_intersect_shadow_all
96 # define BVH_FUNCTION_FEATURES 0
99 # if defined(__HAIR__)
100 # define BVH_FUNCTION_NAME bvh_intersect_shadow_all_hair
101 # define BVH_FUNCTION_FEATURES BVH_HAIR
105 # if defined(__OBJECT_MOTION__)
106 # define BVH_FUNCTION_NAME bvh_intersect_shadow_all_motion
107 # define BVH_FUNCTION_FEATURES BVH_MOTION
111 # if defined(__HAIR__) && defined(__OBJECT_MOTION__)
112 # define BVH_FUNCTION_NAME bvh_intersect_shadow_all_hair_motion
113 # define BVH_FUNCTION_FEATURES BVH_HAIR | BVH_MOTION
120 # if defined(__VOLUME_RECORD_ALL__)
121 # define BVH_FUNCTION_NAME bvh_intersect_volume_all
122 # define BVH_FUNCTION_FEATURES BVH_HAIR
125 # if defined(__OBJECT_MOTION__)
126 # define BVH_FUNCTION_NAME bvh_intersect_volume_all_motion
127 # define BVH_FUNCTION_FEATURES BVH_MOTION | BVH_HAIR
133 # undef BVH_NAME_JOIN
134 # undef BVH_NAME_EVAL
135 # undef BVH_FUNCTION_FULL_NAME
156 const uint visibility,
161 #ifdef __KERNEL_OPTIX__
166 uint p4 = visibility;
208 if (ray_hit.hit.geomID != RTC_INVALID_GEOMETRY_ID &&
209 ray_hit.hit.primID != RTC_INVALID_GEOMETRY_ID) {
217 # ifdef __OBJECT_MOTION__
221 return bvh_intersect_hair_motion(
kg, ray, isect, visibility);
225 return bvh_intersect_motion(
kg, ray, isect, visibility);
231 return bvh_intersect_hair(
kg, ray, isect, visibility);
235 return bvh_intersect(
kg, ray, isect, visibility);
249 # ifdef __KERNEL_OPTIX__
254 uint p4 = local_object;
270 OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
296 ctx.lcg_state = lcg_state;
297 ctx.max_hits = max_hits;
298 ctx.local_isect = local_isect;
302 ctx.local_object_id = local_object;
309 RTCGeometry geom = rtcGetGeometry(
kernel_data.bvh.scene, local_object * 2);
315 rtc_ray.tfar = bvh_instance_motion_push(
316 kg, local_object, ray, &
P, &dir, &idir, ray->
t, &ob_itfm);
324 rtc_ray.dir_x = dir.
x;
325 rtc_ray.dir_y = dir.
y;
326 rtc_ray.dir_z = dir.
z;
327 RTCScene
scene = (RTCScene)rtcGetGeometryUserData(geom);
330 rtcOccluded1(
scene, &rtc_ctx.context, &rtc_ray);
335 rtcOccluded1(
kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray);
339 return (local_isect && local_isect->
num_hits > 0) || (rtc_ray.tfar < 0);
344 # ifdef __OBJECT_MOTION__
346 return bvh_intersect_local_motion(
kg, ray, local_isect, local_object, lcg_state, max_hits);
349 return bvh_intersect_local(
kg, ray, local_isect, local_object, lcg_state, max_hits);
354 #ifdef __SHADOW_RECORD_ALL__
364 # ifdef __KERNEL_OPTIX__
368 uint p4 = visibility;
380 OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
402 ctx.max_hits = max_hits;
407 rtcOccluded1(
kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray);
409 if (ctx.num_hits > max_hits) {
412 *num_hits = ctx.num_hits;
413 return rtc_ray.tfar == -INFINITY;
417 # ifdef __OBJECT_MOTION__
421 return bvh_intersect_shadow_all_hair_motion(
kg, ray, isect, visibility, max_hits, num_hits);
425 return bvh_intersect_shadow_all_motion(
kg, ray, isect, visibility, max_hits, num_hits);
431 return bvh_intersect_shadow_all_hair(
kg, ray, isect, visibility, max_hits, num_hits);
435 return bvh_intersect_shadow_all(
kg, ray, isect, visibility, max_hits, num_hits);
444 const uint visibility)
448 # ifdef __KERNEL_OPTIX__
453 uint p4 = visibility;
488 # ifdef __OBJECT_MOTION__
490 return bvh_intersect_volume_motion(
kg, ray, isect, visibility);
494 return bvh_intersect_volume(
kg, ray, isect, visibility);
499 #ifdef __VOLUME_RECORD_ALL__
504 const uint visibility)
516 ctx.max_hits = max_hits;
521 rtcOccluded1(
kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray);
526 # ifdef __OBJECT_MOTION__
528 return bvh_intersect_volume_all_motion(
kg, ray, isect, max_hits, visibility);
532 return bvh_intersect_volume_all(
kg, ray, isect, max_hits, visibility);
543 #ifdef __INTERSECTION_REFINE__
544 const float epsilon_f = 1e-5f;
547 const float epsilon_test = 1.0f;
548 const int epsilon_i = 32;
553 if (
fabsf(
P.x) < epsilon_test) {
554 res.
x =
P.x + Ng.
x * epsilon_f;
563 if (
fabsf(
P.y) < epsilon_test) {
564 res.
y =
P.y + Ng.
y * epsilon_f;
573 if (
fabsf(
P.z) < epsilon_test) {
574 res.
z =
P.z + Ng.
z * epsilon_f;
584 const float epsilon_f = 1e-4f;
585 return P + epsilon_f * Ng;
589 #if defined(__VOLUME_RECORD_ALL__) || (defined(__SHADOW_RECORD_ALL__) && defined(__KERNEL_CPU__))
591 ccl_device int intersections_compare(
const void *
a,
const void *b)
596 if (isect_a->
t < isect_b->
t)
598 else if (isect_a->
t > isect_b->
t)
605 #if defined(__SHADOW_RECORD_ALL__)
608 # ifdef __KERNEL_GPU__
613 for (
int j = 0; j < num_hits - 1; ++j) {
614 if (hits[j].
t > hits[j + 1].
t) {
616 hits[j] = hits[j + 1];
624 qsort(hits, num_hits,
sizeof(
Intersection), intersections_compare);
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
#define ccl_device_intersect
RTCIntersectContext context
ccl_device_inline float3 ray_offset(float3 P, float3 Ng)
ccl_device_inline bool scene_intersect_valid(const Ray *ray)
ccl_device_intersect bool scene_intersect(KernelGlobals *kg, const Ray *ray, const uint visibility, Intersection *isect)
ccl_device_inline void kernel_embree_setup_rayhit(const Ray &ray, RTCRayHit &rayhit, const uint visibility)
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)
#define kernel_assert(cond)
#define kernel_tex_fetch(tex, index)
#define ccl_device_inline
#define CCL_NAMESPACE_END
#define PROFILING_INIT(kg, event)
@ PATH_RAY_ALL_VISIBILITY
@ SD_OBJECT_TRANSFORM_APPLIED
unsigned __int64 uint64_t
ccl_device_inline float __uint_as_float(uint i)
ccl_device_inline uint __float_as_uint(float f)
ccl_device_inline bool isfinite_safe(float f)
ccl_device_inline float len_squared(const float3 a)
@ PROFILING_INTERSECT_LOCAL
@ PROFILING_INTERSECT_VOLUME_ALL
@ PROFILING_INTERSECT_SHADOW_ALL
@ PROFILING_INTERSECT_VOLUME