Revision: 16311
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16311
Author:   unclezeiv
Date:     2008-08-30 23:50:23 +0200 (Sat, 30 Aug 2008)

Log Message:
-----------
Added support for multiple bounces. Also fixed a numerical error that could 
give long tree building times and black screens.

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-30 21:41:02 UTC (rev 16310)
+++ branches/soc-2008-unclezeiv/source/blender/blenloader/intern/readfile.c     
2008-08-30 21:50:23 UTC (rev 16311)
@@ -7786,6 +7786,8 @@
                                        r->lightcuts_color_weight= 1;
                                if(r->lightcuts_env_map_fac==0.0f)
                                        r->lightcuts_env_map_fac= 1.0f;
+                               if(r->lightcuts_indir_bounces==0)
+                                       r->lightcuts_indir_bounces= 1;
                        }
                        
                        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-30 21:41:02 UTC (rev 16310)
+++ branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h       
2008-08-30 21:50:23 UTC (rev 16311)
@@ -319,7 +319,7 @@
        short lightcuts_env_map;
        short lightcuts_indirect;
        short lightcuts_color_weight;
-       short lightcuts_pad;
+       short lightcuts_indir_bounces;
        float lightcuts_indir_fac;
        int lightcuts_options;
        float lightcuts_indir_dist;

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-30 21:41:02 UTC (rev 16310)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 
2008-08-30 21:50:23 UTC (rev 16311)
@@ -94,7 +94,7 @@
 
 #define LC_OPT_FIXED_DIRS  0x0001
 #define LC_OPT_ONLY_INDIR  0x0002
-#define LC_OPT_2ND_BOUNCE  0x0004
+// #define LC_OPT_2ND_BOUNCE  0x0004
 #define LC_OPT_ENV_LIGHT   0x0008
 #define LC_OPT_INDIR_MESH  0x0010
 #define LC_OPT_NO_CLAMP    0x0020
@@ -205,6 +205,8 @@
        float scene_min[3], scene_max[3];
        float indir_fac;
        float indir_dist;
+       short indir_bounces;
+       short pad;
        int do_indir;
        int options;
        
@@ -242,7 +244,7 @@
 #define IS_LEAF(node) (!(node)->child1 && !(node)->child2)
 #define LC_LUMINOSITY_LIMIT (0.0001f)
 
-static void add_virtual_point_light(Render * re, LightcutsData *lcd, LampRen 
*orig, float *col, int lev);
+static void add_virtual_point_light(Render * re, LightcutsData *lcd, LampRen 
*orig, float *col, short lev, float weight);
 
 /* XXX: this function looks really slow! */
 static float get_bounding_cone(LightcutsCluster * one, LightcutsCluster * two, 
float *vec)
@@ -992,10 +994,8 @@
                }
                
                /* indirect lighting */
-               for (i= 0; i < lcd->do_indir; i++) {
-                       int lev= (lcd->options & LC_OPT_2ND_BOUNCE) ? 1 : 0;
-                       add_virtual_point_light(re, lcd, lar, col, lev);
-               }
+               for (i= 0; i < lcd->do_indir; i++)
+                       add_virtual_point_light(re, lcd, lar, col, 
lcd->indir_bounces, 1.0f / lcd->do_indir);
 
                if (lcd->do_indir > 0 && (lcd->options & LC_OPT_ONLY_INDIR))
                        continue;
@@ -1319,7 +1319,7 @@
        
        max_col= MAX3(shr.col[0], shr.col[1], shr.col[2]);
 
-       if (max_col==0.0f) {
+       if (max_col <= FLT_EPSILON) {
                lcd->stat_discard_black+= 10000;
                return 0.0f;
        }
@@ -1330,7 +1330,7 @@
        return shr.diff[max_idx] / shr.col[max_idx];
 }
 
-static void add_virtual_point_light(Render * re, LightcutsData *lcd, LampRen 
*orig, float *col, int lev)
+static void add_virtual_point_light(Render * re, LightcutsData *lcd, LampRen 
*orig, float *col, short lev, float weight)
 {
        LampRen *lar;
        VlakRen *vla;
@@ -1389,17 +1389,17 @@
        
        fac= get_bounce_color(lcd, isec.ob, vla, co, orig, scol, isec.isect);
 
-       if (fac == 0.0f) {
+       if (fac <= 0.0f) {
                lcd->stat_discard_black++;
                return;
        }
 
-#ifdef LIGHTCUTS_DEBUG
-       if ((lcd->options & LC_DBG_INDIR_DISCARD_NAN) && fac >= 0.499f) {
+// #ifdef LIGHTCUTS_DEBUG
+       if (/*(lcd->options & LC_DBG_INDIR_DISCARD_NAN) && */fac >= (1.0f / 
M_PI)) {
                lcd->stat_discard_nan++;
                return;
        }
-#endif
+// #endif
        
        lar= &lcd->lampren_pool[lcd->pool_counter++];
        lamp_init(re, lar);
@@ -1423,7 +1423,7 @@
        lar->ray_samp_method= LA_SAMP_CONSTANT;
        
        /* note that lamp_get_visibility is called in get_bounce_color */
-       lar->energy= fac * orig->energy * (lev + 1) * lcd->indir_fac / 
lcd->do_indir;
+       lar->energy= fac * orig->energy * lcd->indir_fac * weight;
        
        /* TODO: without proper spectrum handling, this could be too darkening 
*/
        scol[0]*= col[0];
@@ -1446,8 +1446,8 @@
        lcd->trees[TREE_SPOT].counter++;
        lcd->vpl_counter++;
        
-       if (lev > 0)
-               add_virtual_point_light(re, lcd, lar, scol, lev - 1);
+       if (lev > 1)
+               add_virtual_point_light(re, lcd, lar, scol, lev - 1, 1.0f);
 }
 
 static float get_area_light_actual_area(LampRen *lar)
@@ -1537,10 +1537,8 @@
                lar->energy= orig->energy * factor;
                
                /* indirect lighting */
-               for (i= 0; i < lcd->do_indir; i++) {
-                       int lev= (lcd->options & LC_OPT_2ND_BOUNCE) ? 1 : 0;
-                       add_virtual_point_light(re, lcd, lar, col, lev);
-               }
+               for (i= 0; i < lcd->do_indir; i++)
+                       add_virtual_point_light(re, lcd, lar, col, 
lcd->indir_bounces, 1.0f / lcd->do_indir);
                
                if (lcd->do_indir > 0 && (lcd->options & LC_OPT_ONLY_INDIR))
                        continue;
@@ -1567,6 +1565,7 @@
        re->lcdata = lcd = MEM_callocN(sizeof(LightcutsData), "LightcutsData");
        lcd->indir_fac= re->r.lightcuts_indir_fac;
        lcd->indir_dist= re->r.lightcuts_indir_dist;
+       lcd->indir_bounces= re->r.lightcuts_indir_bounces;
        lcd->do_indir= re->r.lightcuts_indirect;
        lcd->options= re->r.lightcuts_options;
        lcd->error_rate= re->r.lightcuts_max_error;
@@ -1576,9 +1575,6 @@
 #endif
        RE_ray_tree_aabb(re->raytree, lcd->scene_min, lcd->scene_max);
        
-       if (lcd->options & LC_OPT_2ND_BOUNCE)
-               lcd->indir_fac /= 2.0f;
-       
        switch (re->r.lightcuts_color_weight) {
        case 0x1:
                lcd->colw[0]= 0.316;
@@ -1631,11 +1627,8 @@
                        n_generated+= re->r.lightcuts_env_map;
                
                if (lcd->do_indir > 0) {
-                       n_vpl= (n_orig + n_generated) * lcd->do_indir;
+                       n_vpl= (n_orig + n_generated) * lcd->do_indir * 
lcd->indir_bounces;
                        
-                       if (lcd->options & LC_OPT_2ND_BOUNCE)
-                               n_vpl += n_vpl * lcd->do_indir;
-                       
                        /* allocate array to hold coordinates for all possible 
virtual point lights */
                        if (lcd->options & LC_OPT_INDIR_MESH && n_vpl != 0)
                                lcd->dbg_vis_vpl= MEM_callocN(sizeof(float) * 3 
* n_vpl, "lc_vpl_visualization");
@@ -1683,9 +1676,8 @@
                if (lcd->do_indir > 0) {
                        int i;
                        for (i= 0; i < lcd->do_indir; i++) {
-                               int lev= (lcd->options & LC_OPT_2ND_BOUNCE) ? 1 
: 0;
                                float col[3] = {lar->r, lar->g, lar->b};
-                               add_virtual_point_light(re, lcd, lar, col, lev);
+                               add_virtual_point_light(re, lcd, lar, col, 
lcd->indir_bounces, 1.0f / lcd->do_indir);
                        }
                
                        if (lcd->options & LC_OPT_ONLY_INDIR)

Modified: branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c      
2008-08-30 21:41:02 UTC (rev 16310)
+++ branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c      
2008-08-30 21:50:23 UTC (rev 16311)
@@ -3462,8 +3462,8 @@
        /* TODO: yep, magic numbers, but they are going to change soon anyway */
        uiDefButBitI(block, TOG, 0x0080, B_DIFF, "No spec", 0, -162, 62, 20, 
&G.scene->r.lightcuts_options, 0, 0, 0, 0, "Disable specular from indirect 
lighting");
        uiDefButF(block, NUM, B_DIFF, "Fac:", 63, -162, 128, 20, 
&G.scene->r.lightcuts_indir_fac, 1.0, 100000.0, 0, 0, "Indirect lighting 
factor");
-       uiDefButBitI(block, TOG, 0x4, B_DIFF, "2nd", 0, -184, 62, 20, 
&G.scene->r.lightcuts_options, 0, 0, 0, 0, "Enable second bounce for indirect 
lighting");
-       uiDefButF(block, NUM, B_DIFF, "Dist:", 63, -184, 128, 20, 
&G.scene->r.lightcuts_indir_dist, 0.001, 1000.0, 0, 0, "Distance for indirect 
lights");
+       uiDefButS(block, NUM, B_DIFF, "Bounces", 0, -184, 95, 20, 
&G.scene->r.lightcuts_indir_bounces, 1, 10, 0, 0, "Select number of bounces for 
indirect lighting");
+       uiDefButF(block, NUM, B_DIFF, "Dist:", 97, -184, 95, 20, 
&G.scene->r.lightcuts_indir_dist, 0.001, 1000.0, 0, 0, "Distance for indirect 
lights");
        uiBlockEndAlign(block);
        
        uiBlockBeginAlign(block);


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to