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(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(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;
113 state, volume_stack, stack_index, shader) =
kernel_data.background.volume_shader;
121# ifdef __VOLUME_RECORD_ALL__
123 const uint num_hits = scene_intersect_volume(
124 kg, &volume_ray, hits, 2 * volume_stack_size, visibility);
131 for (
uint hit = 0; hit < num_hits; ++hit, ++isect) {
134 bool need_add =
true;
135 for (
int i = 0;
i < enclosed_index && need_add; ++
i) {
139 if (enclosed_volumes[
i] == stack_sd->object) {
143 for (
int i = 0;
i < stack_index && need_add; ++
i) {
146 if (entry.
object == stack_sd->object) {
151 if (need_add && stack_index < volume_stack_size - 1) {
152 const VolumeStack new_entry = {stack_sd->object, stack_sd->shader};
153 integrator_state_write_volume_stack(
state, stack_index, new_entry);
161 enclosed_volumes[enclosed_index++] = stack_sd->object;
171 step < 2 * volume_stack_size)
174 if (!scene_intersect_volume(kg, &volume_ray, &isect, visibility)) {
183 bool need_add =
true;
184 for (
int i = 0;
i < enclosed_index && need_add; ++
i) {
188 if (enclosed_volumes[
i] == stack_sd->object) {
192 for (
int i = 0;
i < stack_index && need_add; ++
i) {
195 if (entry.
object == stack_sd->object) {
201 const VolumeStack new_entry = {stack_sd->object, stack_sd->shader};
202 integrator_state_write_volume_stack(
state, stack_index, new_entry);
210 enclosed_volumes[enclosed_index++] = stack_sd->object;
215 volume_ray.self.object = isect.
object;
216 volume_ray.self.prim = isect.
prim;
223 integrator_state_write_volume_stack(
state, stack_index, new_entry);