Revision: 58776
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58776
Author:   dingto
Date:     2013-07-31 20:30:37 +0000 (Wed, 31 Jul 2013)
Log Message:
-----------
Cycles / Ray Depth:
* Added a Ray Depth output to the Light Path node, which gives the user access 
to the current bounce.
This can be used to limit the maximum ray bounce on a per shader basis. Another 
use case is to restrict light influence with this, to have a lamp only 
contribute to the direct lighting. 

http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Nodes/More#Light_Path

This is part of my GSoC 2013 project. SVN merge of r58091 and r58772 from 
soc-2013-dingto. 

Revision Links:
--------------
    
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58091
    
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58772

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/kernel_displace.h
    trunk/blender/intern/cycles/kernel/kernel_emission.h
    trunk/blender/intern/cycles/kernel/kernel_path.h
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/kernel/osl/osl_services.cpp
    trunk/blender/intern/cycles/kernel/osl/osl_services.h
    trunk/blender/intern/cycles/kernel/shaders/node_light_path.osl
    trunk/blender/intern/cycles/kernel/svm/svm_light_path.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_light_path.c

Property Changed:
----------------
    trunk/blender/


Property changes on: trunk/blender
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/ge_dev:58091-58422
/branches/ge_harmony:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/soc-2011-tomato:42376,42378-42379,42383,42385,42395,42397-42400,42407,42411,42418,42443-42444,42446,42467,42472,42486,42650-42652,42654-42655,42709-42710,42733-42734,42801,43872,44130,44141,44147-44149,44151-44152,44229-44230,45623-45625,46037,48089,48092,48551-48552,48679,48790,48792-48793,49076,49087,49292,49294,49466,49894,50052,50126,52854-52856,54573
/branches/soc-2013-depsgraph_mt:57516
/tags/blender-2.67b-release/blender:57122
   + /branches/ge_dev:58091-58422
/branches/ge_harmony:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/soc-2011-tomato:42376,42378-42379,42383,42385,42395,42397-42400,42407,42411,42418,42443-42444,42446,42467,42472,42486,42650-42652,42654-42655,42709-42710,42733-42734,42801,43872,44130,44141,44147-44149,44151-44152,44229-44230,45623-45625,46037,48089,48092,48551-48552,48679,48790,48792-48793,49076,49087,49292,49294,49466,49894,50052,50126,52854-52856,54573
/branches/soc-2013-depsgraph_mt:57516
/branches/soc-2013-dingto:58091,58772
/tags/blender-2.67b-release/blender:57122

Modified: trunk/blender/intern/cycles/kernel/kernel_displace.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_displace.h        2013-07-31 
20:05:13 UTC (rev 58775)
+++ trunk/blender/intern/cycles/kernel/kernel_displace.h        2013-07-31 
20:30:37 UTC (rev 58776)
@@ -57,7 +57,7 @@
 #endif
 
                /* setup shader data */
-               shader_setup_from_background(kg, &sd, &ray);
+               shader_setup_from_background(kg, &sd, &ray, 0);
 
                /* evaluate */
                int flag = 0; /* we can't know which type of BSDF this is for */

Modified: trunk/blender/intern/cycles/kernel/kernel_emission.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_emission.h        2013-07-31 
20:05:13 UTC (rev 58775)
+++ trunk/blender/intern/cycles/kernel/kernel_emission.h        2013-07-31 
20:30:37 UTC (rev 58776)
@@ -21,7 +21,7 @@
 /* Direction Emission */
 
 __device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
-       LightSample *ls, float u, float v, float3 I, differential3 dI, float t, 
float time)
+       LightSample *ls, float u, float v, float3 I, differential3 dI, float t, 
float time, int bounce)
 {
        /* setup shading at emitter */
        ShaderData sd;
@@ -41,7 +41,7 @@
 #ifdef __CAMERA_MOTION__
                ray.time = time;
 #endif
-               shader_setup_from_background(kg, &sd, &ray);
+               shader_setup_from_background(kg, &sd, &ray, bounce+1);
                eval = shader_eval_background(kg, &sd, 0, 
SHADER_CONTEXT_EMISSION);
        }
        else
@@ -49,10 +49,10 @@
        {
 #ifdef __HAIR__
                if(ls->type == LIGHT_STRAND)
-                       shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, 
ls->shader, ls->object, ls->prim, u, v, t, time, ls->prim);
+                       shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, 
ls->shader, ls->object, ls->prim, u, v, t, time, bounce+1, ls->prim);
                else
 #endif
-                       shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, 
ls->shader, ls->object, ls->prim, u, v, t, time, ~0);
+                       shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, 
ls->shader, ls->object, ls->prim, u, v, t, time, bounce+1, ~0);
 
                ls->Ng = sd.Ng;
 
@@ -74,7 +74,7 @@
 
 __device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int 
lindex,
        float randt, float rando, float randu, float randv, Ray *ray, BsdfEval 
*eval,
-       bool *is_lamp)
+       bool *is_lamp, int bounce)
 {
        LightSample ls;
 
@@ -97,7 +97,7 @@
        differential3 dD = differential3_zero();
 
        /* evaluate closure */
-       float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, 
-ls.D, dD, ls.t, sd->time);
+       float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, 
-ls.D, dD, ls.t, sd->time, bounce);
 
        if(is_zero(light_eval))
                return false;
@@ -185,7 +185,7 @@
 
 /* Indirect Lamp Emission */
 
-__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int 
path_flag, float bsdf_pdf, float randt, float3 *emission)
+__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int 
path_flag, float bsdf_pdf, float randt, float3 *emission, int bounce)
 {
        LightSample ls;
        int lamp = lamp_light_eval_sample(kg, randt);
@@ -209,7 +209,7 @@
        /* todo: missing texture coordinates */
        float u = 0.0f;
        float v = 0.0f;
-       float3 L = direct_emissive_eval(kg, 0.0f, &ls, u, v, -ray->D, ray->dD, 
ls.t, ray->time);
+       float3 L = direct_emissive_eval(kg, 0.0f, &ls, u, v, -ray->D, ray->dD, 
ls.t, ray->time, bounce);
 
        if(!(path_flag & PATH_RAY_MIS_SKIP)) {
                /* multiple importance sampling, get regular light pdf,
@@ -224,7 +224,7 @@
 
 /* Indirect Background */
 
-__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int 
path_flag, float bsdf_pdf)
+__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int 
path_flag, float bsdf_pdf, int bounce)
 {
 #ifdef __BACKGROUND__
        int shader = kernel_data.background.shader;
@@ -240,7 +240,7 @@
 
        /* evaluate background closure */
        ShaderData sd;
-       shader_setup_from_background(kg, &sd, ray);
+       shader_setup_from_background(kg, &sd, ray, bounce+1);
 
        float3 L = shader_eval_background(kg, &sd, path_flag, 
SHADER_CONTEXT_EMISSION);
 

Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_path.h    2013-07-31 20:05:13 UTC 
(rev 58775)
+++ trunk/blender/intern/cycles/kernel/kernel_path.h    2013-07-31 20:30:37 UTC 
(rev 58776)
@@ -215,7 +215,7 @@
                                        return true;
 
                                ShaderData sd;
-                               shader_setup_from_ray(kg, &sd, &isect, ray);
+                               shader_setup_from_ray(kg, &sd, &isect, ray, 
state->bounce+1);
                                shader_eval_surface(kg, &sd, 0.0f, 
PATH_RAY_SHADOW, SHADER_CONTEXT_SHADOW);
 
                                throughput *= shader_bsdf_transparency(kg, &sd);
@@ -300,7 +300,7 @@
                        float light_t = path_rng_1D(kg, rng, sample, 
num_samples, rng_offset + PRNG_LIGHT);
                        float3 emission;
 
-                       if(indirect_lamp_emission(kg, &light_ray, state.flag, 
ray_pdf, light_t, &emission))
+                       if(indirect_lamp_emission(kg, &light_ray, state.flag, 
ray_pdf, light_t, &emission, state.bounce))
                                path_radiance_accum_emission(&L, throughput, 
emission, state.bounce);
                }
 #endif
@@ -318,7 +318,7 @@
 
 #ifdef __BACKGROUND__
                        /* sample background shader */
-                       float3 L_background = indirect_background(kg, &ray, 
state.flag, ray_pdf);
+                       float3 L_background = indirect_background(kg, &ray, 
state.flag, ray_pdf, state.bounce);
                        path_radiance_accum_background(&L, throughput, 
L_background, state.bounce);
 #endif
 
@@ -327,7 +327,7 @@
 
                /* setup shading */
                ShaderData sd;
-               shader_setup_from_ray(kg, &sd, &isect, &ray);
+               shader_setup_from_ray(kg, &sd, &isect, &ray, state.bounce);
                float rbsdf = path_rng_1D(kg, rng, sample, num_samples, 
rng_offset + PRNG_BSDF);
                shader_eval_surface(kg, &sd, rbsdf, state.flag, 
SHADER_CONTEXT_MAIN);
 
@@ -464,7 +464,7 @@
                                light_ray.time = sd.time;
 #endif
 
-                               if(direct_emission(kg, &sd, -1, light_t, 
light_o, light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+                               if(direct_emission(kg, &sd, -1, light_t, 
light_o, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
                                        /* trace shadow ray */
                                        float3 shadow;
 
@@ -575,7 +575,7 @@
                        float light_t = path_rng_1D(kg, rng, sample, 
num_total_samples, rng_offset + PRNG_LIGHT);
                        float3 emission;
 
-                       if(indirect_lamp_emission(kg, &light_ray, state.flag, 
ray_pdf, light_t, &emission))
+                       if(indirect_lamp_emission(kg, &light_ray, state.flag, 
ray_pdf, light_t, &emission, state.bounce))
                                path_radiance_accum_emission(L, throughput, 
emission, state.bounce);
                }
 #endif
@@ -583,7 +583,7 @@
                if(!hit) {
 #ifdef __BACKGROUND__
                        /* sample background shader */
-                       float3 L_background = indirect_background(kg, &ray, 
state.flag, ray_pdf);
+                       float3 L_background = indirect_background(kg, &ray, 
state.flag, ray_pdf, state.bounce);
                        path_radiance_accum_background(L, throughput, 
L_background, state.bounce);
 #endif
 
@@ -592,7 +592,7 @@
 
                /* setup shading */
                ShaderData sd;
-               shader_setup_from_ray(kg, &sd, &isect, &ray);
+               shader_setup_from_ray(kg, &sd, &isect, &ray, state.bounce);
                float rbsdf = path_rng_1D(kg, rng, sample, num_total_samples, 
rng_offset + PRNG_BSDF);
                shader_eval_surface(kg, &sd, rbsdf, state.flag, 
SHADER_CONTEXT_INDIRECT);
                shader_merge_closures(kg, &sd);
@@ -706,7 +706,7 @@
 #endif
 
                                /* sample random light */
-                               if(direct_emission(kg, &sd, -1, light_t, 
light_o, light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+                               if(direct_emission(kg, &sd, -1, light_t, 
light_o, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
                                        /* trace shadow ray */
                                        float3 shadow;
 
@@ -838,7 +838,7 @@
                                float light_u, light_v;
                                path_rng_2D(kg, &lamp_rng, sample*num_samples + 
j, aa_samples*num_samples, rng_offset + PRNG_LIGHT_U, &light_u, &light_v);
 
-                               if(direct_emission(kg, sd, i, 0.0f, 0.0f, 
light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+                               if(direct_emission(kg, sd, i, 0.0f, 0.0f, 
light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
                                        /* trace shadow ray */
                                        float3 shadow;
 
@@ -867,7 +867,7 @@
                                if(kernel_data.integrator.num_all_lights)
                                        light_t = 0.5f*light_t;
 
-                               if(direct_emission(kg, sd, -1, light_t, 0.0f, 
light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+                               if(direct_emission(kg, sd, -1, light_t, 0.0f, 
light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
                                        /* trace shadow ray */
                                        float3 shadow;
 
@@ -1013,7 +1013,7 @@
 
 #ifdef __BACKGROUND__
                        /* sample background shader */
-                       float3 L_background = indirect_background(kg, &ray, 
state.flag, ray_pdf);
+                       float3 L_background = indirect_background(kg, &ray, 
state.flag, ray_pdf, state.bounce);

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to