Commit: d6aaf8606d18b2b707e96346fbf11f26ee3e681b
Author: Lukas Stockner
Date:   Sun Feb 12 03:59:55 2017 +0100
Branches: temp-cycles-denoising
https://developer.blender.org/rBd6aaf8606d18b2b707e96346fbf11f26ee3e681b

Merge branch 'cycles_shadow_catcher' into temp-cycles-denoising

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



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

diff --cc intern/cycles/kernel/bvh/bvh.h
index f8f56fe750,38f01e5b60..7204b9b2e2
--- a/intern/cycles/kernel/bvh/bvh.h
+++ b/intern/cycles/kernel/bvh/bvh.h
@@@ -237,12 -229,13 +237,17 @@@ ccl_device_intersect void scene_interse
  #endif
  
  #ifdef __SHADOW_RECORD_ALL__
- ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg, const 
Ray *ray, Intersection *isect, uint max_hits, uint *num_hits)
+ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
+                                                      const Ray *ray,
+                                                      Intersection *isect,
+                                                      int skip_object,
+                                                      uint max_hits,
+                                                      uint *num_hits)
  {
 +#ifdef WITH_CYCLES_DEBUG_FPE
 +      scoped_fpe fpe(FPE_DISABLED);
 +#endif
 +
  #  ifdef __OBJECT_MOTION__
        if(kernel_data.bvh.have_motion) {
  #    ifdef __HAIR__
diff --cc intern/cycles/kernel/kernel_accumulate.h
index 256662d79f,83fab01dc0..0f19b7f8ab
--- a/intern/cycles/kernel/kernel_accumulate.h
+++ b/intern/cycles/kernel/kernel_accumulate.h
@@@ -198,6 -216,11 +216,12 @@@ ccl_device_inline void path_radiance_in
        {
                L->emission = make_float3(0.0f, 0.0f, 0.0f);
        }
+ 
+ #ifdef __SHADOW_TRICKS__
+       L->path_total = make_float3(0.0f, 0.0f, 0.0f);
+       L->path_total_shaded = make_float3(0.0f, 0.0f, 0.0f);
++      L->shadow_color = make_float3(0.0f, 0.0f, 0.0f);
+ #endif
  }
  
  ccl_device_inline void path_radiance_bsdf_bounce(PathRadiance *L, 
ccl_addr_space float3 *throughput,
diff --cc intern/cycles/kernel/kernel_passes.h
index 4c4a324bf3,7aec47e495..7afc124544
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@@ -351,49 -199,5 +351,63 @@@ ccl_device_inline void kernel_write_lig
  #endif
  }
  
 +ccl_device_inline void kernel_write_result(KernelGlobals *kg, ccl_global 
float *buffer,
-       int sample, PathRadiance *L, float alpha)
++      int sample, PathRadiance *L, float alpha, bool is_shadow_catcher)
 +{
 +      int split_passes = (kernel_data.film.denoising_flags & 
DENOISING_USE_SPLIT_PASSES);
 +
 +      if(L) {
-               float3 L_sum = path_radiance_clamp_and_sum(kg, L);
++              float3 L_sum;
++#ifdef __SHADOW_TRICKS__
++              if(is_shadow_catcher) {
++                      float shadow = path_radiance_sum_shadow(L);
++                      L_sum = L->shadow_color * shadow;
++                      if(kernel_data.background.transparent) {
++                              alpha = 1.0f - shadow;
++                      }
++              }
++              else
++#endif  /* __SHADOW_TRICKS__ */
++              {
++                      L_sum = path_radiance_clamp_and_sum(kg, L);
++              }
++
 +              kernel_write_pass_float4(buffer, sample, make_float4(L_sum.x, 
L_sum.y, L_sum.z, alpha));
 +
 +              kernel_write_light_passes(kg, buffer, L, sample);
 +
 +              if(kernel_data.film.pass_denoising_data) {
 +                      if(kernel_data.film.pass_denoising_clean) {
 +                              float3 noisy, clean;
 +                              path_radiance_split_denoising(kg, L, &noisy, 
&clean);
 +                              kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising_data + 20, sample, noisy);
 +                              if(split_passes && !(sample & 1)) {
 +                                      kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising_data + 26, sample, noisy);
 +                              }
 +                              kernel_write_pass_float3_nopad(buffer + 
kernel_data.film.pass_denoising_clean, sample, clean);
 +                      }
 +                      else {
 +                              kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising_data + 20, sample, L_sum);
 +                              if(split_passes && !(sample & 1)) {
 +                                      kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising_data + 26, sample, L_sum);
 +                              }
 +                      }
 +              }
 +      }
 +      else {
 +              kernel_write_pass_float4(buffer, sample, make_float4(0.0f, 
0.0f, 0.0f, 0.0f));
 +
 +              if(kernel_data.film.pass_denoising_data) {
 +                      kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising_data + 20, sample, make_float3(0.0f, 0.0f, 
0.0f));
 +                      if(split_passes && !(sample & 1)) {
 +                              kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising_data + 26, sample, make_float3(0.0f, 0.0f, 
0.0f));
 +                      }
 +              }
 +              if(kernel_data.film.pass_denoising_clean) {
 +                      kernel_write_pass_float3_nopad(buffer + 
kernel_data.film.pass_denoising_clean, sample, make_float3(0.0f, 0.0f, 0.0f));
 +              }
 +      }
 +}
 +
  CCL_NAMESPACE_END
  
diff --cc intern/cycles/kernel/kernel_path.h
index 8f2c8cfb5e,cd76b87817..eddd0f5017
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@@ -584,10 -595,10 +595,11 @@@ ccl_device_inline float kernel_path_int
                                                 RNG *rng,
                                                 int sample,
                                                 Ray ray,
 -                                               ccl_global float *buffer)
 +                                               ccl_global float *buffer,
-                                                PathRadiance *L)
++                                               PathRadiance *L,
++                                               bool *is_shadow_catcher)
  {
        /* initialize */
 -      PathRadiance L;
        float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
        float L_transparent = 0.0f;
  
@@@ -776,10 -791,7 +788,10 @@@
  #ifdef __BACKGROUND__
                        /* sample background shader */
                        float3 L_background = indirect_background(kg, 
&emission_sd, &state, &ray);
-                       path_radiance_accum_background(L, throughput, 
L_background, state.bounce);
 -                      path_radiance_accum_background(&L, &state, throughput, 
L_background, state.bounce);
++                      path_radiance_accum_background(L, &state, throughput, 
L_background, state.bounce);
 +                      kernel_write_denoising_passes(kg, buffer, &state, NULL, 
sample, L_background);
 +#else
 +                      kernel_write_denoising_passes(kg, buffer, &state, NULL, 
sample, make_float3(0.0f, 0.0f, 0.0f));
  #endif  /* __BACKGROUND__ */
  
                        break;
@@@ -793,8 -805,21 +805,23 @@@
                float rbsdf = path_state_rng_1D_for_decision(kg, rng, &state, 
PRNG_BSDF);
                shader_eval_surface(kg, &sd, rng, &state, rbsdf, state.flag, 
SHADER_CONTEXT_MAIN);
  
 +              bool write_denoising_shadow = kernel_write_denoising_passes(kg, 
buffer, &state, &sd, sample, make_float3(0.0f, 0.0f, 0.0f));
 +
+ #ifdef __SHADOW_TRICKS__
+               if((sd.object_flag & SD_OBJECT_SHADOW_CATCHER)) {
+                       if (state.flag & PATH_RAY_CAMERA) {
+                               state.flag |= (PATH_RAY_SHADOW_CATCHER | 
PATH_RAY_SHADOW_CATCHER_ONLY);
+                               state.catcher_object = sd.object;
+                               if(!kernel_data.background.transparent) {
 -                                      shadow_color = indirect_background(kg, 
&emission_sd, &state, &ray);
++                                      L->shadow_color = 
indirect_background(kg, &emission_sd, &state, &ray);
+                               }
+                       }
+               }
+               else {
+                       state.flag &= ~PATH_RAY_SHADOW_CATCHER_ONLY;
+               }
+ #endif  /* __SHADOW_TRICKS__ */
+ 
                /* holdout */
  #ifdef __HOLDOUT__
                if(((sd.flag & SD_HOLDOUT) ||
@@@ -885,10 -910,10 +912,10 @@@
  #endif  /* __SUBSURFACE__ */
  
                /* direct lighting */
--              kernel_path_surface_connect_light(kg, rng, &sd, &emission_sd, 
throughput, &state, &L);
++              kernel_path_surface_connect_light(kg, rng, &sd, &emission_sd, 
throughput, &state, L);
  
                /* compute direct lighting and next bounce */
 -              if(!kernel_path_surface_bounce(kg, rng, &sd, &throughput, 
&state, &L, &ray))
 +              if(!kernel_path_surface_bounce(kg, rng, &sd, &throughput, 
&state, L, &ray))
                        break;
        }
  
@@@ -912,6 -937,23 +939,10 @@@
        }
  #endif  /* __SUBSURFACE__ */
  
 -      float3 L_sum;
+ #ifdef __SHADOW_TRICKS__
 -      if(state.flag & PATH_RAY_SHADOW_CATCHER) {
 -              float shadow = path_radiance_sum_shadow(&L);
 -              L_sum = shadow_color * shadow;
 -              if(kernel_data.background.transparent) {
 -                      L_transparent = shadow;
 -              }
 -      }
 -      else
++      *is_shadow_catcher = (state.flag & PATH_RAY_SHADOW_CATCHER);
+ #endif  /* __SHADOW_TRICKS__ */
 -      {
 -              L_sum = path_radiance_clamp_and_sum(kg, &L);
 -      }
 -
 -      kernel_write_light_passes(kg, buffer, &L, sample);
+ 
  #ifdef __KERNEL_DEBUG__
        kernel_write_debug_passes(kg, buffer, &state, &debug_data, sample);
  #endif  /* __KERNEL_DEBUG__ */
@@@ -937,15 -979,15 +968,16 @@@ ccl_device void kernel_path_trace(Kerne
        kernel_path_trace_setup(kg, rng_state, sample, x, y, &rng, &ray);
  
        /* integrate */
 -      float4 L;
 -
 -      if(ray.t != 0.0f)
 -              L = kernel_path_integrate(kg, &rng, sample, ray, buffer);
 -      else
 -              L = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 +      PathRadiance L;
++      bool is_shadow_catcher;
  
 -      /* accumulate result in output buffer */
 -      kernel_write_pass_float4(buffer, sample, L);
 +      if(ray.t != 0.0f) {
-               float alpha = kernel_path_integrate(kg, &rng, sample, ray, 
buffer, &L);
-               kernel_write_result(kg, buffer, sample, &L, alpha);
++              float alpha = kernel_path_integrate(kg, &rng, sample, ray, 
buffer, &L, &is_shadow_catcher);
++              kernel_write_result(kg, buffer, sample, &L, alpha, 
is_shadow_catcher);
 +      }
 +      else {
-               kernel_write_result(kg, buffer, sample, NULL, 0.0f);
++              kernel_write_result(kg, buffer, sample, NULL, 0.0f, false);
 +      }
  
        path_rng_end(kg, rng_state, rng);
  }
diff --cc intern/cycles/kernel/kernel_path_branched.h
index d8ef12546c,c87daff017..e6e1f998e0
--- a/intern/cycles/kernel/kernel_path_branched.h
+++ b/intern/cycles/kernel/kernel_path_branched.h
@@@ -237,9 -242,10 +242,9 @@@ ccl_device void kernel_branched_path_su
  }
  #endif  /* __SUBSURFACE__ */
  
- ccl_device float kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, 
int sample, Ray ray, ccl_global float *buffer, PathRadiance *L)
 -ccl_device float4 kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, 
int sample, Ray ray, ccl_global float *buffer)
++ccl_device float kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, 
int sample, Ray ray, ccl_global float *buffer, PathRadiance *L, bool 
*is_shadow_catcher)
  {
        /* initialize */
 -      PathRadiance L;
        float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
        float L_transparent = 0.0f;
  
@@@ -460,10 -470,7 +465,10 @@@
  #ifdef __BACKGROUND__
                        /* sample background shader */
                        float3 L_background = indirect_background(kg, 
&emission_sd, &state, &ray);
-                       path_radiance_accum_background(L, throughput, 
L_background, state.bounce);
 -                      path_radiance_accum_background(&L, &state, throughput, 
L_background, state.bounce);
++                      path_radiance_accum_background(L, &state, throughput, 
L_b

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to