[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26215] branches/render25/source/blender/ render/intern/source: Render branch: use lamp_sample in ray_shadow_qmc.
Brecht Van Lommel
brecht at blender.org
Sat Jan 23 18:50:39 CET 2010
Revision: 26215
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26215
Author: blendix
Date: 2010-01-23 18:50:38 +0100 (Sat, 23 Jan 2010)
Log Message:
-----------
Render branch: use lamp_sample in ray_shadow_qmc.
Modified Paths:
--------------
branches/render25/source/blender/render/intern/source/lamp.c
branches/render25/source/blender/render/intern/source/rayshade.c
Modified: branches/render25/source/blender/render/intern/source/lamp.c
===================================================================
--- branches/render25/source/blender/render/intern/source/lamp.c 2010-01-23 17:33:40 UTC (rev 26214)
+++ branches/render25/source/blender/render/intern/source/lamp.c 2010-01-23 17:50:38 UTC (rev 26215)
@@ -566,35 +566,44 @@
switch(lar->type) {
case LA_LOCAL: {
- /* sphere shadow source */
- float ru[3], rv[3], v[3], s[3], disc[3];
-
- /* calc tangent plane vectors */
- v[0] = co[0] - lar->co[0];
- v[1] = co[1] - lar->co[1];
- v[2] = co[2] - lar->co[2];
- normalize_v3(v);
- ortho_basis_v3v3_v3(ru, rv, v);
-
- /* sampling, returns quasi-random vector in area_size disc */
- sample_project_disc(disc, lar->area_size, r);
+ if(r) {
+ /* sphere shadow source */
+ float ru[3], rv[3], v[3], s[3], disc[3];
+
+ /* calc tangent plane vectors */
+ v[0] = co[0] - lar->co[0];
+ v[1] = co[1] - lar->co[1];
+ v[2] = co[2] - lar->co[2];
+ normalize_v3(v);
+ ortho_basis_v3v3_v3(ru, rv, v);
+
+ /* sampling, returns quasi-random vector in area_size disc */
+ sample_project_disc(disc, lar->area_size, r);
- /* distribute disc samples across the tangent plane */
- s[0] = disc[0]*ru[0] + disc[1]*rv[0];
- s[1] = disc[0]*ru[1] + disc[1]*rv[1];
- s[2] = disc[0]*ru[2] + disc[1]*rv[2];
-
- copy_v3_v3(lco, s);
+ /* distribute disc samples across the tangent plane */
+ s[0] = disc[0]*ru[0] + disc[1]*rv[0];
+ s[1] = disc[0]*ru[1] + disc[1]*rv[1];
+ s[2] = disc[0]*ru[2] + disc[1]*rv[2];
+
+ add_v3_v3v3(lco, lar->co, s);
+ }
+ else
+ copy_v3_v3(lco, lar->co);
break;
}
case LA_AREA: {
- float rect[3];
+ if(r) {
+ float rect[3], s[3];
- /* sampling, returns quasi-random vector in [sizex,sizey]^2 plane */
- sample_project_rect(rect, lar->area_size, lar->area_sizey, r);
+ /* sampling, returns quasi-random vector in [sizex,sizey]^2 plane */
+ sample_project_rect(rect, lar->area_size, lar->area_sizey, r);
- /* align samples to lamp vector */
- mul_v3_m3v3(lco, lar->mat, rect);
+ /* align samples to lamp vector */
+ mul_v3_m3v3(s, lar->mat, rect);
+ add_v3_v3v3(lco, lar->co, s);
+ }
+ else
+ copy_v3_v3(lco, lar->co);
break;
}
default: {
Modified: branches/render25/source/blender/render/intern/source/rayshade.c
===================================================================
--- branches/render25/source/blender/render/intern/source/rayshade.c 2010-01-23 17:33:40 UTC (rev 26214)
+++ branches/render25/source/blender/render/intern/source/rayshade.c 2010-01-23 17:50:38 UTC (rev 26215)
@@ -1510,13 +1510,11 @@
}
}
-static void ray_shadow_qmc(Render *re, ShadeInput *shi, LampRen *lar, float *lampco, float *shadfac, Isect *isec)
+static void ray_shadow_qmc(Render *re, ShadeInput *shi, LampRen *lar, float *shadfac, Isect *isec)
{
QMCSampler *qsa=NULL;
int samples=0;
- float samp3d[3];
-
- float fac=0.0f, vec[3], end[3];
+ float fac=0.0f, end[3];
float colsq[4];
float adapt_thresh = lar->adapt_thresh;
int min_adapt_samples=4, max_samples = lar->ray_totsamp;
@@ -1564,60 +1562,15 @@
isec->hint = &bb_hint;
isec->skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK;
- copy_v3_v3(vec, lampco);
while (samples < max_samples) {
-
- isec->orig.ob = shi->primitive.obi;
- isec->orig.face = shi->primitive.vlr;
-
- /* manually jitter the start shading co-ord per sample
- * based on the pre-generated OSA texture sampling offsets,
+ /* sample starting position. jitter the start shading coord per
+ * sample based on the pre-generated OSA texture sampling offsets,
* for anti-aliasing sharp shadow edges. */
co = jitco[samples % totjitco];
- if (do_soft) {
- float r[2];
-
- sampler_get_float_2d(r, qsa, samples);
-
- /* sphere shadow source */
- if (lar->type == LA_LOCAL) {
- float ru[3], rv[3], v[3], s[3];
-
- /* calc tangent plane vectors */
- v[0] = co[0] - lampco[0];
- v[1] = co[1] - lampco[1];
- v[2] = co[2] - lampco[2];
- normalize_v3(v);
- ortho_basis_v3v3_v3( ru, rv,v);
-
- /* sampling, returns quasi-random vector in area_size disc */
- sample_project_disc(samp3d, lar->area_size, r);
-
- /* distribute disc samples across the tangent plane */
- s[0] = samp3d[0]*ru[0] + samp3d[1]*rv[0];
- s[1] = samp3d[0]*ru[1] + samp3d[1]*rv[1];
- s[2] = samp3d[0]*ru[2] + samp3d[1]*rv[2];
-
- copy_v3_v3(samp3d, s);
- }
- else {
- /* sampling, returns quasi-random vector in [sizex,sizey]^2 plane */
- sample_project_rect(samp3d, lar->area_size, lar->area_sizey, r);
-
- /* align samples to lamp vector */
- mul_m3_v3(lar->mat, samp3d);
- }
- end[0] = vec[0]+samp3d[0];
- end[1] = vec[1]+samp3d[1];
- end[2] = vec[2]+samp3d[2];
- } else {
- copy_v3_v3(end, vec);
- }
-
+ /* strands need some bias to avoid self intersection */
if(shi->primitive.strand) {
- /* bias away somewhat to avoid self intersection */
float jitbias= 0.5f*(len_v3(shi->geometry.dxco) + len_v3(shi->geometry.dyco));
float v[3];
@@ -1629,10 +1582,21 @@
co[2] -= jitbias*v[2];
}
+ /* sample lamp position */
+ if (do_soft) {
+ float r[2];
+
+ sampler_get_float_2d(r, qsa, samples);
+ lamp_sample(end, lar, co, r);
+ }
+ else
+ lamp_sample(end, lar, co, NULL);
+
+ /* setup intersection */
+ isec->orig.ob = shi->primitive.obi;
+ isec->orig.face = shi->primitive.vlr;
copy_v3_v3(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];
+ sub_v3_v3v3(isec->vec, end, isec->start);
isec->labda = 1.0f; // * normalize_v3(isec->vec);
/* trace the ray */
@@ -1690,7 +1654,6 @@
void ray_shadow(Render *re, ShadeInput *shi, LampRen *lar, float *shadfac)
{
Isect isec;
- float lampco[3];
/* setup isec */
RE_RC_INIT(isec, *shi);
@@ -1711,30 +1674,8 @@
isec.last_hit = NULL;
}
- if(lar->type==LA_SUN || lar->type==LA_HEMI) {
- /* jitter and QMC sampling add a displace vector to the lamp position
- * that's incorrect because a SUN lamp does not has an exact position
- * and the displace should be done at the ray vector instead of the
- * lamp position.
- * This is easily verified by noticing that shadows of SUN lights change
- * with the scene BB.
- *
- * This was detected during SoC 2009 - Raytrace Optimization, but to keep
- * consistency with older render code it wasn't removed.
- *
- * If the render code goes through some recode/serious bug-fix then this
- * is something to consider!
- */
- lampco[0]= shi->geometry.co[0] - re->db.maxdist*lar->vec[0];
- lampco[1]= shi->geometry.co[1] - re->db.maxdist*lar->vec[1];
- lampco[2]= shi->geometry.co[2] - re->db.maxdist*lar->vec[2];
- }
- else {
- copy_v3_v3(lampco, lar->co);
- }
+ ray_shadow_qmc(re, shi, lar, shadfac, &isec);
- ray_shadow_qmc(re, shi, lar, lampco, shadfac, &isec);
-
/* for first hit optim, set last interesected shadow face */
if(shi->shading.depth==0) {
lar->last_hit[shi->shading.thread] = isec.last_hit;
More information about the Bf-blender-cvs
mailing list