[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15224] branches/soc-2008-unclezeiv/source /blender/render/intern/source/lightcuts.c: bugfix: crashed when rendering with lightcuts enabled and no lights ( thanks marioamb)
Davide Vercelli
davide.vercelli at gmail.com
Sat Jun 14 20:46:51 CEST 2008
Revision: 15224
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15224
Author: unclezeiv
Date: 2008-06-14 20:46:39 +0200 (Sat, 14 Jun 2008)
Log Message:
-----------
bugfix: crashed when rendering with lightcuts enabled and no lights (thanks marioamb)
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-14 18:13:02 UTC (rev 15223)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 2008-06-14 18:46:39 UTC (rev 15224)
@@ -487,11 +487,8 @@
lcd->error_rate= re->r.lightcuts_max_error;
lcd->max_cut= MIN2(re->r.lightcuts_max_cut, lcd->light_counter);
- /* TODO: look for a better error condition in case we have no lights */
- if (pointlights->first) {
- lightcuts_fill_array(lcd, pointlights);
- lightcuts_build_tree(lcd);
- }
+ lightcuts_fill_array(lcd, pointlights);
+ lightcuts_build_tree(lcd);
lcd->cut_nodes_size= (lcd->max_lights * 2 + 1);
lcd->cut_nodes= MEM_callocN(sizeof(CutNode) * lcd->cut_nodes_size * re->r.threads, "cut_nodes");
@@ -632,34 +629,36 @@
CutNode *root= &cut_nodes[0];
LightcutsCluster *clus= &lcd->array_local[lcd->root_local];
- root->id= lcd->root_local;
- root->error_bound= calc_geometric_eb(lcd, lcd->root_local, shi->co) * calc_material_eb(tsm, clus) * shi->refl;
+ if (lcd->light_counter > 0) {
+ root->id= lcd->root_local;
+ root->error_bound= calc_geometric_eb(lcd, lcd->root_local, shi->co) * calc_material_eb(tsm, clus) * shi->refl;
#ifdef LIGHTCUTS_DEBUG
- dbg_convert[lcd->root_local]= 0;
+ dbg_convert[lcd->root_local]= 0;
#endif
- if (root->error_bound > FLT_EPSILON) {
- get_contrib(clus->lar, shi, &i, &i_noshad);
- lcd->stat_rays_shot++;
- root->contr_factor= MAX2(i, 0.0f);
- root->f_clus= root->contr_factor * clus->intensity;
- VECADDFAC(totest, totest, clus->col, root->f_clus);
-
- if(shi->passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW)) {
- root->contr_factor_noshad= MAX2(i_noshad, 0.0f);
- root->f_clus_noshad= root->contr_factor_noshad * clus->intensity;
- VECADDFAC(totest_noshad, totest_noshad, clus->col, root->f_clus_noshad);
- }
+ if (root->error_bound > FLT_EPSILON) {
+ get_contrib(clus->lar, shi, &i, &i_noshad);
+ lcd->stat_rays_shot++;
+ root->contr_factor= MAX2(i, 0.0f);
+ root->f_clus= root->contr_factor * clus->intensity;
+ VECADDFAC(totest, totest, clus->col, root->f_clus);
+
+ if(shi->passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW)) {
+ root->contr_factor_noshad= MAX2(i_noshad, 0.0f);
+ root->f_clus_noshad= root->contr_factor_noshad * clus->intensity;
+ VECADDFAC(totest_noshad, totest_noshad, clus->col, root->f_clus_noshad);
+ }
#ifdef LIGHTCUTS_DEBUG
- dbg_totlum= root->contr_factor * clus->luminance;
+ dbg_totlum= root->contr_factor * clus->luminance;
#endif
-
- if (!IS_LEAF(clus))
- BLI_heap_insert(cut, -root->error_bound * clus->luminance, root);
+
+ if (!IS_LEAF(clus))
+ BLI_heap_insert(cut, -root->error_bound * clus->luminance, root);
+ else
+ used++;
+ }
else
used++;
}
- else
- used++;
}
/* at each iteration the heap may grow by one, but we have a maximum size */
More information about the Bf-blender-cvs
mailing list