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();
174# if OPTIX_ABI_VERSION < 55
176 if (u == 0.0f || u == 1.0f) {
177 return optixIgnoreIntersection();
191 return optixIgnoreIntersection();
194# ifdef __SHADOW_LINKING__
196 return optixIgnoreIntersection();
200# ifndef __TRANSPARENT_SHADOWS__
202 optixSetPayload_5(
true);
203 return optixTerminateRay();
205 const uint max_hits = optixGetPayload_3();
206 const uint num_hits_packed = optixGetPayload_2();
211 if (num_hits >= max_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# if OPTIX_ABI_VERSION < 55
311 if (optixGetPrimitiveType() == OPTIX_PRIMITIVE_TYPE_ROUND_CUBIC_BSPLINE) {
314 if (u == 0.0f || u == 1.0f) {
315 return optixIgnoreIntersection();
322 const uint visibility = optixGetPayload_4();
323#ifdef __VISIBILITY_FLAG__
325 return optixIgnoreIntersection();
329 int prim = optixGetPrimitiveIndex();
330 if (optixIsTriangleHit()) {
343#ifdef __SHADOW_LINKING__
345 return optixIgnoreIntersection();
350 return optixIgnoreIntersection();
354 return optixTerminateRay();
359 return optixIgnoreIntersection();
367 const int prim = optixGetPrimitiveIndex();
370 optixSetPayload_4(
object);
372 if (optixIsTriangleHit()) {
373 const float2 barycentrics = optixGetTriangleBarycentrics();
376 optixSetPayload_3(prim);
381 optixSetPayload_1(optixGetAttribute_0());
382 optixSetPayload_2(optixGetAttribute_1());
383 optixSetPayload_3(segment.prim);
384 optixSetPayload_5(segment.type);
387 optixSetPayload_1(0);
388 optixSetPayload_2(0);
389 optixSetPayload_3(prim);
401# ifdef __VISIBILITY_FLAG__
402 const uint visibility = optixGetPayload_4();
408 const float3 ray_P = optixGetObjectRayOrigin();
409 const float3 ray_D = optixGetObjectRayDirection();
410 const float ray_tmin = optixGetRayTmin();
412# ifdef __OBJECT_MOTION__
413 const float time = optixGetRayTime();
415 const float time = 0.0f;
419 isect.
t = optixGetRayTmax();
421 if (curve_intersect(
nullptr, &isect, ray_P, ray_D, ray_tmin, isect.
t,
object, prim, time, type))
423 static_assert(
PRIMITIVE_ALL < 128,
"Values >= 128 are reserved for OptiX internal use");
424 optixReportIntersection(isect.
t,
431extern "C" __global__
void __intersection__curve_ribbon()
437 optix_intersection_curve(prim, type);
444extern "C" __global__
void __intersection__point()
446 const int prim = optixGetPrimitiveIndex();
450# ifdef __VISIBILITY_FLAG__
451 const uint visibility = optixGetPayload_4();
457 const float3 ray_P = optixGetObjectRayOrigin();
458 const float3 ray_D = optixGetObjectRayDirection();
459 const float ray_tmin = optixGetRayTmin();
461# ifdef __OBJECT_MOTION__
462 const float time = optixGetRayTime();
464 const float time = 0.0f;
468 isect.
t = optixGetRayTmax();
470 if (point_intersect(
nullptr, &isect, ray_P, ray_D, ray_tmin, isect.
t,
object, prim, time, type))
472 static_assert(
PRIMITIVE_ALL < 128,
"Values >= 128 are reserved for OptiX internal use");
482 const uint visibility,
489 uint p4 = visibility;
494 uint ray_mask = visibility & 0xFF;
495 uint ray_flags = OPTIX_RAY_FLAG_ENFORCE_ANYHIT;
496 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
500 ray_flags |= OPTIX_RAY_FLAG_TERMINATE_ON_FIRST_HIT;
535 const uint visibility)
541 uint p4 = visibility;
546 uint ray_mask = visibility & 0xFF;
547 uint ray_flags = OPTIX_RAY_FLAG_ENFORCE_ANYHIT;
548 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
552 ray_flags |= OPTIX_RAY_FLAG_TERMINATE_ON_FIRST_HIT;
575 return optixHitObjectIsHit();
579template<
bool single_hit = false>
583 const int local_object,
591 uint p4 = local_object;
599 local_isect->num_hits = 0;
609 OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
626#ifdef __SHADOW_RECORD_ALL__
630 const uint visibility,
639 uint p4 = visibility;
644 uint ray_mask = visibility & 0xFF;
645 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
657 OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
681 const uint visibility)
687 uint p4 = visibility;
692 uint ray_mask = visibility & 0xFF;
693 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
705 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]