12#define OPTIX_DEFINE_ABI_VERSION_ONLY
13#include <optix_function_table.h>
30 return (
T *)(((
uint64_t)optixGetPayload_7() << 32) | optixGetPayload_6());
35#ifdef __OBJECT_MOTION__
38 return optixGetInstanceIdFromHandle(optixGetTransformListHandle(0));
40 return optixGetInstanceId();
55 return optixIgnoreIntersection();
62#if defined(__HAIR__) || defined(__POINTCLOUD__)
63 if (!optixIsTriangleHit()) {
65 return optixIgnoreIntersection();
71 if (
object != optixGetPayload_4() ) {
73 return optixIgnoreIntersection();
76 const int prim = optixGetPrimitiveIndex();
79 return optixIgnoreIntersection();
82 const uint max_hits = optixGetPayload_5();
85 optixSetPayload_5(
true);
86 return optixTerminateRay();
94 for (
int i =
min(max_hits, local_isect->
num_hits) - 1;
i >= 0; --
i) {
95 if (optixGetRayTmax() == local_isect->
hits[
i].
t) {
96 return optixIgnoreIntersection();
102 if (local_isect->
num_hits > max_hits) {
104 if (hit >= max_hits) {
105 return optixIgnoreIntersection();
110 if (local_isect->
num_hits && optixGetRayTmax() > local_isect->
hits[0].
t) {
114 return optixIgnoreIntersection();
121 isect->
t = optixGetRayTmax();
126 const float2 barycentrics = optixGetTriangleBarycentrics();
127 isect->
u = barycentrics.
x;
128 isect->
v = barycentrics.
y;
139 optixIgnoreIntersection();
145#ifdef __SHADOW_RECORD_ALL__
146 int prim = optixGetPrimitiveIndex();
148# ifdef __VISIBILITY_FLAG__
149 const uint visibility = optixGetPayload_4();
151 return optixIgnoreIntersection();
155 float u = 0.0f,
v = 0.0f;
157 if (optixIsTriangleHit()) {
159 const float2 barycentrics = optixGetTriangleBarycentrics();
184 return optixIgnoreIntersection();
187# ifdef __SHADOW_LINKING__
189 return optixIgnoreIntersection();
193# ifndef __TRANSPARENT_SHADOWS__
195 optixSetPayload_5(
true);
196 return optixTerminateRay();
198 const uint max_transparent_hits = optixGetPayload_3();
199 const uint num_hits_packed = optixGetPayload_2();
206 optixSetPayload_5(
true);
207 return optixTerminateRay();
212 if (num_transparent_hits > max_transparent_hits) {
214 optixSetPayload_5(
true);
215 return optixTerminateRay();
226 optixSetPayload_5(
true);
227 return optixTerminateRay();
231 optixIgnoreIntersection();
239 uint record_index = num_recorded_hits;
244 if (record_index >= max_record_hits) {
247 uint max_recorded_hit = 0;
249 for (
int i = 1;
i < max_record_hits;
i++) {
251 if (isect_t > max_recorded_t) {
252 max_recorded_t = isect_t;
253 max_recorded_hit =
i;
257 if (optixGetRayTmax() >= max_recorded_t) {
263 record_index = max_recorded_hit;
274 optixIgnoreIntersection();
281#if defined(__HAIR__) || defined(__POINTCLOUD__)
282 if (!optixIsTriangleHit()) {
284 return optixIgnoreIntersection();
289#ifdef __VISIBILITY_FLAG__
290 const uint visibility = optixGetPayload_4();
292 return optixIgnoreIntersection();
297 return optixIgnoreIntersection();
300 const int prim = optixGetPrimitiveIndex();
303 return optixIgnoreIntersection();
310 const uint visibility = optixGetPayload_4();
311#ifdef __VISIBILITY_FLAG__
313 return optixIgnoreIntersection();
317 int prim = optixGetPrimitiveIndex();
318 if (optixIsTriangleHit()) {
331#ifdef __SHADOW_LINKING__
333 return optixIgnoreIntersection();
338 return optixIgnoreIntersection();
342 return optixTerminateRay();
347 return optixIgnoreIntersection();
355 const int prim = optixGetPrimitiveIndex();
358 optixSetPayload_4(
object);
360 if (optixIsTriangleHit()) {
361 const float2 barycentrics = optixGetTriangleBarycentrics();
364 optixSetPayload_3(prim);
369 optixSetPayload_1(optixGetAttribute_0());
370 optixSetPayload_2(optixGetAttribute_1());
371 optixSetPayload_3(segment.prim);
372 optixSetPayload_5(segment.type);
375 optixSetPayload_1(0);
376 optixSetPayload_2(0);
377 optixSetPayload_3(prim);
389# ifdef __VISIBILITY_FLAG__
390 const uint visibility = optixGetPayload_4();
396 const float3 ray_P = optixGetObjectRayOrigin();
397 const float3 ray_D = optixGetObjectRayDirection();
398 const float ray_tmin = optixGetRayTmin();
400# ifdef __OBJECT_MOTION__
401 const float time = optixGetRayTime();
403 const float time = 0.0f;
407 isect.
t = optixGetRayTmax();
409 if (curve_intersect(
nullptr, &isect, ray_P, ray_D, ray_tmin, isect.
t,
object, prim, time, type))
411 static_assert(
PRIMITIVE_ALL < 128,
"Values >= 128 are reserved for OptiX internal use");
412 optixReportIntersection(isect.
t,
419extern "C" __global__
void __intersection__curve_ribbon()
425 optix_intersection_curve(prim, type);
432extern "C" __global__
void __intersection__point()
434 const int prim = optixGetPrimitiveIndex();
438# ifdef __VISIBILITY_FLAG__
439 const uint visibility = optixGetPayload_4();
445 const float3 ray_P = optixGetObjectRayOrigin();
446 const float3 ray_D = optixGetObjectRayDirection();
447 const float ray_tmin = optixGetRayTmin();
449# ifdef __OBJECT_MOTION__
450 const float time = optixGetRayTime();
452 const float time = 0.0f;
456 isect.
t = optixGetRayTmax();
458 if (point_intersect(
nullptr, &isect, ray_P, ray_D, ray_tmin, isect.
t,
object, prim, time, type))
460 static_assert(
PRIMITIVE_ALL < 128,
"Values >= 128 are reserved for OptiX internal use");
470 const uint visibility,
477 uint p4 = visibility;
482 uint ray_mask = visibility & 0xFF;
483 uint ray_flags = OPTIX_RAY_FLAG_ENFORCE_ANYHIT;
484 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
488 ray_flags |= OPTIX_RAY_FLAG_TERMINATE_ON_FIRST_HIT;
523 const uint visibility)
529 uint p4 = visibility;
534 uint ray_mask = visibility & 0xFF;
535 uint ray_flags = OPTIX_RAY_FLAG_ENFORCE_ANYHIT;
536 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
540 ray_flags |= OPTIX_RAY_FLAG_TERMINATE_ON_FIRST_HIT;
563 return optixHitObjectIsHit();
567template<
bool single_hit = false>
571 const int local_object,
579 uint p4 = local_object;
587 local_isect->num_hits = 0;
597 OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
614#ifdef __SHADOW_RECORD_ALL__
618 const uint visibility,
619 const uint max_transparent_hits,
626 uint p3 = max_transparent_hits;
627 uint p4 = visibility;
632 uint ray_mask = visibility & 0xFF;
633 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
645 OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
669 const uint visibility)
675 uint p4 = visibility;
680 uint ray_mask = visibility & 0xFF;
681 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
693 OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
ATTR_WARN_UNUSED_RESULT const BMVert * v
unsigned long long int uint64_t
ccl_device_forceinline int intersection_get_shader_flags(KernelGlobals kg, const int prim, const int type)
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)
CCL_NAMESPACE_BEGIN ccl_device_inline bool intersection_ray_valid(const ccl_private Ray *ray)
#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 ccl_device_forceinline
#define kernel_data_fetch(name, index)
#define INTEGRATOR_SHADOW_ISECT_SIZE
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
VecBase< float, D > normalize(VecOp< float, D >) RET
VecBase< float, 3 > cross(VecOp< float, 3 >, VecOp< float, 3 >) RET
#define ccl_device_intersect
ccl_device_forceinline T * get_payload_ptr_6()
__global__ void __anyhit__kernel_optix_volume_test()
__global__ void __miss__kernel_optix_miss()
__global__ void __anyhit__kernel_optix_visibility_test()
__global__ void __closesthit__kernel_optix_ignore()
__global__ void __anyhit__kernel_optix_local_hit()
__global__ void __anyhit__kernel_optix_shadow_all_hit()
__global__ void __closesthit__kernel_optix_hit()
__global__ void __anyhit__kernel_optix_ignore()
ccl_device_forceinline T * get_payload_ptr_2()
CCL_NAMESPACE_BEGIN ccl_device_forceinline T * get_payload_ptr_0()
ccl_device_intersect bool scene_intersect(KernelGlobals kg, const ccl_private Ray *ray, const uint visibility, ccl_private Intersection *isect)
ccl_device_intersect bool scene_intersect_shadow(KernelGlobals kg, const ccl_private Ray *ray, const uint visibility)
ccl_device_forceinline int get_object_id()
@ SD_HAS_TRANSPARENT_SHADOW
CCL_NAMESPACE_BEGIN ccl_device uint lcg_step_uint(T rng)
ccl_device_inline uint uint16_unpack_from_uint_1(const uint i)
ccl_device_inline uint pointer_pack_to_uint_1(T *ptr)
ccl_device_inline uint uint16_pack_to_uint(const uint a, const uint b)
ccl_device_inline uint pointer_pack_to_uint_0(T *ptr)
ccl_device_inline T * pointer_unpack_from_uint(const uint a, const uint b)
ccl_device_inline uint uint16_unpack_from_uint_0(const uint i)
Segment< FEdge *, Vec3r > segment
IntegratorShadowStateCPU * IntegratorShadowState
#define INTEGRATOR_STATE_ARRAY_WRITE(state, nested_struct, array_index, member)
#define INTEGRATOR_STATE_ARRAY(state, nested_struct, array_index, member)
struct Intersection hits[LOCAL_MAX_HITS]
float3 Ng[LOCAL_MAX_HITS]