27 volume_ray.
P = from_P;
28 volume_ray.D =
normalize_len(to_P - from_P, &volume_ray.tmax);
29 volume_ray.tmin = 0.0f;
41# ifdef __VOLUME_RECORD_ALL__
43 uint num_hits = scene_intersect_volume(kg, &volume_ray, hits, 2 * volume_stack_size, visibility);
49 for (
uint hit = 0; hit < num_hits; ++hit, ++isect) {
51 if (isect->
object == volume_ray.self.object) {
55 volume_stack_enter_exit(kg,
state, stack_sd);
61 while (step < 2 * volume_stack_size &&
62 scene_intersect_volume(kg, &volume_ray, &isect, visibility))
65 if (isect.
object != volume_ray.self.object) {
67 volume_stack_enter_exit(kg,
state, stack_sd);
71 volume_ray.self.object = isect.
object;
72 volume_ray.self.prim = isect.
prim;
91 volume_ray.tmin = 0.0f;
99 int stack_index = 0, enclosed_index = 0;
110 state, volume_stack, stack_index, shader) =
kernel_data.background.volume_shader;
118# ifdef __VOLUME_RECORD_ALL__
120 uint num_hits = scene_intersect_volume(kg, &volume_ray, hits, 2 * volume_stack_size, visibility);
127 for (
uint hit = 0; hit < num_hits; ++hit, ++isect) {
130 bool need_add =
true;
131 for (
int i = 0; i < enclosed_index && need_add; ++i) {
135 if (enclosed_volumes[i] == stack_sd->object) {
139 for (
int i = 0; i < stack_index && need_add; ++i) {
142 if (entry.
object == stack_sd->object) {
147 if (need_add && stack_index < volume_stack_size - 1) {
149 integrator_state_write_volume_stack(
state, stack_index, new_entry);
157 enclosed_volumes[enclosed_index++] = stack_sd->object;
167 step < 2 * volume_stack_size)
170 if (!scene_intersect_volume(kg, &volume_ray, &isect, visibility)) {
179 bool need_add =
true;
180 for (
int i = 0; i < enclosed_index && need_add; ++i) {
184 if (enclosed_volumes[i] == stack_sd->object) {
188 for (
int i = 0; i < stack_index && need_add; ++i) {
191 if (entry.
object == stack_sd->object) {
198 integrator_state_write_volume_stack(
state, stack_index, new_entry);
206 enclosed_volumes[enclosed_index++] = stack_sd->object;
211 volume_ray.self.object = isect.
object;
212 volume_ray.self.prim = isect.
prim;
219 integrator_state_write_volume_stack(
state, stack_index, new_entry);