Revision: 15404
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15404
Author:   unclezeiv
Date:     2008-07-02 13:45:37 +0200 (Wed, 02 Jul 2008)

Log Message:
-----------
Moved area light conversion code in its own function. Fixed a bug that led to 
incorrect distribution of lights on the y direction.

Modified Paths:
--------------
    branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c

Modified: 
branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 
2008-07-02 02:05:33 UTC (rev 15403)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 
2008-07-02 11:45:37 UTC (rev 15404)
@@ -431,7 +431,6 @@
        MEM_freeN(pair_array);
 }
 
-
 static void create_lamp_oriented(Render * re, LampRen * lar, LampRen * orig)
 {
        /* float xs, ys, dist; */
@@ -566,6 +565,85 @@
        */
 }
 
+static void convert_area_light(Render * re, LightcutsData *lcd, LampRen *orig)
+{
+       GroupObject *gonew;
+       int x, y, smpx, smpy;
+       float area, gapx, gapy, factor, realw, realh;
+       float xdir[3];
+       float ydir[3];
+       float stepx, stepy;
+       LampRen *lar;
+       float density;
+       
+       density= sqrtf(re->r.lightcuts_area_density);
+
+       VECCOPY(xdir, orig->mat[0]);
+       VECCOPY(ydir, orig->mat[1]);
+
+       realw= sqrtf(VEC_LEN_SQ(orig->mat[0])) * orig->area_size;
+       realh= sqrtf(VEC_LEN_SQ(orig->mat[1])) * orig->area_sizey;
+
+       area= realw * realh;
+       smpx= MAX2((int)(density * realw), 1);
+       smpy= MAX2((int)(density * realh), 1);
+       gapx= 1.0 / (float)(smpx);
+       gapy= 1.0 / (float)(smpy);
+       factor= 0.5f * sqrtf(orig->dist) * area / (smpx * smpy);
+
+       /* XXX: TODO: temporary check just to avoid freezing on undue densities 
*/
+       if (lcd->light_counter + smpx * smpy > re->r.lightcuts_max_lights) {
+               printf("Err: required light density would violate light 
limit\n");
+               return;
+       }
+
+       for (x=0; x<smpx; x++) {
+               for (y=0; y<smpy; y++) {
+                       gonew= MEM_callocN(sizeof(GroupObject), "groupobject");
+                       BLI_addtail(&lcd->pointlights, gonew);
+                       /* gonew->recalc= go->recalc; // XXX: what is this? */
+                       /*
+                        * XXX: probably wrong, more a test to see if it is 
used somewhere
+                        * or deallocated
+                        * The point here is that we create new lights with no 
corresponding
+                        * objects... do we need objects there?
+                        */
+                       gonew->ob= 0; /* XXX: or go->ob */
+
+                       lar = (LampRen *)MEM_callocN(sizeof(LampRen), 
"lampren");
+
+                       create_lamp_oriented(re, lar, orig);
+                       lar->r= orig->r * factor;
+                       lar->g= orig->g * factor;
+                       lar->b= orig->b * factor;
+                       lar->energy= orig->energy * factor;
+
+                       /* place a light in its own square with random 
jittering */
+                       stepx= orig->area_size * (gapx * (x + BLI_frand()) - 
0.5f);
+                       stepy= orig->area_sizey * (gapy * (y + BLI_frand()) - 
0.5f);
+                       lar->co[0]= orig->co[0] + xdir[0] * stepx + ydir[0] * 
stepy;
+                       lar->co[1]= orig->co[1] + xdir[1] * stepx + ydir[1] * 
stepy;
+                       lar->co[2]= orig->co[2] + xdir[2] * stepx + ydir[2] * 
stepy;
+
+#ifdef LIGHTCUTS_DEBUG
+                       printf("coordinates: %4f %4f %4f\n", lar->co[0], 
lar->co[1], lar->co[2]);
+#endif
+
+                       BLI_addtail(&re->lampren, lar);
+                       /* check deallocation */
+                       gonew->lampren= lar;
+
+                       /* TODO: handle other attenuation models */
+                       if (lar->dist < lcd->max_spot_dist)
+                               lcd->max_spot_dist= lar->dist;
+
+                       lcd->trees[TREE_SPOT].counter++;
+                       lcd->light_counter++;
+                       lar->ray_samp_method = LA_SAMP_CONSTANT;
+               }
+       }
+}
+
 void lightcuts_init(Render * re)
 {
        LightcutsData *lcd;
@@ -575,7 +653,6 @@
        LampRen *lar;
        char tree_time_str[12]; /* length 12 required by BLI_timestr */
        int i;
-       float density;
        
        re->i.infostr= "Initializing Lightcuts";
        re->stats_draw(&re->i);
@@ -585,84 +662,13 @@
        lcd->max_local_dist= MAXFLOAT;
        lcd->max_spot_dist= MAXFLOAT;
        lcd->light_counter= 0;
-       density= sqrtf(re->r.lightcuts_area_density);
 
        for(go=lights->first; go; go= go->next) {
                lar= go->lampren;
                if(lar==NULL) continue;
                
                if (lar->type == LA_AREA) {
-                       int x, y, smpx, smpy;
-                       float area, gapx, gapy, factor, realw, realh;
-                       float xdir[3];
-                       float ydir[3];
-                       float stepx, stepy;
-                       LampRen *orig= lar;
-                       
-                       VECCOPY(xdir, orig->mat[0]);
-                       VECCOPY(ydir, orig->mat[1]);
-                       
-                       realw= sqrtf(VEC_LEN_SQ(orig->mat[0])) * 
orig->area_size;
-                       realh= sqrtf(VEC_LEN_SQ(orig->mat[1])) * 
orig->area_sizey;
-                        
-                       area= realw * realh;
-                       smpx= MAX2((int)(density * realw), 1);
-                       smpy= MAX2((int)(density * realh), 1);
-                       gapx= 1.0 / (float)(smpx);
-                       gapy= 1.0 / (float)(smpx);
-                       factor= 2.0f * area / (smpx * smpy);
-                       
-                       /* XXX: TODO: temporary check just to avoid freezing on 
undue densities */
-                       if (lcd->light_counter + smpx * smpy > 
re->r.lightcuts_max_lights) {
-                               printf("Err: required light density would 
violate light limit\n");
-                               continue;
-                       }
-                       
-                       for (x=0; x<smpx; x++) {
-                               for (y=0; y<smpy; y++) {
-                                       gonew= MEM_callocN(sizeof(GroupObject), 
"groupobject");
-                                       BLI_addtail(pointlights, gonew);
-                                       gonew->recalc= go->recalc; /* XXX: what 
is this? */
-                                       /*
-                                        * XXX: probably wrong, more a test to 
see if it is used somewhere
-                                        * or deallocated
-                                        * The point here is that we create new 
lights with no corresponding
-                                        * objects... do we need objects there?
-                                        */
-                                       gonew->ob= 0; /* XXX: or go->ob */
-
-                                       lar = (LampRen 
*)MEM_callocN(sizeof(LampRen), "lampren");
-                                       
-                                       create_lamp_oriented(re, lar, orig);
-                                       lar->r= orig->r * factor;
-                                       lar->g= orig->g * factor;
-                                       lar->b= orig->b * factor;
-                                       lar->energy= orig->energy * factor;
-
-                                       /* place a light in its own square with 
random jittering */
-                                       stepx= orig->area_size * (gapx * (x + 
BLI_frand()) - 0.5f);
-                                       stepy= orig->area_sizey * (gapy * (y + 
BLI_frand()) - 0.5f);
-                                       lar->co[0]= orig->co[0] + xdir[0] * 
stepx + ydir[0] * stepy;
-                                       lar->co[1]= orig->co[1] + xdir[1] * 
stepx + ydir[1] * stepy;
-                                       lar->co[2]= orig->co[2] + xdir[2] * 
stepx + ydir[2] * stepy;
-
-#ifdef LIGHTCUTS_DEBUG
-                                       printf("coordinates: %4f %4f %4f\n", 
lar->co[0], lar->co[1], lar->co[2]);
-#endif
-
-                                       BLI_addtail(&re->lampren, lar);
-                                       /* check deallocation */
-                                       gonew->lampren= lar;
-                                       
-                                       /* TODO: handle other attenuation 
models */
-                                       if (lar->dist < lcd->max_spot_dist)
-                                               lcd->max_spot_dist= lar->dist;
-                                       
-                                       lcd->trees[TREE_SPOT].counter++;
-                                       lcd->light_counter++;
-                                       lar->ray_samp_method = LA_SAMP_CONSTANT;
-                               }
-                       }
+                       convert_area_light(re, lcd, lar);
                        continue;
                }
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to