Revision: 16305
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16305
Author:   unclezeiv
Date:     2008-08-30 01:57:04 +0200 (Sat, 30 Aug 2008)

Log Message:
-----------
Fixed several memory-related bugs introduced by previous commit.

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-08-29 20:09:25 UTC (rev 16304)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 
2008-08-29 23:57:04 UTC (rev 16305)
@@ -985,10 +985,8 @@
                        add_virtual_point_light(re, lcd, lar, col, lev);
                }
 
-               if (lcd->do_indir > 0 && (lcd->options & LC_OPT_ONLY_INDIR)) {
-                       lamp_delete(lar);
+               if (lcd->do_indir > 0 && (lcd->options & LC_OPT_ONLY_INDIR))
                        continue;
-               }
 
                lcd->pointlights[lcd->light_counter++]= lar;
                lcd->trees[TREE_SUN].counter++;
@@ -1532,10 +1530,8 @@
                        add_virtual_point_light(re, lcd, lar, col, lev);
                }
                
-               if (lcd->do_indir > 0 && (lcd->options & LC_OPT_ONLY_INDIR)) {
-                       lamp_delete(lar);
+               if (lcd->do_indir > 0 && (lcd->options & LC_OPT_ONLY_INDIR))
                        continue;
-               }
 
                lcd->pointlights[lcd->light_counter++]= lar;
                lcd->trees[TREE_SPOT].counter++;
@@ -1601,8 +1597,9 @@
        
        {
                int n_orig= 0;
+               int n_area= 0;
                int n_vpl= 0;
-               int n_generated= re->r.lightcuts_area_lights + 
re->r.lightcuts_env_map; 
+               int n_generated= 0; 
                
                for(go=lights->first; go; go= go->next) {
                        lar= go->lampren;
@@ -1610,8 +1607,17 @@
                        
                        if (ELEM3(lar->type, LA_LOCAL, LA_SUN, LA_SPOT))
                                n_orig++;
+               
+                       if (lar->type == LA_AREA)
+                               n_area++;
                }
                
+               if (n_area)
+                       n_generated+= re->r.lightcuts_area_lights;
+               
+               if (lcd->options & LC_OPT_ENV_LIGHT)
+                       n_generated+= re->r.lightcuts_env_map;
+               
                if (lcd->do_indir > 0) {
                        n_vpl= (n_orig + n_generated) * lcd->do_indir;
                        
@@ -1625,9 +1631,11 @@
                        n_generated+= n_vpl;
                }
                
-               /* here we create our (conservative) arrays for holding 
LampRens and pointers to them */
-               lcd->pointlights= MEM_callocN(sizeof(LampRen*) * n_generated, 
"lc_pointlights");
-               lcd->lampren_pool= MEM_callocN(sizeof(LampRen) * n_generated, 
"lc_lampren_pool");
+               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 */
@@ -2432,7 +2440,8 @@
                                MEM_freeN(lcd->trees[i].array);
                for (i= 0; i < lcd->pool_counter; i++)
                        lamp_delete(&lcd->lampren_pool[i]);
-               MEM_freeN(lcd->lampren_pool);
+               if (lcd->lampren_pool)
+                       MEM_freeN(lcd->lampren_pool);
                MEM_freeN(lcd->pointlights);
                MEM_freeN(lcd->cut_nodes);
                if (lcd->dbg_vis_vpl)


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

Reply via email to