26 volume_ray.P = from_P;
27 volume_ray.D =
normalize_len(to_P - from_P, &volume_ray.tmax);
28 volume_ray.tmin = 0.0f;
39 #ifdef __VOLUME_RECORD_ALL__
41 uint num_hits = scene_intersect_volume(kg, &volume_ray, hits, 2 * volume_stack_size, visibility);
47 for (
uint hit = 0; hit < num_hits; ++hit, ++isect) {
49 if (isect->
object == volume_ray.self.object) {
59 while (step < 2 * volume_stack_size &&
60 scene_intersect_volume(kg, &volume_ray, &isect, visibility)) {
62 if (isect.
object != volume_ray.self.object) {
68 volume_ray.self.object = isect.
object;
69 volume_ray.self.prim = isect.
prim;
88 volume_ray.tmin = 0.0f;
89 volume_ray.tmax = FLT_MAX;
95 int stack_index = 0, enclosed_index = 0;
106 state, volume_stack, stack_index, shader) =
kernel_data.background.volume_shader;
114 #ifdef __VOLUME_RECORD_ALL__
116 uint num_hits = scene_intersect_volume(kg, &volume_ray, hits, 2 * volume_stack_size, visibility);
123 for (
uint hit = 0; hit < num_hits; ++hit, ++isect) {
126 bool need_add =
true;
127 for (
int i = 0; i < enclosed_index && need_add; ++i) {
131 if (enclosed_volumes[i] == stack_sd->object) {
135 for (
int i = 0; i < stack_index && need_add; ++i) {
138 if (entry.
object == stack_sd->object) {
143 if (need_add && stack_index < volume_stack_size - 1) {
153 enclosed_volumes[enclosed_index++] = stack_sd->object;
163 step < 2 * volume_stack_size) {
165 if (!scene_intersect_volume(kg, &volume_ray, &isect, visibility)) {
174 bool need_add =
true;
175 for (
int i = 0; i < enclosed_index && need_add; ++i) {
179 if (enclosed_volumes[i] == stack_sd->object) {
183 for (
int i = 0; i < stack_index && need_add; ++i) {
186 if (entry.
object == stack_sd->object) {
201 enclosed_volumes[enclosed_index++] = stack_sd->object;
206 volume_ray.self.object = isect.
object;
207 volume_ray.self.prim = isect.
prim;
223 integrator_intersect_next_kernel_after_shadow_catcher_volume<
#define kernel_assert(cond)
#define ccl_optional_struct_init
#define CCL_NAMESPACE_END
ccl_device_forceinline float intersection_t_offset(const float t)
ccl_device int intersections_compare(const void *a, const void *b)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
ccl_device void integrator_intersect_volume_stack(KernelGlobals kg, IntegratorState state)
CCL_NAMESPACE_BEGIN ccl_device void integrator_volume_stack_update_for_subsurface(KernelGlobals kg, IntegratorState state, const float3 from_P, const float3 to_P)
ccl_device void integrator_volume_stack_init(KernelGlobals kg, IntegratorState state)
#define MAX_VOLUME_STACK_SIZE
#define AS_SHADER_DATA(shader_data_tiny_storage)
@ PATH_RAY_SHADOW_CATCHER_PASS
@ PATH_RAY_ALL_VISIBILITY
#define SHADOW_CATCHER_PATH_VISIBILITY(path_flag, visibility)
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_VOLUME_STACK
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST
#define PROFILING_INIT(kg, event)
ccl_device_inline float2 normalize_len(const float2 &a, float *t)
CCL_NAMESPACE_BEGIN ccl_device_inline void shader_setup_from_ray(KernelGlobals kg, ccl_private ShaderData *ccl_restrict sd, ccl_private const Ray *ccl_restrict ray, ccl_private const Intersection *ccl_restrict isect)
#define INTEGRATOR_STATE_ARRAY_WRITE(state, nested_struct, array_index, member)
IntegratorStateCPU *ccl_restrict IntegratorState
#define INTEGRATOR_STATE(state, nested_struct, member)
ccl_device_forceinline void integrator_path_next(KernelGlobals kg, IntegratorState state, const DeviceKernel current_kernel, const DeviceKernel next_kernel)
ccl_device_forceinline VolumeStack integrator_state_read_volume_stack(ConstIntegratorState state, int i)
ccl_device_forceinline void integrator_state_read_ray(KernelGlobals kg, ConstIntegratorState state, ccl_private Ray *ccl_restrict ray)
ccl_device_forceinline void integrator_state_write_volume_stack(IntegratorState state, int i, VolumeStack entry)
@ PROFILING_INTERSECT_VOLUME_STACK
ccl_device void volume_stack_enter_exit(KernelGlobals kg, ccl_private const ShaderData *sd, StackReadOp stack_read, StackWriteOp stack_write)