diff options
-rw-r--r-- | intern/cycles/kernel/kernel_path.h | 13 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_path_state.h | 12 | ||||
-rw-r--r-- | intern/cycles/kernel/split/kernel_indirect_background.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/split/kernel_scene_intersect.h | 16 |
4 files changed, 31 insertions, 12 deletions
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 3319e2c2435..bc8f8ec09f8 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -111,7 +111,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, /* intersect scene */ Intersection isect; uint visibility = path_state_ray_visibility(kg, state); - if(state->bounce > kernel_data.integrator.ao_bounces) { + if(path_state_ao_bounce(kg, state)) { visibility = PATH_RAY_SHADOW; ray->t = kernel_data.background.ao_distance; } @@ -294,7 +294,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, break; } - else if(state->bounce > kernel_data.integrator.ao_bounces) { + else if(path_state_ao_bounce(kg, state)) { break; } @@ -473,13 +473,18 @@ ccl_device_inline void kernel_path_integrate(KernelGlobals *kg, lcg_state = lcg_state_init(&state, 0x51633e2d); } - if(state.bounce > kernel_data.integrator.ao_bounces) { + if(path_state_ao_bounce(kg, &state)) { visibility = PATH_RAY_SHADOW; ray.t = kernel_data.background.ao_distance; } bool hit = scene_intersect(kg, ray, visibility, &isect, &lcg_state, difl, extmax); #else + if(path_state_ao_bounce(kg, state)) { + visibility = PATH_RAY_SHADOW; + ray.t = kernel_data.background.ao_distance; + } + bool hit = scene_intersect(kg, ray, visibility, &isect, NULL, 0.0f, 0.0f); #endif /* __HAIR__ */ @@ -620,7 +625,7 @@ ccl_device_inline void kernel_path_integrate(KernelGlobals *kg, break; } - else if(state.bounce > kernel_data.integrator.ao_bounces) { + else if(path_state_ao_bounce(kg, &state)) { break; } diff --git a/intern/cycles/kernel/kernel_path_state.h b/intern/cycles/kernel/kernel_path_state.h index af208ff37f1..bedcd655bc6 100644 --- a/intern/cycles/kernel/kernel_path_state.h +++ b/intern/cycles/kernel/kernel_path_state.h @@ -143,7 +143,7 @@ ccl_device_inline void path_state_next(KernelGlobals *kg, ccl_addr_space PathSta #endif } -ccl_device_inline uint path_state_ray_visibility(KernelGlobals *kg, PathState *state) +ccl_device_inline uint path_state_ray_visibility(KernelGlobals *kg, ccl_addr_space PathState *state) { uint flag = state->flag & PATH_RAY_ALL_VISIBILITY; @@ -214,5 +214,15 @@ ccl_device_inline void path_state_modify_bounce(ccl_addr_space PathState *state, state->bounce -= 1; } +ccl_device_inline bool path_state_ao_bounce(KernelGlobals *kg, ccl_addr_space PathState *state) +{ + if(state->bounce <= kernel_data.integrator.ao_bounces) { + return false; + } + + int bounce = state->bounce - state->transmission_bounce - (state->glossy_bounce > 0); + return (bounce > kernel_data.integrator.ao_bounces); +} + CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/split/kernel_indirect_background.h b/intern/cycles/kernel/split/kernel_indirect_background.h index 04d5769ef0d..2e9231caa3e 100644 --- a/intern/cycles/kernel/split/kernel_indirect_background.h +++ b/intern/cycles/kernel/split/kernel_indirect_background.h @@ -33,7 +33,7 @@ ccl_device void kernel_indirect_background(KernelGlobals *kg) if(ray_index != QUEUE_EMPTY_SLOT) { if(IS_STATE(ray_state, ray_index, RAY_ACTIVE)) { ccl_global PathState *state = &kernel_split_state.path_state[ray_index]; - if(state->bounce > kernel_data.integrator.ao_bounces) { + if(path_state_ao_bounce(kg, state)) { kernel_split_path_end(kg, ray_index); } } diff --git a/intern/cycles/kernel/split/kernel_scene_intersect.h b/intern/cycles/kernel/split/kernel_scene_intersect.h index d0afd39ef29..99095f8fcbc 100644 --- a/intern/cycles/kernel/split/kernel_scene_intersect.h +++ b/intern/cycles/kernel/split/kernel_scene_intersect.h @@ -60,13 +60,13 @@ ccl_device void kernel_scene_intersect(KernelGlobals *kg) } Intersection isect; - PathState state = kernel_split_state.path_state[ray_index]; + ccl_global PathState *state = &kernel_split_state.path_state[ray_index]; Ray ray = kernel_split_state.ray[ray_index]; /* intersect scene */ - uint visibility = path_state_ray_visibility(kg, &state); + uint visibility = path_state_ray_visibility(kg, state); - if(state.bounce > kernel_data.integrator.ao_bounces) { + if(path_state_ao_bounce(kg, state)) { visibility = PATH_RAY_SHADOW; ray.t = kernel_data.background.ao_distance; } @@ -76,18 +76,22 @@ ccl_device void kernel_scene_intersect(KernelGlobals *kg) uint lcg_state = 0; if(kernel_data.bvh.have_curves) { - if((kernel_data.cam.resolution == 1) && (state.flag & PATH_RAY_CAMERA)) { + if((kernel_data.cam.resolution == 1) && (state->flag & PATH_RAY_CAMERA)) { float3 pixdiff = ray.dD.dx + ray.dD.dy; /*pixdiff = pixdiff - dot(pixdiff, ray.D)*ray.D;*/ difl = kernel_data.curve.minimum_width * len(pixdiff) * 0.5f; } extmax = kernel_data.curve.maximum_width; - lcg_state = lcg_state_init(&state, 0x51633e2d); + lcg_state = lcg_state_init_addrspace(state, 0x51633e2d); } bool hit = scene_intersect(kg, ray, visibility, &isect, &lcg_state, difl, extmax); #else + if(path_state_ao_bounce(kg, state)) { + visibility = PATH_RAY_SHADOW; + ray.t = kernel_data.background.ao_distance; + } bool hit = scene_intersect(kg, ray, visibility, &isect, NULL, 0.0f, 0.0f); #endif kernel_split_state.isect[ray_index] = isect; @@ -95,7 +99,7 @@ ccl_device void kernel_scene_intersect(KernelGlobals *kg) #ifdef __KERNEL_DEBUG__ PathRadiance *L = &kernel_split_state.path_radiance[ray_index]; - if(state.flag & PATH_RAY_CAMERA) { + if(state->flag & PATH_RAY_CAMERA) { L->debug_data.num_bvh_traversed_nodes += isect.num_traversed_nodes; L->debug_data.num_bvh_traversed_instances += isect.num_traversed_instances; L->debug_data.num_bvh_intersections += isect.num_intersections; |