[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16413] branches/soc-2008-unclezeiv/source /blender/render/intern/source/lightcuts.c: 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.
Davide Vercelli
davide.vercelli at gmail.com
Sun Sep 7 21:55:43 CEST 2008
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);
More information about the Bf-blender-cvs
mailing list