[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16071] branches/soc-2008-unclezeiv/source /blender: UI change: before this the user had to (awkwardly) specify an area light sampling density and the code would check if the resulting number of samples would violate the "max light" limit.

Davide Vercelli davide.vercelli at gmail.com
Tue Aug 12 22:28:43 CEST 2008


Revision: 16071
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16071
Author:   unclezeiv
Date:     2008-08-12 22:28:43 +0200 (Tue, 12 Aug 2008)

Log Message:
-----------
UI change: before this the user had to (awkwardly) specify an area light sampling density and the code would check if the resulting number of samples would violate the "max light" limit. Now the user directly asks for a specific number of samples to be used for all available area lights; the samples will be distributed proportionally to the respective light areas (distance and intensity are not currently taken into account).
Also reorganized UI and DNA data a bit; please note that not all settings from old test scenes are preserved.

Modified Paths:
--------------
    branches/soc-2008-unclezeiv/source/blender/blenloader/intern/readfile.c
    branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h
    branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c
    branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c

Modified: branches/soc-2008-unclezeiv/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/blenloader/intern/readfile.c	2008-08-12 19:56:03 UTC (rev 16070)
+++ branches/soc-2008-unclezeiv/source/blender/blenloader/intern/readfile.c	2008-08-12 20:28:43 UTC (rev 16071)
@@ -7763,12 +7763,12 @@
 		while(sce) {
 			r= &sce->r;
 			if(r) {
-				if(r->lightcuts_max_lights<=0)
-					r->lightcuts_max_lights= 10000;
 				if(r->lightcuts_max_error<=0.0)
 					r->lightcuts_max_error= 0.02;
 				if(r->lightcuts_max_cut<=0)
 					r->lightcuts_max_cut= 1000;
+				if(r->lightcuts_indir_fac<=0.0f)
+					r->lightcuts_indir_fac= 100.0f;
 			}
 			
 			sce= sce->id.next;

Modified: branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h	2008-08-12 19:56:03 UTC (rev 16070)
+++ branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h	2008-08-12 20:28:43 UTC (rev 16071)
@@ -314,12 +314,11 @@
 	
 	/* lightcuts */
 	float lightcuts_max_error;
-	int lightcuts_max_lights;
+	int lightcuts_area_lights;
 	int lightcuts_max_cut;
-	int lightcuts_area_density;
-	int lightcuts_env_map;
+	short lightcuts_env_map;
+	short lightcuts_indirect;
 	float lightcuts_indir_fac;
-	int lightcuts_indirect;
 	short lightcuts_random_dirs;
 	short lightcuts_color_weight;
 } RenderData;

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-12 19:56:03 UTC (rev 16070)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c	2008-08-12 20:28:43 UTC (rev 16071)
@@ -157,6 +157,8 @@
 	int max_cut;
 	
 	float colw[3];
+	
+	float area_density;
 
 	CutNode *cut_nodes;
 	int cut_nodes_size;
@@ -1102,34 +1104,35 @@
 	lar->ray_samp_method = LA_SAMP_CONSTANT;
 }
 
+static float get_area_light_area(LampRen *lar)
+{
+	float realw, realh;
+	
+	realw= sqrtf(VEC_LEN_SQ(lar->mat[0])) * lar->area_size;
+	realh= sqrtf(VEC_LEN_SQ(lar->mat[1])) * lar->area_sizey;
+	
+	return realw * realh;
+}
+
 static void convert_area_light(Render * re, LightcutsData *lcd, LampRen *orig)
 {
 	GroupObject *gonew;
 	LampRen *lar;
-	float factor, realw, realh, density;
+	float factor, area;
 	float xdir[3], ydir[3], col[3];
 	float stepx, stepy, texvec[2];
 	float p, u, v;
 	int k, kk, pos, n, i;
 	int use_texture= 0;
 	int tex_nr;
-	
-	density= sqrtf(re->r.lightcuts_area_density);
 
 	VECCOPY(xdir, orig->mat[0]);
 	VECCOPY(ydir, orig->mat[1]);
 
-	realw= sqrtf(VEC_LEN_SQ(orig->mat[0])) * orig->area_size;
-	realh= sqrtf(VEC_LEN_SQ(orig->mat[1])) * orig->area_sizey;
+	area= get_area_light_area(orig);
 	
-	n= MAX2((int)(density * realw), 1) * MAX2((int)(density * realh), 1);
-	factor= 2.0 * M_PI * orig->dist / (4.0 * realw * realh * n);
-
-	/* XXX: TODO: temporary check just to avoid freezing on undue densities */
-	if (lcd->light_counter + n * (1 + lcd->do_indir) > re->r.lightcuts_max_lights) {
-		printf("Err: required light density would violate light limit\n");
-		return;
-	}
+	n= lcd->area_density * area;
+	factor= 2.0 * M_PI * orig->dist / (4.0 * area * n);
 	
 	if (!(re->r.scemode & R_NO_TEX)) {
 		for(tex_nr= 0; tex_nr<MAX_MTEX; tex_nr++) {
@@ -1224,10 +1227,10 @@
 	
 	re->i.infostr= "Initializing Lightcuts";
 	re->stats_draw(&re->i);
-
+	
+	/* initialize LightcutsData */
 	re->lcdata = lcd = MEM_callocN(sizeof(LightcutsData), "LightcutsData");
 	pointlights= &lcd->pointlights;
-	lcd->light_counter= 0;
 	lcd->indir_fac= re->r.lightcuts_indir_fac;
 	lcd->do_indir= re->r.lightcuts_indirect;
 	lcd->random_dirs= re->r.lightcuts_random_dirs;
@@ -1253,6 +1256,17 @@
 		break;
 	}
 	
+	/* TODO: we could do some form of importance sampling here */
+	for(go=lights->first; go; go= go->next) {
+		lar= go->lampren;
+		if(lar==NULL || lar->type != LA_AREA)
+			continue;
+		lcd->area_density+= get_area_light_area(lar);
+	}
+	lcd->area_density= re->r.lightcuts_area_lights / lcd->area_density;
+	
+	/* light conversion */
+	
 	if (re->r.lightcuts_env_map > 0)
 		convert_environment_map(re, lcd, re->r.lightcuts_env_map);
 

Modified: branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c	2008-08-12 19:56:03 UTC (rev 16070)
+++ branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c	2008-08-12 20:28:43 UTC (rev 16071)
@@ -3441,16 +3441,15 @@
 	if(uiNewPanel(curarea, block, "Lightcuts", "Render", 640, 0, 318, 204)==0) return;
 	
 	uiDefButBitI(block, TOG, R_LIGHTCUTS, B_DIFF, "Enable lightcuts", 692, 142, 192, 20, &G.scene->r.mode, 0, 0, 0, 0, "Enable lightcuts rendering");
+	uiDefButBitI(block, TOG, SCE_PASS_LCFAUX, B_SET_PASS, "False color", 692, 120, 192, 20, &srl->passflag, 0, 0, 0, 0, "Deliver false color pass");
 	
-	uiDefButF(block, NUM, B_DIFF, "Max error:", 692, 120, 192, 20, &G.scene->r.lightcuts_max_error, 0.001, 1.0, 0, 0, "The maximum allowed error rate");
-	uiDefButI(block, NUM, B_DIFF, "Lights:", 692, 98, 96, 20, &G.scene->r.lightcuts_max_lights, 0, 100000, 0, 0, "The maximum number of lights to generate");
-	uiDefButI(block, NUM, B_DIFF, "AL density:", 692 + 96, 98, 96, 20, &G.scene->r.lightcuts_area_density, 0, 5000, 0, 0, "How many point lights per unit area are used for area lights");
+	uiDefButF(block, NUM, B_DIFF, "Max error:", 692, 98, 192, 20, &G.scene->r.lightcuts_max_error, 0.001, 1.0, 0, 0, "The maximum allowed error rate");
 	uiDefButI(block, NUM, B_DIFF, "Max cut:", 692, 76, 192, 20, &G.scene->r.lightcuts_max_cut, 0, 5000, 0, 0, "The maximum size of the cut");
-	uiDefButBitI(block, TOG, SCE_PASS_LCFAUX, B_SET_PASS, "False color", 692, 54, 192, 20, &srl->passflag, 0, 0, 0, 0, "Deliver false color pass");
-	uiDefButI(block, NUM, B_DIFF, "Environment map:", 692, 32, 192, 20, &G.scene->r.lightcuts_env_map, 0, 10000, 0, 0, "How many point lights are used to convert the environment map");
-	uiDefButF(block, NUM, B_DIFF, "Indirect 1/fac:", 692, 10, 192, 20, &G.scene->r.lightcuts_indir_fac, 1.0, 100000.0, 0, 0, "Indirect lighting factor: raise to reduce intensity");
-	uiDefButI(block, NUM, B_DIFF, "Indirect lights:", 692, 10-22, 96+48, 20, &G.scene->r.lightcuts_indirect, 0, 20, 0, 0, "Number of indirect lights per direct light");
-	uiDefButBitS(block, TOG, 0x1, B_DIFF, "Rand", 692+96+48, 10-22, 96-48, 20, &G.scene->r.lightcuts_random_dirs, 0, 0, 0, 0, "Enable random dirs");
+	uiDefButI(block, NUM, B_DIFF, "Area lights:", 692, 54, 192, 20, &G.scene->r.lightcuts_area_lights, 0, 100000, 0, 0, "The number of point lights generated for all the area lights");
+	uiDefButS(block, NUM, B_DIFF, "Environment map:", 692, 32, 192, 20, &G.scene->r.lightcuts_env_map, 0, 20000, 0, 0, "How many point lights are used to convert the environment map");
+	uiDefButS(block, NUM, B_DIFF, "Indirect lights:", 692, 10, 128, 20, &G.scene->r.lightcuts_indirect, 0, 20, 0, 0, "Number of indirect lights per direct light");
+	uiDefButBitS(block, TOG, 0x1, B_DIFF, "Rand", 692+128, 10, 64, 20, &G.scene->r.lightcuts_random_dirs, 0, 0, 0, 0, "Enable random dirs");
+	uiDefButF(block, NUM, B_DIFF, "Indirect 1/fac:", 692, 10-22, 192, 20, &G.scene->r.lightcuts_indir_fac, 1.0, 100000.0, 0, 0, "Indirect lighting factor: raise to reduce intensity");
 	
 	uiBlockBeginAlign(block);
 	uiDefButS(block, ROW, B_DIFF, "R601", 692, 10-44, 64, 20, &G.scene->r.lightcuts_color_weight, 0, 0, 0, 0, "R601 color weights: 0.299r 0.587g 0.114");





More information about the Bf-blender-cvs mailing list