[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22806] trunk/blender/source/blender/ render/intern/source/rayshade.c: [#18837] if a sunlamp is set to a too high energy, speculars turn black

Campbell Barton ideasman42 at gmail.com
Wed Aug 26 18:05:02 CEST 2009


Revision: 22806
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22806
Author:   campbellbarton
Date:     2009-08-26 18:05:01 +0200 (Wed, 26 Aug 2009)

Log Message:
-----------
[#18837] if a sunlamp is set to a too high energy, speculars turn black

shr->spec values could be greater then 1.0, causing negative color when using (1.0-shr->spec[i]) as a blending factor.

When shr->spec[i] is 1.0 the mircol is ignored, so only mix the mircol when needed (like clamping the spec).

Modified Paths:
--------------
    trunk/blender/source/blender/render/intern/source/rayshade.c

Modified: trunk/blender/source/blender/render/intern/source/rayshade.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rayshade.c	2009-08-26 15:13:58 UTC (rev 22805)
+++ trunk/blender/source/blender/render/intern/source/rayshade.c	2009-08-26 16:05:01 UTC (rev 22806)
@@ -1239,15 +1239,18 @@
 			}
 			
 			if(shi->combinedflag & SCE_PASS_REFLECT) {
+				/* values in shr->spec can be greater then 1.0.
+				 * in the case when it is 1.0 diff */
 				
-				f= fr*(1.0f-shr->spec[0]);	f1= 1.0f-i;
-				diff[0]= f*mircol[0] + f1*diff[0];
+				f1= 1.0f-i;
 				
-				f= fg*(1.0f-shr->spec[1]);	f1= 1.0f-i;
-				diff[1]= f*mircol[1] + f1*diff[1];
+				diff[0] *= f1;
+				diff[1] *= f1;
+				diff[2] *= f1;
 				
-				f= fb*(1.0f-shr->spec[2]);	f1= 1.0f-i;
-				diff[2]= f*mircol[2] + f1*diff[2];
+				if(shr->spec[0]<1.0f)	diff[0] += mircol[0] * (fr*(1.0f-shr->spec[0]));
+				if(shr->spec[1]<1.0f)	diff[1] += mircol[1] * (fg*(1.0f-shr->spec[1]));
+				if(shr->spec[2]<1.0f)	diff[2] += mircol[2] * (fb*(1.0f-shr->spec[2]));
 			}
 		}
 	}





More information about the Bf-blender-cvs mailing list