[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