Commit: 5ab565283d594e51ef2589326bc68957c323061d
Author: Brecht Van Lommel
Date:   Thu Apr 3 22:43:56 2014 +0200
https://developer.blender.org/rB5ab565283d594e51ef2589326bc68957c323061d

Cycles code refactor: minor changes to light emission code.

===================================================================

M       intern/cycles/kernel/kernel_emission.h
M       intern/cycles/kernel/kernel_path.h

===================================================================

diff --git a/intern/cycles/kernel/kernel_emission.h 
b/intern/cycles/kernel/kernel_emission.h
index deffa7f..b382e2c 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -63,32 +63,18 @@ ccl_device_noinline float3 
direct_emissive_eval(KernelGlobals *kg,
        return eval;
 }
 
-ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, 
int lindex,
-       float randt, float randu, float randv, Ray *ray, BsdfEval *eval,
-       bool *is_lamp, int bounce, int transparent_bounce)
+ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd,
+       LightSample *ls, Ray *ray, BsdfEval *eval, bool *is_lamp,
+       int bounce, int transparent_bounce)
 {
-       LightSample ls;
-
-#ifdef __BRANCHED_PATH__
-       if(lindex != LAMP_NONE) {
-               /* sample position on a specified light */
-               light_select(kg, lindex, randu, randv, sd->P, &ls);
-       }
-       else
-#endif
-       {
-               /* sample a light and position on int */
-               light_sample(kg, randt, randu, randv, sd->time, sd->P, &ls);
-       }
-
-       if(ls.pdf == 0.0f)
+       if(ls->pdf == 0.0f)
                return false;
 
        /* todo: implement */
        differential3 dD = differential3_zero();
 
        /* evaluate closure */
-       float3 light_eval = direct_emissive_eval(kg, &ls, -ls.D, dD, ls.t, 
sd->time, bounce, transparent_bounce);
+       float3 light_eval = direct_emissive_eval(kg, ls, -ls->D, dD, ls->t, 
sd->time, bounce, transparent_bounce);
 
        if(is_zero(light_eval))
                return false;
@@ -98,29 +84,29 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, 
ShaderData *sd, int
 
 #ifdef __VOLUME__
        if(sd->prim != PRIM_NONE)
-               shader_bsdf_eval(kg, sd, ls.D, eval, &bsdf_pdf);
+               shader_bsdf_eval(kg, sd, ls->D, eval, &bsdf_pdf);
        else
-               shader_volume_phase_eval(kg, sd, ls.D, eval, &bsdf_pdf);
+               shader_volume_phase_eval(kg, sd, ls->D, eval, &bsdf_pdf);
 #else
-       shader_bsdf_eval(kg, sd, ls.D, eval, &bsdf_pdf);
+       shader_bsdf_eval(kg, sd, ls->D, eval, &bsdf_pdf);
 #endif
 
-       if(ls.shader & SHADER_USE_MIS) {
+       if(ls->shader & SHADER_USE_MIS) {
                /* multiple importance sampling */
-               float mis_weight = power_heuristic(ls.pdf, bsdf_pdf);
+               float mis_weight = power_heuristic(ls->pdf, bsdf_pdf);
                light_eval *= mis_weight;
        }
        
-       bsdf_eval_mul(eval, light_eval/ls.pdf);
+       bsdf_eval_mul(eval, light_eval/ls->pdf);
 
 #ifdef __PASSES__
        /* use visibility flag to skip lights */
-       if(ls.shader & SHADER_EXCLUDE_ANY) {
-               if(ls.shader & SHADER_EXCLUDE_DIFFUSE)
+       if(ls->shader & SHADER_EXCLUDE_ANY) {
+               if(ls->shader & SHADER_EXCLUDE_DIFFUSE)
                        eval->diffuse = make_float3(0.0f, 0.0f, 0.0f);
-               if(ls.shader & SHADER_EXCLUDE_GLOSSY)
+               if(ls->shader & SHADER_EXCLUDE_GLOSSY)
                        eval->glossy = make_float3(0.0f, 0.0f, 0.0f);
-               if(ls.shader & SHADER_EXCLUDE_TRANSMIT)
+               if(ls->shader & SHADER_EXCLUDE_TRANSMIT)
                        eval->transmission = make_float3(0.0f, 0.0f, 0.0f);
        }
 #endif
@@ -128,19 +114,19 @@ ccl_device_noinline bool direct_emission(KernelGlobals 
*kg, ShaderData *sd, int
        if(bsdf_eval_is_zero(eval))
                return false;
 
-       if(ls.shader & SHADER_CAST_SHADOW) {
+       if(ls->shader & SHADER_CAST_SHADOW) {
                /* setup ray */
-               bool transmit = (dot(sd->Ng, ls.D) < 0.0f);
+               bool transmit = (dot(sd->Ng, ls->D) < 0.0f);
                ray->P = ray_offset(sd->P, (transmit)? -sd->Ng: sd->Ng);
 
-               if(ls.t == FLT_MAX) {
+               if(ls->t == FLT_MAX) {
                        /* distant light */
-                       ray->D = ls.D;
-                       ray->t = ls.t;
+                       ray->D = ls->D;
+                       ray->t = ls->t;
                }
                else {
                        /* other lights, avoid self-intersection */
-                       ray->D = ray_offset(ls.P, ls.Ng) - ray->P;
+                       ray->D = ray_offset(ls->P, ls->Ng) - ray->P;
                        ray->D = normalize_len(ray->D, &ray->t);
                }
 
@@ -153,7 +139,7 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, 
ShaderData *sd, int
        }
 
        /* return if it's a lamp for shadow pass */
-       *is_lamp = (ls.prim == PRIM_NONE && ls.type != LIGHT_BACKGROUND);
+       *is_lamp = (ls->prim == PRIM_NONE && ls->type != LIGHT_BACKGROUND);
 
        return true;
 }
diff --git a/intern/cycles/kernel/kernel_path.h 
b/intern/cycles/kernel/kernel_path.h
index b57e274..70366ea 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -52,29 +52,30 @@ ccl_device_inline bool 
kernel_path_integrate_scatter_lighting(KernelGlobals *kg,
        float num_samples_adjust)
 {
 #ifdef __EMISSION__
-       if(kernel_data.integrator.use_direct_light) {
+       if(kernel_data.integrator.use_direct_light && (sd->flag & 
SD_BSDF_HAS_EVAL)) {
                /* sample illumination from lights to find path contribution */
-               if(sd->flag & SD_BSDF_HAS_EVAL) {
-                       float light_t = path_state_rng_1D(kg, rng, state, 
PRNG_LIGHT);
-                       float light_u, light_v;
-                       path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, 
&light_u, &light_v);
+               float light_t = path_state_rng_1D(kg, rng, state, PRNG_LIGHT);
+               float light_u, light_v;
+               path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, &light_u, 
&light_v);
 
-                       Ray light_ray;
-                       BsdfEval L_light;
-                       bool is_lamp;
+               Ray light_ray;
+               BsdfEval L_light;
+               bool is_lamp;
 
 #ifdef __OBJECT_MOTION__
-                       light_ray.time = sd->time;
+               light_ray.time = sd->time;
 #endif
 
-                       if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, 
light_v, &light_ray, &L_light, &is_lamp, state->bounce, 
state->transparent_bounce)) {
-                               /* trace shadow ray */
-                               float3 shadow;
+               LightSample ls;
+               light_sample(kg, light_t, light_u, light_v, sd->time, sd->P, 
&ls);
 
-                               if(!shadow_blocked(kg, state, &light_ray, 
&shadow)) {
-                                       /* accumulate */
-                                       path_radiance_accum_light(L, 
*throughput * num_samples_adjust, &L_light, shadow, 1.0f, state->bounce, 
is_lamp);
-                               }
+               if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, 
state->bounce, state->transparent_bounce)) {
+                       /* trace shadow ray */
+                       float3 shadow;
+
+                       if(!shadow_blocked(kg, state, &light_ray, &shadow)) {
+                               /* accumulate */
+                               path_radiance_accum_light(L, *throughput * 
num_samples_adjust, &L_light, shadow, 1.0f, state->bounce, is_lamp);
                        }
                }
        }
@@ -152,7 +153,10 @@ ccl_device void 
kernel_branched_path_integrate_direct_lighting(KernelGlobals *kg
                                        float light_u, light_v;
                                        path_branched_rng_2D(kg, &lamp_rng, 
state, j, num_samples, PRNG_LIGHT_U, &light_u, &light_v);
 
-                                       if(direct_emission(kg, sd, i, 0.0f, 
light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, 
state->transparent_bounce)) {
+                                       LightSample ls;
+                                       light_select(kg, i, light_u, light_v, 
sd->P, &ls);
+
+                                       if(direct_emission(kg, sd, &ls, 
&light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
                                                /* trace shadow ray */
                                                float3 shadow;
 
@@ -181,7 +185,10 @@ ccl_device void 
kernel_branched_path_integrate_direct_lighting(KernelGlobals *kg
                                        
if(kernel_data.integrator.num_all_lights)
                                                light_t = 0.5f*light_t;
 
-                                       if(direct_emission(kg, sd, LAMP_NONE, 
light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, 
state->transparent_bounce)) {
+                                       LightSample ls;
+                                       light_sample(kg, light_t, light_u, 
light_v, sd->time, sd->P, &ls);
+
+                                       if(direct_emission(kg, sd, &ls, 
&light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
                                                /* trace shadow ray */
                                                float3 shadow;
 
@@ -198,8 +205,11 @@ ccl_device void 
kernel_branched_path_integrate_direct_lighting(KernelGlobals *kg
                        float light_u, light_v;
                        path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, 
&light_u, &light_v);
 
+                       LightSample ls;
+                       light_sample(kg, light_t, light_u, light_v, sd->time, 
sd->P, &ls);
+
                        /* sample random light */
-                       if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, 
light_v, &light_ray, &L_light, &is_lamp, state->bounce, 
state->transparent_bounce)) {
+                       if(direct_emission(kg, sd, &ls, &light_ray, &L_light, 
&is_lamp, state->bounce, state->transparent_bounce)) {
                                /* trace shadow ray */
                                float3 shadow;
 
@@ -477,7 +487,10 @@ ccl_device_inline bool 
kernel_path_integrate_lighting(KernelGlobals *kg, RNG *rn
                        light_ray.time = sd->time;
 #endif
 
-                       if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, 
light_v, &light_ray, &L_light, &is_lamp, state->bounce, 
state->transparent_bounce)) {
+                       LightSample ls;
+                       light_sample(kg, light_t, light_u, light_v, sd->time, 
sd->P, &ls);
+
+                       if(direct_emission(kg, sd, &ls, &light_ray, &L_light, 
&is_lamp, state->bounce, state->transparent_bounce)) {
                                /* trace shadow ray */
                                float3 shadow;
 
@@ -882,7 +895,10 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, 
RNG *rng, int sample,
                                light_ray.time = sd.time;
 #endif
 
-                               if(direct_emission(kg, &sd, LAMP_NONE, light_t, 
light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce, 
state.transparent_bounce)) {
+                               LightSample ls;
+                               light_sample(kg, light_t, light_u, light_v, 
sd.time, sd.P, &ls);
+
+                               if(direct_emission(kg, &sd, &ls, &light_ray, 
&L_light, &is_lamp, state.bounce, state.transparent_bounce)) {
                                        /* trace shadow ray */
                                        float3 shadow;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to