[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21138] branches/soc-2009-jaguarandi/ source/blender/render/intern/source/rayshade.c: *Fixed handling of HEMI and SUN lights shadows

André Pinto andresusanopinto at gmail.com
Wed Jun 24 21:29:50 CEST 2009


Revision: 21138
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21138
Author:   jaguarandi
Date:     2009-06-24 21:29:48 +0200 (Wed, 24 Jun 2009)

Log Message:
-----------
*Fixed handling of HEMI and SUN lights shadows

Modified Paths:
--------------
    branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c

Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c	2009-06-24 19:29:04 UTC (rev 21137)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c	2009-06-24 19:29:48 UTC (rev 21138)
@@ -1957,7 +1957,7 @@
 	}
 }
 
-static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *shadfac, Isect *isec)
+static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, int lampvec, float *shadfac, Isect *isec)
 {
 	QMCSampler *qsa=NULL;
 	int samples=0;
@@ -2018,6 +2018,8 @@
 			if (lar->type == LA_LOCAL) {
 				float ru[3], rv[3], v[3], s[3];
 				
+				assert(lampvec == 0);
+				
 				/* calc tangent plane vectors */
 				v[0] = co[0] - lampco[0];
 				v[1] = co[1] - lampco[1];
@@ -2036,6 +2038,7 @@
 				VECCOPY(samp3d, s);
 			}
 			else {
+				assert(lampvec);
 				/* sampling, returns quasi-random vector in [sizex,sizey]^2 plane */
 				QMC_sampleRect(samp3d, qsa, shi->thread, samples, lar->area_size, lar->area_sizey);
 								
@@ -2063,10 +2066,20 @@
 		}
 
 		VECCOPY(isec->start, co);
-		isec->vec[0] = end[0]-isec->start[0];
-		isec->vec[1] = end[1]-isec->start[1];
-		isec->vec[2] = end[2]-isec->start[2];
-		isec->labda = 1.0f; // * Normalize(isec->vec);
+		if(lampvec)
+		{
+			isec->vec[0] = end[0];
+			isec->vec[1] = end[1];
+			isec->vec[2] = end[2];
+			isec->labda = RE_RAYTRACE_MAXDIST;
+		}
+		else
+		{
+			isec->vec[0] = end[0]-isec->start[0];
+			isec->vec[1] = end[1]-isec->start[1];
+			isec->vec[2] = end[2]-isec->start[2];
+			isec->labda = 1.0f; // * Normalize(isec->vec);
+		}
 		
 		/* trace the ray */
 		if(isec->mode==RE_RAY_SHADOW_TRA) {
@@ -2119,7 +2132,7 @@
 		release_thread_qmcsampler(&R, shi->thread, qsa);
 }
 
-static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, float *lampco, float *shadfac, Isect *isec)
+static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, float *lampco, int lampvec, float *shadfac, Isect *isec)
 {
 	/* area soft shadow */
 	float *jitlamp;
@@ -2162,10 +2175,20 @@
 		
 		/* set start and vec */
 		VECCOPY(isec->start, shi->co);
-		isec->vec[0] = vec[0]+lampco[0]-shi->co[0];
-		isec->vec[1] = vec[1]+lampco[1]-shi->co[1];
-		isec->vec[2] = vec[2]+lampco[2]-shi->co[2];
-		isec->labda = 1.0f;
+		if(lampvec)
+		{
+			isec->vec[0] = vec[0]+lampco[0];
+			isec->vec[1] = vec[1]+lampco[1];
+			isec->vec[2] = vec[2]+lampco[2];
+			isec->labda = RE_RAYTRACE_MAXDIST;
+		}
+		else
+		{
+			isec->vec[0] = vec[0]+lampco[0]-shi->co[0];
+			isec->vec[1] = vec[1]+lampco[1]-shi->co[1];
+			isec->vec[2] = vec[2]+lampco[2]-shi->co[2];
+			isec->labda = 1.0f;
+		}
 		isec->skip = RE_SKIP_VLR_NEIGHBOUR;
 		
 		if(isec->mode==RE_RAY_SHADOW_TRA) {
@@ -2204,6 +2227,7 @@
 {
 	Isect isec;
 	float lampco[3];
+	int lampvec; /* indicates if lampco is a vector lamp */
 
 	/* setup isec */
 	if(shi->mat->mode & MA_SHADOW_TRA) isec.mode= RE_RAY_SHADOW_TRA;
@@ -2223,17 +2247,19 @@
 	}
 	
 	if(lar->type==LA_SUN || lar->type==LA_HEMI) {
-		lampco[0]= shi->co[0] - RE_RAYTRACE_MAXDIST*lar->vec[0];
-		lampco[1]= shi->co[1] - RE_RAYTRACE_MAXDIST*lar->vec[1];
-		lampco[2]= shi->co[2] - RE_RAYTRACE_MAXDIST*lar->vec[2];
+		lampco[0]= -lar->vec[0];
+		lampco[1]= -lar->vec[1];
+		lampco[2]= -lar->vec[2];
+		lampvec = 1;
 	}
 	else {
 		VECCOPY(lampco, lar->co);
+		lampvec = 0;
 	}
 	
 	if (ELEM(lar->ray_samp_method, LA_SAMP_HALTON, LA_SAMP_HAMMERSLEY)) {
 		
-		ray_shadow_qmc(shi, lar, lampco, shadfac, &isec);
+		ray_shadow_qmc(shi, lar, lampco, lampvec, shadfac, &isec);
 		
 	} else {
 		if(lar->ray_totsamp<2) {
@@ -2245,8 +2271,16 @@
 			
 			/* set up isec vec */
 			VECCOPY(isec.start, shi->co);
-			VECSUB(isec.vec, lampco, isec.start);
-			isec.labda = 1.0f;
+			if(lampvec)
+			{
+				VECCOPY(isec.vec, lampco);
+				isec.labda = RE_RAYTRACE_MAXDIST;
+			}
+			else
+			{
+				VECSUB(isec.vec, lampco, isec.start);
+				isec.labda = 1.0f;
+			}
 
 			if(isec.mode==RE_RAY_SHADOW_TRA) {
 				/* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
@@ -2260,7 +2294,7 @@
 				shadfac[3]= 0.0f;
 		}
 		else {
-			ray_shadow_jitter(shi, lar, lampco, shadfac, &isec);
+			ray_shadow_jitter(shi, lar, lampco, lampvec, shadfac, &isec);
 		}
 	}
 		





More information about the Bf-blender-cvs mailing list