[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26607] branches/render25/source/blender/ render/intern/source/shadeoutput.c: Render Branch: different method to compute only shadow lamps, rather
Brecht Van Lommel
brecht at blender.org
Thu Feb 4 18:38:39 CET 2010
Revision: 26607
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26607
Author: blendix
Date: 2010-02-04 18:38:39 +0100 (Thu, 04 Feb 2010)
Log Message:
-----------
Render Branch: different method to compute only shadow lamps, rather
than subtracting colors it now subtracts in grayscale, helps avoid
ugly discolorations when used with colored lamps.
Modified Paths:
--------------
branches/render25/source/blender/render/intern/source/shadeoutput.c
Modified: branches/render25/source/blender/render/intern/source/shadeoutput.c
===================================================================
--- branches/render25/source/blender/render/intern/source/shadeoutput.c 2010-02-04 17:17:01 UTC (rev 26606)
+++ branches/render25/source/blender/render/intern/source/shadeoutput.c 2010-02-04 17:38:39 UTC (rev 26607)
@@ -362,7 +362,8 @@
GroupObject *go;
ListBase *lights;
LampRen *lar;
- int passflag= shi->shading.passflag;
+ float onlyshadow[3];
+ int doonlyshadow= 0, passflag= shi->shading.passflag;
/* direct specular & diffuse */
if(!(passflag & (SCE_PASS_COMBINED|SCE_PASS_DIFFUSE|SCE_PASS_SPEC|SCE_PASS_SHADOW)))
@@ -370,6 +371,8 @@
lights= lamps_get(re, shi);
+ zero_v3(onlyshadow);
+
/* accumulates in shr->diff and shr->spec, and unshadowed in shr->shad */
for(go=lights->first; go; go= go->next) {
float lv[3], lainf[3], lashdw[3];
@@ -393,9 +396,10 @@
mat_bsdf_f(diff, &shi->material, &shi->geometry, shi->shading.thread, lv, BSDF_DIFFUSE);
if(lar->mode & LA_ONLYSHADOW) {
- shr->diff[0] -= diff[0]*lainf[0]*(1.0f - lashdw[0]);
- shr->diff[1] -= diff[1]*lainf[1]*(1.0f - lashdw[1]);
- shr->diff[2] -= diff[2]*lainf[2]*(1.0f - lashdw[2]);
+ onlyshadow[0] += diff[0]*lainf[0]*(1.0f - lashdw[0]);
+ onlyshadow[1] += diff[1]*lainf[1]*(1.0f - lashdw[1]);
+ onlyshadow[2] += diff[2]*lainf[2]*(1.0f - lashdw[2]);
+ doonlyshadow= 1;
}
else {
shr->diff[0] += diff[0]*lainf[0]*lashdw[0];
@@ -409,9 +413,10 @@
mat_bsdf_f(spec, &shi->material, &shi->geometry, shi->shading.thread, lv, BSDF_SPECULAR);
if(lar->mode & LA_ONLYSHADOW) {
- shr->spec[0] -= spec[0]*lainf[0]*(1.0f - lashdw[0]);
- shr->spec[1] -= spec[1]*lainf[1]*(1.0f - lashdw[1]);
- shr->spec[2] -= spec[2]*lainf[2]*(1.0f - lashdw[2]);
+ onlyshadow[0] += spec[0]*lainf[0]*(1.0f - lashdw[0]);
+ onlyshadow[1] += spec[1]*lainf[1]*(1.0f - lashdw[1]);
+ onlyshadow[2] += spec[2]*lainf[2]*(1.0f - lashdw[2]);
+ doonlyshadow= 1;
}
else {
shr->spec[0] += spec[0]*lainf[0]*lashdw[0];
@@ -429,6 +434,19 @@
}
}
+ /* only shadow apply, do in grayscale to avoid getting ugly discolorations */
+ if(doonlyshadow) {
+ float intensity = rgb_to_grayscale(shr->diff) + rgb_to_grayscale(shr->spec);
+
+ if(intensity > 0.0f) {
+ float shadow = rgb_to_grayscale(onlyshadow);
+ float factor = maxf((intensity - shadow)/intensity, 0.0f);
+
+ mul_v3_fl(shr->diff, factor);
+ mul_v3_fl(shr->spec, factor);
+ }
+ }
+
/* prevent only shadow lamps from producing negative colors.*/
if(shr->spec[0] < 0) shr->spec[0] = 0;
if(shr->spec[1] < 0) shr->spec[1] = 0;
More information about the Bf-blender-cvs
mailing list