Revision: 16413
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16413
Author:   unclezeiv
Date:     2008-09-07 21:55:43 +0200 (Sun, 07 Sep 2008)

Log Message:
-----------
A partial retreat from revision 16304: lights are now held again by lists, this 
requires less memory and it doesn't have to be contiguous.

Revision Links:
--------------
    
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16304

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-09-07 19:47:15 UTC (rev 16412)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 
2008-09-07 19:55:43 UTC (rev 16413)
@@ -101,7 +101,8 @@
 #define LC_OPT_ENV_NOSPEC  0x0040
 #define LC_OPT_IND_NOSPEC  0x0080
 
-#define LC_LAR_INDIR 0x01
+#define LC_LAR_INDIRECT  0x01
+#define LC_LAR_GENERATED 0x02
 
 /*
  * This is a table to select the "worst falloff" for a cluster, given the
@@ -176,12 +177,10 @@
 
 typedef struct LightcutsData {
        /* NOTE: conservative space estimation */
-       LampRen **pointlights;
-       LampRen *lampren_pool;
-
+       ListBase pointlights;
+       
        LightcutsTree trees[_TREES_SIZE];
 
-       int pool_counter;
        int light_counter;
        int vpl_counter;
 
@@ -431,16 +430,13 @@
        LightcutsCluster *clus;
        LightcutsTree *tree= &lcd->trees[cur_type];
        float *colw= lcd->colw;
-       int i;
 
        tree->array= MEM_callocN(sizeof(LightcutsCluster) * tree->counter * 2, 
array_names[cur_type]);
        tree->free= 0;
 
        clus= tree->array;
 
-       for(i= 0; i < lcd->light_counter; i++) {
-               lar = lcd->pointlights[i];
-               
+       for(lar= lcd->pointlights.first; lar; lar= lar->next) {
                if (lar->type!=cur_type)
                        continue;
 
@@ -759,6 +755,7 @@
 
 static void lamp_init(Render * re, LampRen * lar)
 {
+       lar->lightcuts_options= LC_LAR_GENERATED;
        /* float xs, ys, dist, distkw; */
        /* TODO: what is xs ys ?? where are they used? */
        
@@ -886,6 +883,7 @@
 static void lamp_delete(LampRen * lar)
 {
        MEM_freeN(lar->shadsamp);
+       MEM_freeN(lar);
 }
 
 static void create_lamp_oriented(Render * re, LampRen * lar, LampRen * orig)
@@ -961,7 +959,7 @@
                if (INPR(lcd->colw, col) < LC_LUMINOSITY_LIMIT)
                        continue;
                                
-               lar = &lcd->lampren_pool[lcd->pool_counter++];
+               lar= MEM_callocN(sizeof(LampRen), "lampren");
                lamp_init(re, lar);
                lar->type = LA_SUN;
                
@@ -997,11 +995,15 @@
                for (i= 0; i < lcd->do_indir; i++)
                        add_virtual_point_light(re, lcd, lar, col, 
lcd->indir_bounces, 1.0f / lcd->do_indir);
 
-               if (lcd->do_indir > 0 && (lcd->options & LC_OPT_ONLY_INDIR))
+               if (lcd->do_indir > 0 && (lcd->options & LC_OPT_ONLY_INDIR)) {
+                       lamp_delete(lar);
                        continue;
-
-               lcd->pointlights[lcd->light_counter++]= lar;
+               }
+               
+               BLI_addtail(&lcd->pointlights, lar);
+               
                lcd->trees[TREE_SUN].counter++;
+               lcd->light_counter++;
                lar->ray_samp_method = LA_SAMP_CONSTANT;
        }
 }
@@ -1401,13 +1403,13 @@
        }
 // #endif
        
-       lar= &lcd->lampren_pool[lcd->pool_counter++];
+       lar= MEM_callocN(sizeof(LampRen), "lampren");
        lamp_init(re, lar);
        lar->dist= lcd->indir_dist;
        lar->distkw= lar->dist * lar->dist;
        lar->lay= orig->lay;
        
-       lar->lightcuts_options= LC_LAR_INDIR;
+       lar->lightcuts_options|= LC_LAR_INDIRECT;
        
        if (orig->mode & LA_NO_SPEC || lcd->options & LC_OPT_IND_NOSPEC)
                lar->mode |= LA_NO_SPEC;
@@ -1442,8 +1444,10 @@
        if (lcd->options & LC_OPT_INDIR_MESH)
                VECCOPY(lcd->dbg_vis_vpl + 3 * lcd->vpl_counter, co);
 
-       lcd->pointlights[lcd->light_counter++]= lar;
+       BLI_addtail(&lcd->pointlights, lar);
+       
        lcd->trees[TREE_SPOT].counter++;
+       lcd->light_counter++;
        lcd->vpl_counter++;
        
        if (lev > 1)
@@ -1523,7 +1527,7 @@
                if (INPR(lcd->colw, col) < LC_LUMINOSITY_LIMIT)
                        continue;
                
-               lar= &lcd->lampren_pool[lcd->pool_counter++];
+               lar= MEM_callocN(sizeof(LampRen), "lampren");
 
                create_lamp_oriented(re, lar, orig);
                
@@ -1540,11 +1544,15 @@
                for (i= 0; i < lcd->do_indir; i++)
                        add_virtual_point_light(re, lcd, lar, col, 
lcd->indir_bounces, 1.0f / lcd->do_indir);
                
-               if (lcd->do_indir > 0 && (lcd->options & LC_OPT_ONLY_INDIR))
+               if (lcd->do_indir > 0 && (lcd->options & LC_OPT_ONLY_INDIR)) {
+                       lamp_delete(lar);
                        continue;
-
-               lcd->pointlights[lcd->light_counter++]= lar;
+               }
+               
+               BLI_addtail(&lcd->pointlights, lar);
+                               
                lcd->trees[TREE_SPOT].counter++;
+               lcd->light_counter++;
                lar->ray_samp_method = LA_SAMP_CONSTANT;
        }
 }
@@ -1554,7 +1562,7 @@
        LightcutsData *lcd;
        GroupObject *go;
        ListBase *lights = &re->lights;
-       LampRen *lar;
+       LampRen *lar, *own;
        char tree_time_str[12]; /* length 12 required by BLI_timestr */
        int i;
        
@@ -1635,12 +1643,6 @@
                        
                        n_generated+= n_vpl;
                }
-               
-               if (n_generated > 0) {
-                       /* here we create our (conservative) arrays for holding 
LampRens and pointers to them */
-                       lcd->lampren_pool= MEM_callocN(sizeof(LampRen) * 
n_generated, "lc_lampren_pool");
-               }
-               lcd->pointlights= MEM_callocN(sizeof(LampRen*) * (n_orig + 
n_generated), "lc_pointlights");
        }
        
        /* TODO: we could do some form of importance sampling here */
@@ -1699,15 +1701,18 @@
                        continue;
                }
                
-               /* this kind of lights are not part of our pool */
-               lcd->pointlights[lcd->light_counter++]= lar;
+               /* we add a copy of the lamp to our list; please note, we will 
let Blender deallocate its data */
+               own= MEM_callocN(sizeof(LampRen), "lampren");
+               memcpy(own, lar, sizeof(LampRen));
+               BLI_addtail(&lcd->pointlights, own);
+               lcd->light_counter++;
 
                /*
                 * each light will contribute only marginally to the shadowing
                 * that's why here I set a simpler sampling method
                 * TODO: QMC may be restored for stronger lights
                 */
-               lar->ray_samp_method = LA_SAMP_CONSTANT;
+               own->ray_samp_method = LA_SAMP_CONSTANT;
        }
 
        /* XXX: this should be equal to re->r.lightcuts_max_lights when light 
generation is in place */
@@ -2270,7 +2275,7 @@
                                else {
                                        used++;
                                        
-                                       if (rep->lar->lightcuts_options & 
LC_LAR_INDIR) {
+                                       if (rep->lar->lightcuts_options & 
LC_LAR_INDIRECT) {
                                                vpl_queue[vpl_to_cap]= cn_rep - 
cut_nodes;
                                                vpl_to_cap++;
                                        }
@@ -2310,7 +2315,7 @@
                                else {
                                        used++;
                                        
-                                       if (unrep->lar->lightcuts_options & 
LC_LAR_INDIR) {
+                                       if (unrep->lar->lightcuts_options & 
LC_LAR_INDIRECT) {
                                                vpl_queue[vpl_to_cap]= cn_unrep 
- cut_nodes;
                                                vpl_to_cap++;
                                        }
@@ -2437,16 +2442,19 @@
        LightcutsData *lcd = *p;
        if (lcd) {
                int i;
+               LampRen *lar, *next;
                
                lightcuts_print_stats(lcd);
                for (i= 0; i < _TREES_SIZE; i++)
                        if (lcd->trees[i].array)
                                MEM_freeN(lcd->trees[i].array);
-               for (i= 0; i < lcd->pool_counter; i++)
-                       lamp_delete(&lcd->lampren_pool[i]);
-               if (lcd->lampren_pool)
-                       MEM_freeN(lcd->lampren_pool);
-               MEM_freeN(lcd->pointlights);
+               for (lar= lcd->pointlights.first; lar; lar= next) {
+                       next= lar->next;
+                       if (lar->lightcuts_options & LC_LAR_GENERATED)
+                               lamp_delete(lar);
+                       else
+                               MEM_freeN(lar);
+               }
                MEM_freeN(lcd->cut_nodes);
                if (lcd->dbg_vis_vpl)
                        MEM_freeN(lcd->dbg_vis_vpl);


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

Reply via email to