[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15192] branches/soc-2008-unclezeiv/source /blender/render/intern/source/lightcuts.c: Cut nodes are now sorted according to total subtree luminance, instead of the currently misnomed "intensity" value.

Davide Vercelli davide.vercelli at gmail.com
Wed Jun 11 00:29:53 CEST 2008


Revision: 15192
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15192
Author:   unclezeiv
Date:     2008-06-11 00:29:50 +0200 (Wed, 11 Jun 2008)

Log Message:
-----------
Cut nodes are now sorted according to total subtree luminance, instead of the currently misnomed "intensity" value.
Minor changes:
- renamed cut nodes variables
- added more debug code

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-06-10 21:15:48 UTC (rev 15191)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c	2008-06-10 22:29:50 UTC (rev 15192)
@@ -542,6 +542,8 @@
 
 #ifdef LIGHTCUTS_DEBUG
 	int dbg_convert[lcd->max_lights * 2]; /* from cluster id to index in cut_nodes */
+	
+	float dbg_totlum = 0.0f;
 #endif
 	
 	cut_nodes= lcd->cut_nodes + shi->thread * lcd->cut_nodes_size;
@@ -566,44 +568,47 @@
 			root->f_clus_noshad= i_noshad * clus->intensity;
 			VECADDFAC(totest_noshad, totest_noshad, clus->col, root->f_clus_noshad);
 		}
+#ifdef LIGHTCUTS_DEBUG
+		dbg_totlum= root->contr_factor * clus->luminance;
+#endif
 		
-		BLI_heap_insert(cut, -root->error_bound * clus->intensity, root);
+		BLI_heap_insert(cut, -root->error_bound * clus->luminance, root);
 	}
 	
 	/* at each iteration the heap grows by one, but we have a maximum size */
 	while (BLI_heap_size(cut) < (lcd->max_lights - used) && BLI_heap_size(cut) > 0) {
-		LightcutsCluster *c_hinode;
-		CutNode *hinode;
+		LightcutsCluster *hinode;
+		CutNode *cn_hinode;
 		
 		it++;
 		
-		hinode= BLI_heap_popmin(cut);
-		if (hinode < cut_nodes || hinode >= (cut_nodes + lcd->cut_nodes_size)) {
+		cn_hinode= BLI_heap_popmin(cut);
+		if (cn_hinode < cut_nodes || cn_hinode >= (cut_nodes + lcd->cut_nodes_size)) {
 			printf("tricky node! at %d, %d (it=%d)\n", shi->xs, shi->ys, it);
 			break;
 		}
-		if (hinode->error_bound < hinode->contr_factor) {
+		if (cn_hinode->error_bound < cn_hinode->contr_factor) {
 			printf("troublesome node! at %d, %d (it=%d): eb %7.5f < cf %7.5f\n",
-			shi->xs, shi->ys, it, hinode->error_bound, hinode->contr_factor);
+			shi->xs, shi->ys, it, cn_hinode->error_bound, cn_hinode->contr_factor);
 			break;
 		}
-		c_hinode= &lcd->array_local[hinode->id];
+		hinode= &lcd->array_local[cn_hinode->id];
 		
-		if (c_hinode->child1==0 && c_hinode->child2==0) {
+		if (hinode->child1==0 && hinode->child2==0) {
 			/* can't go further down */
 			used++;
 			continue;
 		}
 		
-		if (LC_LUMINOSITY(totest) * lcd->error_rate > hinode->error_bound * c_hinode->intensity) {
+		if (LC_LUMINOSITY(totest) * lcd->error_rate > cn_hinode->error_bound * hinode->luminance) {
 			break;
 		} else {
-			LightcutsCluster *rep= &lcd->array_local[c_hinode->child1];
-			LightcutsCluster *unrep= &lcd->array_local[c_hinode->child2];
-			CutNode *c_rep= &cut_nodes[free_node];
-			CutNode *c_unrep= &cut_nodes[free_node + 1];
+			LightcutsCluster *rep= &lcd->array_local[hinode->child1];
+			LightcutsCluster *unrep= &lcd->array_local[hinode->child2];
+			CutNode *cn_rep= &cut_nodes[free_node];
+			CutNode *cn_unrep= &cut_nodes[free_node + 1];
 			
-			if (c_hinode->lar != rep->lar)
+			if (hinode->lar != rep->lar)
 				SWAP(LightcutsCluster*, rep, unrep);
 
 #ifdef LIGHTCUTS_DEBUG
@@ -618,41 +623,50 @@
 			 * but please note that it's the same quantity
 			 * we are not calculating it in different ways
 			 */
-			VECADDFAC(totest, totest, rep->col, -hinode->f_clus);
+			VECADDFAC(totest, totest, hinode->col, -cn_hinode->f_clus);
+#ifdef LIGHTCUTS_DEBUG
+			dbg_totlum-= cn_hinode->contr_factor * hinode->luminance;
+#endif
 			
 			/* this is a strong assumption on linearity of intensity contribution... is it strong indeed?
 			 * and numerically questionable again */
 			/* TODO: there is room to reuse the same block here */
 			
 			/* for the reprsented light we can reuse most calculations */
-			c_rep->id= rep->id;
-			c_rep->error_bound= calc_geometric_eb(lcd, rep->id, shi->co);
-			c_rep->contr_factor= hinode->contr_factor;
-			c_rep->f_clus= hinode->contr_factor * rep->intensity;
-			VECADDFAC(totest, totest, rep->col, c_rep->f_clus);
+			cn_rep->id= rep->id;
+			cn_rep->error_bound= calc_geometric_eb(lcd, rep->id, shi->co);
+			cn_rep->contr_factor= cn_hinode->contr_factor;
+			cn_rep->f_clus= cn_hinode->contr_factor * rep->intensity;
+			VECADDFAC(totest, totest, rep->col, cn_rep->f_clus);
+#ifdef LIGHTCUTS_DEBUG
+			dbg_totlum+= rep->luminance * cn_rep->contr_factor;
+#endif
 						
-			BLI_heap_insert(cut, -c_rep->error_bound * rep->intensity, c_rep);
+			BLI_heap_insert(cut, -cn_rep->error_bound * rep->luminance, cn_rep);
 			
 			/* for the "unrepresented" light we have to compute stuff from scratch */
-			c_unrep->id= unrep->id;
-			c_unrep->error_bound= calc_geometric_eb(lcd, unrep->id, shi->co);
+			cn_unrep->id= unrep->id;
+			cn_unrep->error_bound= calc_geometric_eb(lcd, unrep->id, shi->co);
 			get_contrib(unrep->lar, shi, &i, &i_noshad);
-			c_unrep->contr_factor= i;
-			c_unrep->f_clus= i * unrep->intensity;
-			VECADDFAC(totest, totest, unrep->col, c_unrep->f_clus);
+			cn_unrep->contr_factor= i;
+			cn_unrep->f_clus= i * unrep->intensity;
+			VECADDFAC(totest, totest, unrep->col, cn_unrep->f_clus);
+#ifdef LIGHTCUTS_DEBUG
+			dbg_totlum+= unrep->luminance * cn_unrep->contr_factor;
+#endif
+
+			BLI_heap_insert(cut, -cn_unrep->error_bound * unrep->luminance, cn_unrep);
 			
-			BLI_heap_insert(cut, -c_unrep->error_bound * unrep->intensity, c_unrep);
-			
 			if(shi->passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW)) {
-				VECADDFAC(totest_noshad, totest_noshad, rep->col, -hinode->f_clus_noshad);
+				VECADDFAC(totest_noshad, totest_noshad, rep->col, -cn_hinode->f_clus_noshad);
 				
-				c_rep->contr_factor_noshad= hinode->contr_factor_noshad;
-				c_rep->f_clus_noshad= hinode->contr_factor_noshad * rep->intensity;
-				VECADDFAC(totest_noshad, totest_noshad, rep->col, c_rep->f_clus_noshad);
+				cn_rep->contr_factor_noshad= cn_hinode->contr_factor_noshad;
+				cn_rep->f_clus_noshad= cn_hinode->contr_factor_noshad * rep->intensity;
+				VECADDFAC(totest_noshad, totest_noshad, rep->col, cn_rep->f_clus_noshad);
 				
-				c_unrep->contr_factor_noshad= i_noshad;
-				c_unrep->f_clus_noshad= i_noshad * unrep->intensity;
-				VECADDFAC(totest_noshad, totest_noshad, unrep->col, c_unrep->f_clus_noshad);
+				cn_unrep->contr_factor_noshad= i_noshad;
+				cn_unrep->f_clus_noshad= i_noshad * unrep->intensity;
+				VECADDFAC(totest_noshad, totest_noshad, unrep->col, cn_unrep->f_clus_noshad);
 			}
 		}
 	}





More information about the Bf-blender-cvs mailing list