[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