[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