[Bf-blender-cvs] [4948627b18] temp-cycles-denoising: Update the shadowcatcher patch and make it look like a merge so that Git is happy

Lukas Stockner noreply at git.blender.org
Fri Mar 24 20:18:24 CET 2017


Commit: 4948627b187b19f30bf19ca35c88b0966ae62273
Author: Lukas Stockner
Date:   Thu Mar 23 15:13:17 2017 +0100
Branches: temp-cycles-denoising
https://developer.blender.org/rB4948627b187b19f30bf19ca35c88b0966ae62273

Update the shadowcatcher patch and make it look like a merge so that Git is happy

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



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

diff --cc intern/cycles/blender/addon/properties.py
index 6c5bcf0930,df0592a871..cbf469b3a8
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@@ -1096,6 -1092,12 +1096,12 @@@ class CyclesObjectSettings(bpy.types.Pr
                  default=1.0,
                  )
  
+         cls.is_shadow_catcher = BoolProperty(
+                 name="Shadow Catcher",
 -                description="This object is only catching shadows",
++                description="Only render shadows on this object, for compositing renders into real footage",
+                 default=False,
+                 )
+ 
      @classmethod
      def unregister(cls):
          del bpy.types.Object.cycles
diff --cc intern/cycles/device/device.h
index ec15a254f8,ccee25ae34..468a5b1515
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@@ -121,6 -121,6 +121,9 @@@ public
  	/* Use Transparent shadows */
  	bool use_transparent;
  
++	/* Use various shadow tricks, such as shadow catcher. */
++	bool use_shadow_tricks;
++
  	DeviceRequestedFeatures()
  	{
  		/* TODO(sergey): Find more meaningful defaults. */
@@@ -137,6 -137,6 +140,7 @@@
  		use_integrator_branched = false;
  		use_patch_evaluation = false;
  		use_transparent = false;
++		use_shadow_tricks = false;
  	}
  
  	bool modified(const DeviceRequestedFeatures& requested_features)
@@@ -153,7 -153,7 +157,8 @@@
  		         use_volume == requested_features.use_volume &&
  		         use_integrator_branched == requested_features.use_integrator_branched &&
  		         use_patch_evaluation == requested_features.use_patch_evaluation &&
--		         use_transparent == requested_features.use_transparent);
++		         use_transparent == requested_features.use_transparent &&
++		         use_shadow_tricks == requested_features.use_shadow_tricks);
  	}
  
  	/* Convert the requested features structure to a build options,
@@@ -194,9 -194,9 +199,12 @@@
  		if(!use_patch_evaluation) {
  			build_options += " -D__NO_PATCH_EVAL__";
  		}
 -		if(!use_transparent) {
 +		if(!use_transparent && !use_volume) {
  			build_options += " -D__NO_TRANSPARENT__";
  		}
++		if(!use_shadow_tricks) {
++			build_options += " -D__NO_SHADOW_TRICKS__";
++		}
  		return build_options;
  	}
  };
diff --cc intern/cycles/kernel/kernel_accumulate.h
index 6c3ee6b809,83fab01dc0..f6f0d5b4dd
--- 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,
@@@ -301,15 -349,39 +350,38 @@@ ccl_device_inline void path_radiance_ac
  	{
  		L->emission += throughput*bsdf_eval->diffuse*shadow;
  	}
+ 
+ #ifdef __SHADOW_TRICKS__
+ 	float3 light = throughput * bsdf_eval->sum_no_mis;
+ 	L->path_total += light;
+ 	L->path_total_shaded += shadow * light;
+ #endif
  }
  
- ccl_device_inline void path_radiance_accum_background(PathRadiance *L, float3 throughput, float3 value, int bounce)
+ ccl_device_inline void path_radiance_accum_total_light(
+         PathRadiance *L,
+         float3 throughput,
+         const BsdfEval *bsdf_eval)
+ {
+ #ifdef __SHADOW_TRICKS__
+ 	L->path_total += throughput * bsdf_eval->sum_no_mis;
+ #else
+ 	(void) L;
+ 	(void) throughput;
+ 	(void) bsdf_eval;
+ #endif
+ }
+ 
+ ccl_device_inline void path_radiance_accum_background(PathRadiance *L,
 -                                                      const PathState *state,
++                                                      ccl_addr_space PathState *state,
+                                                       float3 throughput,
 -                                                      float3 value,
 -                                                      int bounce)
++                                                      float3 value)
  {
  #ifdef __PASSES__
  	if(L->use_light_pass) {
--		if(bounce == 0)
++		if(state->bounce == 0)
  			L->background += throughput*value;
--		else if(bounce == 1)
++		else if(state->bounce == 1)
  			L->direct_emission += throughput*value;
  		else
  			L->indirect += throughput*value;
diff --cc intern/cycles/kernel/kernel_emission.h
index cf14a159e4,8c7c651a05..9e7d51f23f
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@@ -156,8 -156,8 +156,13 @@@ ccl_device_noinline bool direct_emissio
  	if(bsdf_eval_is_zero(eval))
  		return false;
  
--	if(kernel_data.integrator.light_inv_rr_threshold > 0.0f) {
 -		float probability = max3(bsdf_eval_sum(eval)) * kernel_data.integrator.light_inv_rr_threshold;
++	if(kernel_data.integrator.light_inv_rr_threshold > 0.0f
++#ifdef __SHADOW_TRICKS__
++	   && (state->flag & PATH_RAY_SHADOW_CATCHER) == 0
++#endif
++	  )
++	{
 +		float probability = max3(fabs(bsdf_eval_sum(eval))) * kernel_data.integrator.light_inv_rr_threshold;
  		if(probability < 1.0f) {
  			if(rand_terminate >= probability) {
  				return false;
diff --cc intern/cycles/kernel/kernel_path.h
index ebf03ad977,cd76b87817..9ff38a99f1
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@@ -290,9 -292,10 +293,9 @@@ ccl_device void kernel_path_indirect(Ke
  			/* sample background shader */
  			float3 L_background = indirect_background(kg, emission_sd, state, ray);
  			path_radiance_accum_background(L,
+ 			                               state,
  			                               throughput,
--			                               L_background,
--			                               state->bounce);
++			                               L_background);
  #endif  /* __BACKGROUND__ */
  
  			break;
@@@ -374,7 -383,7 +383,7 @@@
  
  			/* do bssrdf scatter step if we picked a bssrdf closure */
  			if(sc) {
--				uint lcg_state = lcg_state_init(rng, state, 0x68bc21eb);
++				uint lcg_state = lcg_state_init(rng, state->rng_offset, state->sample, 0x68bc21eb);
  
  				float bssrdf_u, bssrdf_v;
  				path_state_rng_2D(kg,
@@@ -466,7 -646,7 +476,7 @@@ ccl_device_inline float4 kernel_path_in
  			}
  
  			extmax = kernel_data.curve.maximum_width;
--			lcg_state = lcg_state_init(rng, &state, 0x51633e2d);
++			lcg_state = lcg_state_init(rng, state.rng_offset, state.sample, 0x51633e2d);
  		}
  
  		if(state.bounce > kernel_data.integrator.ao_bounces) {
@@@ -611,7 -791,7 +621,7 @@@
  #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);
  #endif  /* __BACKGROUND__ */
  
  			break;
@@@ -625,6 -805,21 +635,21 @@@
  		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);
  
+ #ifdef __SHADOW_TRICKS__
+ 		if((sd.object_flag & SD_OBJECT_SHADOW_CATCHER)) {
 -			if (state.flag & PATH_RAY_CAMERA) {
++			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) ||
@@@ -742,7 -937,20 +767,20 @@@
  	}
  #endif  /* __SUBSURFACE__ */
  
- 	float3 L_sum = path_radiance_clamp_and_sum(kg, &L);
+ 	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;
++		L_sum = L.shadow_color * shadow;
+ 		if(kernel_data.background.transparent) {
+ 			L_transparent = shadow;
+ 		}
+ 	}
+ 	else
+ #endif  /* __SHADOW_TRICKS__ */
+ 	{
+ 		L_sum = path_radiance_clamp_and_sum(kg, &L);
+ 	}
  
  	kernel_write_light_passes(kg, buffer, &L, sample);
  
diff --cc intern/cycles/kernel/kernel_path_branched.h
index d58960cae4,c87daff017..e675e0db11
--- a/intern/cycles/kernel/kernel_path_branched.h
+++ b/intern/cycles/kernel/kernel_path_branched.h
@@@ -50,13 -50,17 +50,17 @@@ ccl_device_inline void kernel_branched_
  			light_ray.D = ao_D;
  			light_ray.t = kernel_data.background.ao_distance;
  #ifdef __OBJECT_MOTION__
 -			light_ray.time = ccl_fetch(sd, time);
 +			light_ray.time = sd->time;
  #endif  /* __OBJECT_MOTION__ */
 -			light_ray.dP = ccl_fetch(sd, dP);
 +			light_ray.dP = sd->dP;
  			light_ray.dD = differential3_zero();
  
- 			if(!shadow_blocked(kg, emission_sd, state, &light_ray, &ao_shadow))
+ 			if(!shadow_blocked(kg, emission_sd, state, &light_ray, &ao_shadow)) {
  				path_radiance_accum_ao(L, throughput*num_samples_inv, ao_alpha, ao_bsdf, ao_shadow, state->bounce);
+ 			}
+ 			else {
+ 				path_radiance_accum_total_ao(L, throughput*num_samples_inv, ao_bsdf);
+ 			}
  		}
  	}
  }
@@@ -147,7 -151,7 +151,7 @@@ ccl_device void kernel_branched_path_su
  			continue;
  
  		/* set up random number generator */
--		uint lcg_state = lcg_state_init(rng, state, 0x68bc21eb);
++		uint lcg_state = lcg_state_init(rng, state->rng_offset, state->sample, 0x68bc21eb);
  		int num_samples = kernel_data.integrator.subsurface_samples;
  		float num_samples_inv = 1.0f/num_samples;
  		RNG bssrdf_rng = cmj_hash(*rng, i);
@@@ -280,7 -289,7 +285,7 @@@ ccl_device float4 kernel_branched_path_
  			}
  
  			extmax = kernel_data.curve.maximum_width;
--			lcg_state = lcg_state_init(rng, &state, 0x51633e2d);
++			lcg_state = lcg_state_init(rng, state.rng_offset, state.sample, 0x51633e2d);
  		}
  
  		bool hit = scene_intersect(

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list