[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