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;


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to