Revision: 21498
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21498
Author:   jaguarandi
Date:     2009-07-10 19:41:49 +0200 (Fri, 10 Jul 2009)

Log Message:
-----------
SUN and HEMI lights back as trunk (i think)

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

Modified: 
branches/soc-2009-jaguarandi/source/blender/render/intern/include/render_types.h
===================================================================
--- 
branches/soc-2009-jaguarandi/source/blender/render/intern/include/render_types.h
    2009-07-10 17:26:19 UTC (rev 21497)
+++ 
branches/soc-2009-jaguarandi/source/blender/render/intern/include/render_types.h
    2009-07-10 17:41:49 UTC (rev 21498)
@@ -172,6 +172,7 @@
        /* octree tables and variables for raytrace */
        struct RayObject *raytree;
        struct RayFace *rayfaces;
+       float maxdist; /* needed for keeping an incorrect behaviour of SUN and 
HEMI lights (avoid breaking old scenes) */
 
        /* occlusion tree */
        void *occlusiontree;

Modified: 
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c 
2009-07-10 17:26:19 UTC (rev 21497)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c 
2009-07-10 17:41:49 UTC (rev 21498)
@@ -348,6 +348,8 @@
 
 void makeraytree(Render *re)
 {
+       float min[3], max[3], sub[3];
+       int i;
        const char *tree_type = "Tree(unknown)";
 
 #ifdef RE_RAYCOUNTER
@@ -372,6 +374,18 @@
                BENCH(makeraytree_single(re), tree_build);
        else
                BENCH(makeraytree_hier(re), tree_build);
+               
+               
+       //Calculate raytree max_size
+       //This is ONLY needed to kept a bogus behaviour of SUN and HEMI lights
+       RE_rayobject_merge_bb( re->raytree, min, max );
+       for(i=0; i<3; i++)
+       {
+               min[i] += 0.01f;
+               max[i] += 0.01f;
+               sub[i] = max[i]-min[i];
+       }
+       re->maxdist = sqrt( sub[0]*sub[0] + sub[1]*sub[1] + sub[2]*sub[2] );
 }
 
 
@@ -2029,7 +2043,7 @@
        }
 }
 
-static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, int 
lampvec, float *shadfac, Isect *isec)
+static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float 
*shadfac, Isect *isec)
 {
        QMCSampler *qsa=NULL;
        int samples=0;
@@ -2135,20 +2149,10 @@
                }
 
                VECCOPY(isec->start, co);
-               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);
-               }
+               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) {
@@ -2201,7 +2205,7 @@
                release_thread_qmcsampler(&R, shi->thread, qsa);
 }
 
-static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, float *lampco, 
int lampvec, float *shadfac, Isect *isec)
+static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, float *lampco, 
float *shadfac, Isect *isec)
 {
        /* area soft shadow */
        float *jitlamp;
@@ -2243,21 +2247,11 @@
                Mat3MulVecfl(lar->mat, vec);
                
                /* set start and vec */
-               VECCOPY(isec->start, shi->co);
-               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;
-               }
+               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;
                isec->skip = RE_SKIP_VLR_NEIGHBOUR;
                
                if(isec->mode==RE_RAY_SHADOW_TRA) {
@@ -2296,7 +2290,6 @@
 {
        Isect isec;
        float lampco[3];
-       int lampvec; /* indicates if lampco is a vector lamp */
 
        /* setup isec */
        RE_RC_INIT(isec, *shi);
@@ -2320,19 +2313,30 @@
        }
        
        if(lar->type==LA_SUN || lar->type==LA_HEMI) {
-               lampco[0]= -lar->vec[0];
-               lampco[1]= -lar->vec[1];
-               lampco[2]= -lar->vec[2];
-               lampvec = 1;
+               /* 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->co[0] - R.maxdist*lar->vec[0];
+               lampco[1]= shi->co[1] - R.maxdist*lar->vec[1];
+               lampco[2]= shi->co[2] - R.maxdist*lar->vec[2];
        }
        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, lampvec, shadfac, &isec);
+               ray_shadow_qmc(shi, lar, lampco, shadfac, &isec);
                
        } else {
                if(lar->ray_totsamp<2) {
@@ -2344,16 +2348,8 @@
                        
                        /* set up isec vec */
                        VECCOPY(isec.start, shi->co);
-                       if(lampvec)
-                       {
-                               VECCOPY(isec.vec, lampco);
-                               isec.labda = RE_RAYTRACE_MAXDIST;
-                       }
-                       else
-                       {
-                               VECSUB(isec.vec, lampco, isec.start);
-                               isec.labda = 1.0f;
-                       }
+                       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) */
@@ -2367,7 +2363,7 @@
                                shadfac[3]= 0.0f;
                }
                else {
-                       ray_shadow_jitter(shi, lar, lampco, lampvec, shadfac, 
&isec);
+                       ray_shadow_jitter(shi, lar, lampco, shadfac, &isec);
                }
        }
                


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to