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