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#if defined(__HAIR__) || defined(__POINTCLOUD__)
56 if (!optixIsTriangleHit()) {
58 return optixIgnoreIntersection();
64 if (
object != optixGetPayload_4() ) {
66 return optixIgnoreIntersection();
69 const int prim = optixGetPrimitiveIndex();
72 return optixIgnoreIntersection();
75 const uint max_hits = optixGetPayload_5();
78 optixSetPayload_5(
true);
79 return optixTerminateRay();
87 for (
int i =
min(max_hits, local_isect->
num_hits) - 1; i >= 0; --i) {
88 if (optixGetRayTmax() == local_isect->
hits[i].
t) {
89 return optixIgnoreIntersection();
95 if (local_isect->
num_hits > max_hits) {
97 if (hit >= max_hits) {
98 return optixIgnoreIntersection();
103 if (local_isect->
num_hits && optixGetRayTmax() > local_isect->
hits[0].
t) {
107 return optixIgnoreIntersection();
114 isect->
t = optixGetRayTmax();
119 const float2 barycentrics = optixGetTriangleBarycentrics();
120 isect->
u = barycentrics.
x;
121 isect->
v = barycentrics.
y;
132 optixIgnoreIntersection();
138#ifdef __SHADOW_RECORD_ALL__
139 int prim = optixGetPrimitiveIndex();
141# ifdef __VISIBILITY_FLAG__
142 const uint visibility = optixGetPayload_4();
144 return optixIgnoreIntersection();
148 float u = 0.0f,
v = 0.0f;
150 if (optixIsTriangleHit()) {
152 const float2 barycentrics = optixGetTriangleBarycentrics();
167# if OPTIX_ABI_VERSION < 55
169 if (u == 0.0f || u == 1.0f) {
170 return optixIgnoreIntersection();
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_hits = optixGetPayload_3();
199 const uint num_hits_packed = optixGetPayload_2();
204 if (num_hits >= max_hits ||
207 optixSetPayload_5(
true);
208 return optixTerminateRay();
219 optixSetPayload_5(
true);
220 return optixTerminateRay();
224 optixIgnoreIntersection();
232 uint record_index = num_recorded_hits;
237 if (record_index >= max_record_hits) {
240 uint max_recorded_hit = 0;
242 for (
int i = 1; i < max_record_hits; i++) {
244 if (isect_t > max_recorded_t) {
245 max_recorded_t = isect_t;
246 max_recorded_hit = i;
250 if (optixGetRayTmax() >= max_recorded_t) {
256 record_index = max_recorded_hit;
267 optixIgnoreIntersection();
274#if defined(__HAIR__) || defined(__POINTCLOUD__)
275 if (!optixIsTriangleHit()) {
277 return optixIgnoreIntersection();
282#ifdef __VISIBILITY_FLAG__
283 const uint visibility = optixGetPayload_4();
285 return optixIgnoreIntersection();
290 return optixIgnoreIntersection();
293 const int prim = optixGetPrimitiveIndex();
296 return optixIgnoreIntersection();
303# if OPTIX_ABI_VERSION < 55
304 if (optixGetPrimitiveType() == OPTIX_PRIMITIVE_TYPE_ROUND_CUBIC_BSPLINE) {
307 if (u == 0.0f || u == 1.0f) {
308 return optixIgnoreIntersection();
315 const uint visibility = optixGetPayload_4();
316#ifdef __VISIBILITY_FLAG__
318 return optixIgnoreIntersection();
322 int prim = optixGetPrimitiveIndex();
323 if (optixIsTriangleHit()) {
336#ifdef __SHADOW_LINKING__
338 return optixIgnoreIntersection();
343 return optixIgnoreIntersection();
347 return optixTerminateRay();
352 return optixIgnoreIntersection();
360 const int prim = optixGetPrimitiveIndex();
363 optixSetPayload_4(
object);
365 if (optixIsTriangleHit()) {
366 const float2 barycentrics = optixGetTriangleBarycentrics();
369 optixSetPayload_3(prim);
374 optixSetPayload_1(optixGetAttribute_0());
375 optixSetPayload_2(optixGetAttribute_1());
376 optixSetPayload_3(segment.prim);
377 optixSetPayload_5(segment.type);
380 optixSetPayload_1(0);
381 optixSetPayload_2(0);
382 optixSetPayload_3(prim);
394# ifdef __VISIBILITY_FLAG__
395 const uint visibility = optixGetPayload_4();
401 const float3 ray_P = optixGetObjectRayOrigin();
402 const float3 ray_D = optixGetObjectRayDirection();
403 const float ray_tmin = optixGetRayTmin();
405# ifdef __OBJECT_MOTION__
406 const float time = optixGetRayTime();
408 const float time = 0.0f;
412 isect.
t = optixGetRayTmax();
414 if (curve_intersect(
NULL, &isect, ray_P, ray_D, ray_tmin, isect.
t,
object, prim, time, type)) {
415 static_assert(
PRIMITIVE_ALL < 128,
"Values >= 128 are reserved for OptiX internal use");
416 optixReportIntersection(isect.
t,
423extern "C" __global__
void __intersection__curve_ribbon()
426 const int prim = segment.prim;
427 const int type = segment.type;
429 optix_intersection_curve(prim, type);
436extern "C" __global__
void __intersection__point()
438 const int prim = optixGetPrimitiveIndex();
442# ifdef __VISIBILITY_FLAG__
443 const uint visibility = optixGetPayload_4();
449 const float3 ray_P = optixGetObjectRayOrigin();
450 const float3 ray_D = optixGetObjectRayDirection();
451 const float ray_tmin = optixGetRayTmin();
453# ifdef __OBJECT_MOTION__
454 const float time = optixGetRayTime();
456 const float time = 0.0f;
460 isect.
t = optixGetRayTmax();
462 if (point_intersect(
NULL, &isect, ray_P, ray_D, ray_tmin, isect.
t,
object, prim, time, type)) {
463 static_assert(
PRIMITIVE_ALL < 128,
"Values >= 128 are reserved for OptiX internal use");
473 const uint visibility,
480 uint p4 = visibility;
485 uint ray_mask = visibility & 0xFF;
486 uint ray_flags = OPTIX_RAY_FLAG_ENFORCE_ANYHIT;
487 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
491 ray_flags |= OPTIX_RAY_FLAG_TERMINATE_ON_FIRST_HIT;
526 const uint visibility)
533template<
bool single_hit = false>
545 uint p4 = local_object;
553 local_isect->num_hits = 0;
563 OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
580#ifdef __SHADOW_RECORD_ALL__
593 uint p4 = visibility;
598 uint ray_mask = visibility & 0xFF;
599 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
611 OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
635 const uint visibility)
641 uint p4 = visibility;
646 uint ray_mask = visibility & 0xFF;
647 if (0 == ray_mask && (visibility & ~0xFF) != 0) {
659 OPTIX_RAY_FLAG_ENFORCE_ANYHIT,
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
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_ray_data const RaySelfPrimitives &self, const int prim)
ccl_device_inline bool intersection_skip_self(ccl_ray_data const RaySelfPrimitives &self, const int object, const int prim)
ccl_device_inline bool intersection_skip_shadow_link(KernelGlobals kg, ccl_ray_data const RaySelfPrimitives &self, const int isect_object)
#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_ray_data const RaySelfPrimitives &self, const int object, const int prim)
CCL_NAMESPACE_BEGIN ccl_device_inline bool intersection_ray_valid(ccl_private const Ray *ray)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device_forceinline
#define ccl_device_inline
#define CCL_NAMESPACE_END
#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()
ccl_device_intersect bool scene_intersect(KernelGlobals kg, ccl_private const Ray *ray, const uint visibility, ccl_private Intersection *isect)
__global__ void __anyhit__kernel_optix_local_hit()
__global__ void __anyhit__kernel_optix_shadow_all_hit()
__global__ void __closesthit__kernel_optix_hit()
ccl_device_intersect bool scene_intersect_shadow(KernelGlobals kg, ccl_private const Ray *ray, const uint visibility)
ccl_device_forceinline T * get_payload_ptr_2()
CCL_NAMESPACE_BEGIN ccl_device_forceinline T * get_payload_ptr_0()
ccl_device_forceinline int get_object_id()
@ SD_HAS_TRANSPARENT_SHADOW
#define INTEGRATOR_SHADOW_ISECT_SIZE
CCL_NAMESPACE_BEGIN ccl_device uint lcg_step_uint(T rng)
ccl_device_inline float cross(const float2 a, const float2 b)
#define INTEGRATOR_STATE_ARRAY_WRITE(state, nested_struct, array_index, member)
IntegratorShadowStateCPU *ccl_restrict IntegratorShadowState
#define INTEGRATOR_STATE_ARRAY(state, nested_struct, array_index, member)
unsigned __int64 uint64_t
struct Intersection hits[LOCAL_MAX_HITS]
float3 Ng[LOCAL_MAX_HITS]
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)