30 volume_ray.P = from_P;
32 volume_ray.tmin = 0.0f;
43# ifdef __VOLUME_RECORD_ALL__
45 const uint num_hits = scene_intersect_volume(
46 kg, &volume_ray, hits, 2 * volume_stack_size, visibility);
52 for (
uint hit = 0; hit < num_hits; ++hit, ++isect) {
54 if (isect->
object == volume_ray.self.object) {
58 volume_stack_enter_exit<false>(kg,
state, stack_sd);
64 while (
step < 2 * volume_stack_size &&
65 scene_intersect_volume(kg, &volume_ray, &isect, visibility))
68 if (isect.
object != volume_ray.self.object) {
70 volume_stack_enter_exit<false>(kg,
state, stack_sd);
74 volume_ray.self.object = isect.
object;
75 volume_ray.self.prim = isect.
prim;
94 volume_ray.tmin = 0.0f;
102 int enclosed_index = 0;
112 state, volume_stack, stack_index,
object) =
kernel_data.background.object_index;
114 state, volume_stack, stack_index, shader) =
kernel_data.background.volume_shader;
122# ifdef __VOLUME_RECORD_ALL__
124 const uint num_hits = scene_intersect_volume(
125 kg, &volume_ray, hits, 2 * volume_stack_size, visibility);
132 for (
uint hit = 0; hit < num_hits; ++hit, ++isect) {
135 bool need_add =
true;
136 for (
int i = 0;
i < enclosed_index && need_add; ++
i) {
140 if (enclosed_volumes[
i] == stack_sd->object) {
144 for (
int i = 0;
i < stack_index && need_add; ++
i) {
147 if (entry.
object == stack_sd->object) {
152 if (need_add && stack_index < volume_stack_size - 1) {
153 const VolumeStack new_entry = {stack_sd->object, stack_sd->shader};
154 integrator_state_write_volume_stack(
state, stack_index, new_entry);
162 enclosed_volumes[enclosed_index++] = stack_sd->object;
172 step < 2 * volume_stack_size)
175 if (!scene_intersect_volume(kg, &volume_ray, &isect, visibility)) {
184 bool need_add =
true;
185 for (
int i = 0;
i < enclosed_index && need_add; ++
i) {
189 if (enclosed_volumes[
i] == stack_sd->object) {
193 for (
int i = 0;
i < stack_index && need_add; ++
i) {
196 if (entry.
object == stack_sd->object) {
202 const VolumeStack new_entry = {stack_sd->object, stack_sd->shader};
203 integrator_state_write_volume_stack(
state, stack_index, new_entry);
211 enclosed_volumes[enclosed_index++] = stack_sd->object;
216 volume_ray.self.object = isect.
object;
217 volume_ray.self.prim = isect.
prim;
224 integrator_state_write_volume_stack(
state, stack_index, new_entry);