19 #ifdef __VOLUME_SCATTER__
33 bool has_emission =
false;
36 # ifdef __OBJECT_MOTION__
38 light_ray.time = sd->time;
42 float light_u, light_v;
49 kg, sd, emission_sd, &ls,
state, &light_ray, &L_light, &is_lamp, terminate);
58 if (has_emission && !blocked) {
77 float phase_u, phase_v;
81 label = shader_volume_phase_sample(
82 kg, sd, phase_u, phase_v, &phase_eval, &phase_omega_in, &phase_domega_in, &phase_pdf);
91 state->ray_pdf = phase_pdf;
103 if (probability == 0.0f) {
106 else if (probability != 1.0f) {
110 if (terminate >= probability) {
114 *throughput /= probability;
119 ray->D = phase_omega_in;
122 # ifdef __RAY_DIFFERENTIALS__
124 ray->dD = phase_domega_in;
130 # if !defined(__SPLIT_KERNEL__) && (defined(__BRANCHED_PATH__) || defined(__VOLUME_DECOUPLED__))
131 ccl_device void kernel_branched_path_volume_connect_light(KernelGlobals *
kg,
137 bool sample_all_lights,
145 if (sample_all_lights) {
146 num_lights =
kernel_data.integrator.num_all_lights;
147 if (
kernel_data.integrator.pdf_triangles != 0.0f) {
152 for (
int i = 0; i < num_lights; ++i) {
155 int num_all_lights = 1;
157 bool double_pdf =
false;
158 bool is_mesh_light =
false;
159 bool is_lamp =
false;
161 if (sample_all_lights) {
163 is_lamp = i <
kernel_data.integrator.num_all_lights;
169 num_all_lights =
kernel_data.integrator.num_all_lights;
171 double_pdf =
kernel_data.integrator.pdf_triangles != 0.0f;
175 num_samples =
kernel_data.integrator.mesh_light_samples;
176 double_pdf =
kernel_data.integrator.num_all_lights != 0;
177 is_mesh_light =
true;
181 float num_samples_inv = 1.0f / (num_samples * num_all_lights);
183 for (
int j = 0; j < num_samples; j++) {
186 # ifdef __OBJECT_MOTION__
187 light_ray.time = sd->time;
189 bool has_emission =
false;
195 float light_u, light_v;
200 if (is_mesh_light && double_pdf) {
201 light_u = 0.5f * light_u;
205 const int lamp = is_lamp ? i : -1;
222 (ls.t != FLT_MAX) ? &ls.P :
237 kg, sd, emission_sd, &ls,
state, &light_ray, &L_light, &is_lamp, terminate);
247 if (has_emission && !blocked) {
250 kg,
L,
state, tp * num_samples_inv, &L_light, shadow, num_samples_inv, is_lamp);
ccl_device_inline bool bsdf_eval_is_zero(BsdfEval *eval)
ccl_device_inline void path_radiance_accum_light(KernelGlobals *kg, PathRadiance *L, ccl_addr_space PathState *state, float3 throughput, BsdfEval *bsdf_eval, float3 shadow, float shadow_fac, bool is_lamp)
ccl_device_inline void path_radiance_bsdf_bounce(KernelGlobals *kg, PathRadianceState *L_state, ccl_addr_space float3 *throughput, BsdfEval *bsdf_eval, float bsdf_pdf, int bounce, int bsdf_label)
#define ccl_optional_struct_init
#define ccl_device_noinline_cpu
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_noinline_cpu bool direct_emission(KernelGlobals *kg, ShaderData *sd, ShaderData *emission_sd, LightSample *ls, ccl_addr_space PathState *state, Ray *ray, BsdfEval *eval, bool *is_lamp, float rand_terminate)
ccl_device_inline uint cmj_hash(uint i, uint p)
ccl_device_noinline bool light_sample(KernelGlobals *kg, int lamp, float randu, float randv, float time, float3 P, int bounce, LightSample *ls)
ccl_device_inline int light_select_num_samples(KernelGlobals *kg, int index)
ccl_device_inline bool light_select_reached_max_bounces(KernelGlobals *kg, int index, int bounce)
ccl_device_inline void path_state_next(KernelGlobals *kg, ccl_addr_space PathState *state, int label)
ccl_device_inline float path_state_continuation_probability(KernelGlobals *kg, ccl_addr_space PathState *state, const float3 throughput)
ccl_device_inline void path_state_rng_2D(KernelGlobals *kg, const ccl_addr_space PathState *state, int dimension, float *fx, float *fy)
ccl_device_inline float path_branched_rng_1D(KernelGlobals *kg, uint rng_hash, const ccl_addr_space PathState *state, int branch, int num_branches, int dimension)
ccl_device_inline float path_state_rng_1D(KernelGlobals *kg, const ccl_addr_space PathState *state, int dimension)
ccl_device_inline void path_branched_rng_2D(KernelGlobals *kg, uint rng_hash, const ccl_addr_space PathState *state, int branch, int num_branches, int dimension, float *fx, float *fy)
ccl_device_inline float path_branched_rng_light_termination(KernelGlobals *kg, uint rng_hash, const ccl_addr_space PathState *state, int branch, int num_branches)
ccl_device_inline float path_state_rng_light_termination(KernelGlobals *kg, const ccl_addr_space PathState *state)
ccl_device_inline bool shadow_blocked(KernelGlobals *kg, ShaderData *sd, ShaderData *shadow_sd, ccl_addr_space PathState *state, Ray *ray, float3 *shadow)
Segment< FEdge *, Vec3r > segment