Revision: 15415
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15415
Author:   unclezeiv
Date:     2008-07-03 16:47:07 +0200 (Thu, 03 Jul 2008)

Log Message:
-----------
Initial commit for environment map light generation: it is currently based on a 
simple hammersley sampling scheme. The number of samples can be selected from 
the Lightcuts panel, while the environment map intensity can be changed as 
usual under Shading > World > Range.

Known issues: on a specific test file the first rendering goes wrong as if 
Blender thinks that no sky textures are present; subsequent renderings are 
fine. Please send me confirmation of this bug if you happen to stumble on it.

Modified Paths:
--------------
    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/makesdna/DNA_scene_types.h
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h       
2008-07-03 10:38:35 UTC (rev 15414)
+++ branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h       
2008-07-03 14:47:07 UTC (rev 15415)
@@ -317,7 +317,7 @@
        int lightcuts_max_lights;
        int lightcuts_max_cut;
        int lightcuts_area_density;
-       float lightcuts_unused;
+       int lightcuts_env_map;
        int pad4;
 } 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-07-03 10:38:35 UTC (rev 15414)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 
2008-07-03 14:47:07 UTC (rev 15415)
@@ -43,6 +43,7 @@
 #include "RE_raytrace.h"
 
 #include "blendef.h"
+#include "pixelshading.h"
 #include "render_types.h"
 
 /* #define LIGHTCUTS_DEBUG */
@@ -431,18 +432,15 @@
        MEM_freeN(pair_array);
 }
 
-static void create_lamp_oriented(Render * re, LampRen * lar, LampRen * orig)
+static void init_lamp(Render * re, LampRen * lar)
 {
-       /* float xs, ys, dist; */
+       /* float xs, ys, dist, distkw; */
        /* TODO: what is xs ys ?? where are they used? */
-       lar->dist= orig->dist;
-       lar->distkw= lar->dist * lar->dist; /* who uses this? */
        
        /* float co[3]; */
        /* initialize later */
        
        /* short type, mode; */
-       lar->type = LA_SPOT;
        lar->mode = LA_SHAD_RAY; /* at least */
        
        /* float r, g, b, k; k is GAMMA */
@@ -454,14 +452,11 @@
        
        /* int lay; */
        /* TODO: check thislayer stuff... */
-       lar->lay= orig->lay;
        
        /* float spotsi,spotbl; */
        lar->spotsi= 0.0f; /* it's actually the cosine; TODO: check if it's ok 
*/
        
        /* float vec[3]; */
-       /* same as original area light */
-       VECCOPY(lar->vec, orig->vec);
        
        /* float xsp, ysp, distkw, inpr; TODO: unknown uses!! */
        /* float halokw, halo; TODO: unknown uses!! */
@@ -508,13 +503,11 @@
        /* float *jitter; */
        
        /* float imat[3][3]; */
-       Mat3CpyMat3(lar->imat, orig->imat);
        
        /* float spottexfac; */
        /* float sh_invcampos[3], sh_zfac; // sh_= spothalo */
        
        /* float mat[3][3];     // 3x3 part from lampmat x viewmat */
-       Mat3CpyMat3(lar->mat, orig->mat);
        /* float area[8][3], areasize; */
        
        /* passes & node shader support: all shadow info for a pixel */
@@ -565,6 +558,117 @@
        */
 }
 
+static void create_lamp_oriented(Render * re, LampRen * lar, LampRen * orig)
+{
+       init_lamp(re, lar);
+       lar->dist= orig->dist;
+       lar->distkw= lar->dist * lar->dist; /* who uses this? */
+       
+       lar->lay= orig->lay;
+       /* same as original area light */
+       VECCOPY(lar->vec, orig->vec);
+       Mat3CpyMat3(lar->imat, orig->imat);
+       Mat3CpyMat3(lar->mat, orig->mat);
+       lar->type = LA_SPOT;
+}
+
+
+static void convert_environment_map(Render *re, LightcutsData *lcd, int n)
+{
+       GroupObject *gonew;
+       LampRen *lar;
+       int k, kk;
+       float t, p, phi, phirad, st;
+       float maxc;
+       
+       float col[3], co[3];
+       float dxyview[2];
+       
+       /* XXX: not sure about this */
+       dxyview[0]= dxyview[1]= 1.0f/(sqrtf((float)n));
+       
+       for (k= 0; k < n; k++) {
+               /*
+                * hammersley algorithm, from
+                * Wong, Luk, Heng "Sampling with Hammersley and Halton Points"
+                * Journal of Graphics Tools , vol. 2, no. 2, 1997, pp 9-24.
+                */
+               t= 0.0f;
+               p= 0.5f;
+               kk= k;
+               
+               while (kk > 0) {
+                       if (kk & 1)
+                               t+= p;
+                       p*= 0.5f;
+                       kk >>= 1;
+               }
+               
+               t= 2.0f * t - 1.0f;
+               phi= (k+0.5f)/n;
+               phirad= phi * 2.0 * M_PI;
+               st= sqrtf(1.0-t*t);
+               
+               co[0]= st * cosf(phirad);
+               co[1]= st * sinf(phirad);
+               co[2]= t;
+               
+               shadeSkyView(col, NULL, co, dxyview);
+               
+               /* XXX: arbitrary limit */
+               if (LC_LUMINOSITY(col) < 0.01f)
+                       continue;
+               
+               gonew= MEM_callocN(sizeof(GroupObject), "groupobject");
+               BLI_addtail(&lcd->pointlights, gonew);
+               /* gonew->recalc= go->recalc; // XXX: what is this? */
+               /*
+                * XXX: probably wrong, more a test to see if it is used 
somewhere
+                * or deallocated
+                * The point here is that we create new lights with no 
corresponding
+                * objects... do we need objects there?
+                */
+               gonew->ob= 0; /* XXX: or go->ob */
+               
+               lar = (LampRen *)MEM_callocN(sizeof(LampRen), "lampren");
+               init_lamp(re, lar);
+               lar->type = LA_SUN;
+               
+               lar->lay= 0xffffffff; /* XXX: check */
+               
+               VECCOPY(lar->co, co);
+               VECCOPY(lar->vec, lar->co);
+               VECNEG(lar->vec);
+               
+               /*
+                * is it necessary for sun lamps? 
+                * Mat3CpyMat3(lar->imat, orig->imat);
+                * Mat3CpyMat3(lar->mat, orig->mat);
+                */
+               
+               /* please note: you can control this factor via Shading > World 
> Range */
+               lar->energy= M_PI / (float)n;
+               lar->r= col[0] * lar->energy;
+               lar->g= col[1] * lar->energy;
+               lar->b= col[2] * lar->energy;
+               
+               maxc= MAX3(col[0], col[1], col[2]);
+               
+               if (maxc > 1.0f) {
+                       /* so that bright lights don't get excluded when n is 
large */
+                       lar->energy *= maxc;
+               }
+
+               BLI_addtail(&re->lampren, lar);
+               /* check deallocation */
+               gonew->lampren= lar;
+
+               lcd->trees[TREE_SUN].counter++;
+               lcd->light_counter++;
+               lar->ray_samp_method = LA_SAMP_CONSTANT;
+       }
+}
+
 static void convert_area_light(Render * re, LightcutsData *lcd, LampRen *orig)
 {
        GroupObject *gonew;
@@ -662,6 +766,9 @@
        lcd->max_local_dist= MAXFLOAT;
        lcd->max_spot_dist= MAXFLOAT;
        lcd->light_counter= 0;
+       
+       if (re->r.lightcuts_env_map > 0)
+               convert_environment_map(re, lcd, re->r.lightcuts_env_map);
 
        for(go=lights->first; go; go= go->next) {
                lar= go->lampren;

Modified: branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c      
2008-07-03 10:38:35 UTC (rev 15414)
+++ branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c      
2008-07-03 14:47:07 UTC (rev 15415)
@@ -3432,6 +3432,7 @@
        uiDefButI(block, NUM, B_REDR, "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_REDR, "Area lights light density:", 692, 32, 
192, 20, &G.scene->r.lightcuts_area_density, 0, 5000, 0, 0, "How many point 
lights per unit area are used for area lights");
+       uiDefButI(block, NUM, B_REDR, "Environment map:", 692, 10, 192, 20, 
&G.scene->r.lightcuts_env_map, 0, 10000, 0, 0, "How many point lights are used 
to convert the environment map");
 }
 
 void render_panels()


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

Reply via email to