diff --git a/intern/cycles/kernel/integrator/shade_volume.h b/intern/cycles/kernel/integrator/shade_volume.h index 8b297f4c653..58ab4349396 100644 --- a/intern/cycles/kernel/integrator/shade_volume.h +++ b/intern/cycles/kernel/integrator/shade_volume.h @@ -304,28 +304,28 @@ ccl_device_noinline Extrema volume_estimate_extrema(KernelGlobals kg, const IntegratorGenericState state, const ccl_private RNGState *rng_state, const uint32_t path_flag, - const VolumeStack entry) + const ccl_private OctreeTracing &octree) { - const bool homogeneous = volume_is_homogeneous(kg, entry); + const bool homogeneous = volume_is_homogeneous(kg, octree.entry); const int samples = homogeneous ? 1 : 4; const float shade_offset = homogeneous ? 0.5f : path_state_rng_2D(kg, rng_state, PRNG_VOLUME_SHADE_OFFSET).y; - const float step_size = (ray->tmax - ray->tmin) / float(samples); + const float step_size = octree.t.length() / float(samples); /* Do not allocate closures. */ sd->num_closure_left = 0; Extrema extrema = {FLT_MAX, -FLT_MAX}; for (int i = 0; i < samples; i++) { - const float shade_t = min(ray->tmax, ray->tmin + (shade_offset + i) * step_size); + const float shade_t = octree.t.min + (shade_offset + i) * step_size; sd->P = ray->P + ray->D * shade_t; sd->closure_transparent_extinction = zero_float3(); sd->closure_emission_background = zero_float3(); volume_shader_eval_entry( - kg, state, sd, entry, path_flag); + kg, state, sd, octree.entry, path_flag); const float sigma = reduce_max(sd->closure_transparent_extinction); const float emission = reduce_max(sd->closure_emission_background); @@ -359,7 +359,7 @@ ccl_device_inline Extrema volume_object_get_extrema(KernelGlobals kg, return octree.node->sigma * object_volume_density(kg, octree.entry.object); } - return volume_estimate_extrema(kg, ray, sd, state, rng_state, path_flag, octree.entry); + return volume_estimate_extrema(kg, ray, sd, state, rng_state, path_flag, octree); } /* Find the octree root node in the kernel array that corresponds to the volume stack entry. */