From 4be8384e2798c2b3bc9fab4e04b7404bda152d5e Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sat, 13 Feb 2010 13:17:15 +0000 Subject: [PATCH] Fix #20391: onlyshadow material doesn't render transparent shadows. Fix #21033: AO + onlyshadow problem. Reverting to the old behavior which I don't really understand, but at least it's compatible. --- source/blender/render/intern/source/shadeoutput.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 2963e7ce99d..7ba6a889ffc 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -1527,7 +1527,7 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr) lamp_get_shadow(lar, shi, inpr, shadfac, shi->depth); ir+= 1.0f; - accum+= (1.0f-visifac) + (visifac)*shadfac[3]; + accum+= (1.0f-visifac) + (visifac)*rgb_to_grayscale(shadfac)*shadfac[3]; } } if(ir>0.0f) { @@ -1544,15 +1544,17 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr) if(R.wrld.mode & WO_AMB_OCC) { f= R.wrld.aoenergy*shi->amb; - if(R.wrld.aomix==WO_AOADD) - shr->alpha += f*(1.0f - rgb_to_grayscale(shi->ao)); + if(R.wrld.aomix==WO_AOADD) { + f= f*(1.0f - rgb_to_grayscale(shi->ao)); + shr->alpha= (shr->alpha + f)*f; + } else shr->alpha= (1.0f - f)*shr->alpha + f*(1.0f - (1.0f - shr->alpha)*rgb_to_grayscale(shi->ao)); } if(R.wrld.mode & WO_ENV_LIGHT) { - f= R.wrld.ao_env_energy*shi->amb; - shr->alpha += f*(1.0f - rgb_to_grayscale(shi->env)); + f= R.wrld.ao_env_energy*shi->amb*(1.0f - rgb_to_grayscale(shi->env)); + shr->alpha= (shr->alpha + f)*f; } } }