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");
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs