Revision: 15017
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15017
Author:   unclezeiv
Date:     2008-05-28 00:20:02 +0200 (Wed, 28 May 2008)

Log Message:
-----------
Moved all global variables in a new LightcutsData struct, opaquely linked by 
the Render database.
Fix: the light tree is now correctly deallocated.

Modified Paths:
--------------
    branches/soc-2008-unclezeiv/source/blender/render/intern/include/lightcuts.h
    
branches/soc-2008-unclezeiv/source/blender/render/intern/include/render_types.h
    
branches/soc-2008-unclezeiv/source/blender/render/intern/source/convertblender.c
    branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c
    
branches/soc-2008-unclezeiv/source/blender/render/intern/source/shadeoutput.c

Modified: 
branches/soc-2008-unclezeiv/source/blender/render/intern/include/lightcuts.h
===================================================================
--- 
branches/soc-2008-unclezeiv/source/blender/render/intern/include/lightcuts.h    
    2008-05-27 20:02:38 UTC (rev 15016)
+++ 
branches/soc-2008-unclezeiv/source/blender/render/intern/include/lightcuts.h    
    2008-05-27 22:20:02 UTC (rev 15017)
@@ -31,10 +31,14 @@
 #include "render_types.h"
 #include "rendercore.h"
 
-void lightcuts_create_point_lights(Render * re);
+struct LightcutsData;
 
+void lightcuts_init(Render *re);
+
+void lightcuts_free(struct LightcutsData *lcd);
+
 typedef float (*LightContribFunc)(LampRen *lar, ShadeInput *shi);
 
-void lightcuts_do_lights(LightContribFunc get_contrib, ShadeInput *shi, float 
* diff);
+void lightcuts_do_lights(struct LightcutsData *lcd, LightContribFunc 
get_contrib, ShadeInput *shi, float *diff);
 
 #endif /*LIGHTCUTS_H_*/

Modified: 
branches/soc-2008-unclezeiv/source/blender/render/intern/include/render_types.h
===================================================================
--- 
branches/soc-2008-unclezeiv/source/blender/render/intern/include/render_types.h 
    2008-05-27 20:02:38 UTC (rev 15016)
+++ 
branches/soc-2008-unclezeiv/source/blender/render/intern/include/render_types.h 
    2008-05-27 22:20:02 UTC (rev 15017)
@@ -50,6 +50,7 @@
 struct GHash;
 struct RenderBuckets;
 struct ObjectInstanceRen;
+struct LightcutsData;
 
 #define TABLEINITSIZE 1024
 #define LAMPINITSIZE 256
@@ -180,8 +181,9 @@
 
        ListBase lights;        /* GroupObject pointers */
        ListBase lampren;       /* storage, for free */
-       ListBase pointlights;   /* for lightcuts */
        
+       struct LightcutsData *lcdata;
+       
        ListBase objecttable;
 
        struct ObjectInstanceRen *objectinstance;

Modified: 
branches/soc-2008-unclezeiv/source/blender/render/intern/source/convertblender.c
===================================================================
--- 
branches/soc-2008-unclezeiv/source/blender/render/intern/source/convertblender.c
    2008-05-27 20:02:38 UTC (rev 15016)
+++ 
branches/soc-2008-unclezeiv/source/blender/render/intern/source/convertblender.c
    2008-05-27 22:20:02 UTC (rev 15017)
@@ -4395,7 +4395,6 @@
        
        BLI_freelistN(&re->lampren);
        BLI_freelistN(&re->lights);
-       BLI_freelistN(&re->pointlights);
 
        free_renderdata_tables(re);
        
@@ -4437,6 +4436,8 @@
        free_occ(re);
        free_strand_surface(re);
        
+       lightcuts_free(re->lcdata);
+       
        re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
        re->i.convertdone= 0;
        
@@ -4783,7 +4784,6 @@
        re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
        re->lights.first= re->lights.last= NULL;
        re->lampren.first= re->lampren.last= NULL;
-       re->pointlights.first= re->pointlights.last= NULL;
        
        slurph_opt= 0;
        re->i.partsdone= 0;     /* signal now in use for previewrender */
@@ -4885,7 +4885,7 @@
                
                /* lightcuts */
                if((re->r.mode & R_LIGHTCUTS) && !re->test_break())
-                       lightcuts_create_point_lights(re);
+                       lightcuts_init(re);
        }
        
        if(re->test_break())
@@ -4926,7 +4926,6 @@
        re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
        
re->i.totface=re->i.totvert=re->i.totstrand=re->i.totlamp=re->i.tothalo= 0;
        re->lights.first= re->lights.last= NULL;
-       re->pointlights.first= re->pointlights.last= NULL;
 
        slurph_opt= 0;
        
@@ -5450,7 +5449,6 @@
        re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
        re->lights.first= re->lights.last= NULL;
        re->lampren.first= re->lampren.last= NULL;
-       re->pointlights.first= re->pointlights.last= NULL;
 
        /* in localview, lamps are using normal layers, objects only local bits 
*/
        if(re->scene->lay & 0xFF000000) lay= re->scene->lay & 0xFF000000;

Modified: 
branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 
2008-05-27 20:02:38 UTC (rev 15016)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 
2008-05-27 22:20:02 UTC (rev 15017)
@@ -40,6 +40,7 @@
 #include "MEM_guardedalloc.h"
 #include "RE_pipeline.h"
 
+#include "blendef.h"
 #include "render_types.h"
 
 /* = LA_X + 1 */
@@ -48,9 +49,6 @@
 #define CLUSTER_SUN   2
 #define CLUSTER_SPOT  3
 
-/* TODO: these are WIP values */
-#define LIGHTCUTS_MAX_METRIC (10e38)
-
 /* node of the lightcuts tree */
 typedef struct LightcutsCluster
 {
@@ -79,24 +77,25 @@
        float error_bound;
 } CutNode;
 
+typedef struct LightcutsData {
+       /* NOTE: conservative space estimation */
+       /* TODO: equivalent data structures for sun and spot */
+       ListBase pointlights;
+       LightcutsCluster *array_local;
+       int free_local; /* location of first empty slot */
+       int root_local; /* id of root node */
+       float max_local_dist; /* maximum distance for local lights */
+       
+       float error_rate;
+       int max_lights;
+       int max_cut;
+} LightcutsData;
+
 #define VEC_LEN_SQ(v) (v[0]*v[0] + v[1]*v[1] + v[2]*v[2])
 /* TODO: tentative calculation, will look better into it */
 #define LC_LUMINOSITY(c) (0.299*c[0] + 0.587*c[1] + 0.114*c[2])
 #define VECCOPYMUL(v1,v2,aS) {*(v1)= *(v2)*aS; *(v1+1)= *(v2+1)*aS; *(v1+2)= 
*(v2+2)*aS;}
 
-/* TODO: move local variables in a cleaner structure */
-/* NOTE: conservative space estimation */
-/* TODO: dynamic allocation required of course */
-/* TODO: equivalent data structures for sun and spot */
-static LightcutsCluster *array_local= 0;
-static int free_local; /* location of first empty slot */
-static int root_local; /* id of root node */
-static float max_local_dist; /* maximum distance for local lights */
-
-static float error_rate;
-static int max_lights;
-static int max_cut;
-
 static float lightcuts_compute_metric(LightcutsCluster * one, LightcutsCluster 
* two)
 {
        /* TODO: compute metric also for oriented lights */
@@ -147,16 +146,16 @@
        (*root)++;
 }
 
-static void find_and_insert_new_min(Heap * heap, LightcutsCluster * array, 
LightcutsClusterPair * pair, int id, int from)
+static void find_and_insert_new_min(Heap * heap, LightcutsCluster * array, int 
size, LightcutsClusterPair * pair, int id, int from)
 {
        LightcutsCluster * el = &array[id];
        LightcutsCluster * el2;
-       float metric = LIGHTCUTS_MAX_METRIC + 1.0;
+       float metric = MAXFLOAT;
        float pair_metric;
        int other = -1;
        int i;
        
-       for (i = from; i < max_lights * 2; i++)
+       for (i = from; i < size; i++)
        {
                if (i == id)
                        continue;
@@ -185,16 +184,17 @@
        }
 }
 
-static void lightcuts_fill_array(ListBase * pointlights)
+static void lightcuts_fill_array(LightcutsData *lcd, ListBase * pointlights)
 {
        GroupObject *go;
        LampRen *lar;
-       LightcutsCluster *clus = array_local;
+       LightcutsCluster *clus;
        
-       /* TODO: check if not already filled in ? */
-       memset(array_local, 0, sizeof(LightcutsCluster) * (max_lights * 2));
-       free_local = 0;
-       root_local = 0;
+       lcd->array_local= MEM_callocN(sizeof(LightcutsCluster) * 
lcd->max_lights * 2, "array_local");
+       lcd->free_local= 0;
+       lcd->root_local= 0;
+       
+       clus= lcd->array_local;
                
        for(go = pointlights->first; go; go = go->next) {
                lar = go->lampren;
@@ -205,20 +205,20 @@
                
                clus->type = CLUSTER_LOCAL;
                clus->in_tree = 0;
-               clus->id = free_local;
+               clus->id = lcd->free_local;
                clus->intensity = lar->energy;
                VECCOPY(clus->min, lar->co);
                VECCOPY(clus->max, lar->co);
                clus->lar = lar;
                
                clus++;
-               free_local++;
+               lcd->free_local++;
        }
 }
 
-static void debug_print_tree(int root_local, int lev)
+static void debug_print_tree(LightcutsCluster *array, int root, int lev)
 {
-       LightcutsCluster * el = &array_local[root_local];
+       LightcutsCluster *el= &array[root];
        int i;
        for (i = 0; i < lev; i++)
                printf("-");
@@ -227,24 +227,24 @@
        if (el->child1 == 0 && el->child2 == 0)
                return;
        
-       debug_print_tree(el->child1, lev + 1);
-       debug_print_tree(el->child2, lev + 1);          
+       debug_print_tree(array, el->child1, lev + 1);
+       debug_print_tree(array, el->child2, lev + 1);           
 }
        
-static void lightcuts_build_tree()
+static void lightcuts_build_tree(LightcutsData *lcd)
 {      
        int i, cluster_id = 0;
        
        Heap * heap = BLI_heap_new();
        /* TODO: taylor size */
-       LightcutsClusterPair *pair_array= 
MEM_callocN(sizeof(LightcutsClusterPair) * max_lights * 2, "pair_array");
+       LightcutsClusterPair *pair_array= 
MEM_callocN(sizeof(LightcutsClusterPair) * lcd->max_lights * 2, "pair_array");
        
-       for (i = 0; i < max_lights; i++)
+       for (i = 0; i < lcd->max_lights; i++)
        {
-               if (array_local[i].type == CLUSTER_EMPTY)
+               if (lcd->array_local[i].type == CLUSTER_EMPTY)
                        break;
                                
-               find_and_insert_new_min(heap, array_local, &pair_array[i], i, i 
+ 1);
+               find_and_insert_new_min(heap, lcd->array_local, lcd->max_lights 
* 2, &pair_array[i], i, i + 1);
        }
        
        /* now we have a nice heap with shortest metric for each element */
@@ -254,8 +254,8 @@
        while (!BLI_heap_empty(heap))
        {
                LightcutsClusterPair * minpair = (LightcutsClusterPair 
*)BLI_heap_popmin(heap);
-               short in_tree1 = array_local[minpair->first].in_tree;
-               short in_tree2 = array_local[minpair->second].in_tree;
+               short in_tree1 = lcd->array_local[minpair->first].in_tree;
+               short in_tree2 = lcd->array_local[minpair->second].in_tree;
                
                if (in_tree1)
                        continue;
@@ -263,25 +263,25 @@
                /* we look for another minimum */               
                if (in_tree2)
                {
-                       find_and_insert_new_min(heap, array_local, minpair, 
minpair->first, 0);
+                       find_and_insert_new_min(heap, lcd->array_local, 
lcd->max_lights * 2, minpair, minpair->first, 0);
                        continue;
                }
                
                /* valid pair: build cluster out of it, mark children as used */
-               cluster_id = free_local;
-               add_new_cluster(array_local, minpair, &free_local);
+               cluster_id = lcd->free_local;
+               add_new_cluster(lcd->array_local, minpair, &lcd->free_local);
                
                /* new search, avoid considering in_tree children */
-               find_and_insert_new_min(heap, array_local, minpair, cluster_id, 
0);
+               find_and_insert_new_min(heap, lcd->array_local, lcd->max_lights 
* 2, minpair, cluster_id, 0);
        }
        
        BLI_heap_free(heap, 0);
        
        /* the last cluster added is the root of the tree */    
-       root_local = cluster_id;
+       lcd->root_local = cluster_id;
        
-       printf("Lightcuts tree built: %d\n", root_local);
-       debug_print_tree(root_local, 0);
+       printf("Lightcuts tree built: %d\n", lcd->root_local);
+       debug_print_tree(lcd->array_local, lcd->root_local, 0);
        
        MEM_freeN(pair_array);
 }
@@ -334,16 +334,20 @@
        }
 }
 
-void lightcuts_create_point_lights(Render * re)
-{      
+void lightcuts_init(Render * re)
+{
+       LightcutsData *lcd;
        GroupObject *go, *gonew;

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to