Revision: 28437
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28437
Author:   blendix
Date:     2010-04-26 17:55:18 +0200 (Mon, 26 Apr 2010)

Log Message:
-----------
Render Branch: fix for crash with material light groups local option.

Modified Paths:
--------------
    branches/render25/source/blender/blenkernel/intern/material.c
    branches/render25/source/blender/render/intern/include/render_types.h
    branches/render25/source/blender/render/intern/source/convertblender.c
    branches/render25/source/blender/render/intern/source/database.c
    branches/render25/source/blender/render/intern/source/lamp.c

Modified: branches/render25/source/blender/blenkernel/intern/material.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/material.c       
2010-04-26 12:50:48 UTC (rev 28436)
+++ branches/render25/source/blender/blenkernel/intern/material.c       
2010-04-26 15:55:18 UTC (rev 28437)
@@ -751,15 +751,6 @@
 
        if(ma->strand_surfnor > 0.0f)
                ma->mode_l |= MA_STR_SURFDIFF;
-       
-       /* local group override */
-       if((ma->shade_flag & MA_GROUP_LOCAL) && ma->id.lib && ma->group && 
ma->group->id.lib) {
-               Group *group;
-
-               for(group= G.main->group.first; group; group= group->id.next)
-                       if(!group->id.lib && strcmp(group->id.name, 
ma->group->id.name) == 0)
-                               ma->group = group;
-       }
 }
 
 static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int 
r_mode)

Modified: branches/render25/source/blender/render/intern/include/render_types.h
===================================================================
--- branches/render25/source/blender/render/intern/include/render_types.h       
2010-04-26 12:50:48 UTC (rev 28436)
+++ branches/render25/source/blender/render/intern/include/render_types.h       
2010-04-26 15:55:18 UTC (rev 28437)
@@ -85,6 +85,7 @@
        /* lamps */
        ListBase lights;        /* GroupObject pointers */
        ListBase lampren;       /* storage, for free */
+       struct GHash *lightgrouphash;
 
        /* subsurface scattering */
        struct GHash *sss_hash;

Modified: branches/render25/source/blender/render/intern/source/convertblender.c
===================================================================
--- branches/render25/source/blender/render/intern/source/convertblender.c      
2010-04-26 12:50:48 UTC (rev 28436)
+++ branches/render25/source/blender/render/intern/source/convertblender.c      
2010-04-26 15:55:18 UTC (rev 28437)
@@ -210,7 +210,7 @@
 
 static void set_material_lightgroups(Render *re)
 {
-       Group *group;
+       Group *group, *lightgroup;
        Material *ma;
        
        /* not for preview render */
@@ -223,8 +223,22 @@
        /* it's a bit too many loops in loops... but will survive */
        /* hola! materials not in use...? */
        for(ma= G.main->mat.first; ma; ma=ma->id.next) {
-               if(ma->group && (ma->group->id.flag & LIB_DOIT))
-                       lightgroup_create(re, ma->group, ma->mode & 
MA_GROUP_EXCLUSIVE);
+               if(ma->group && (ma->group->id.flag & LIB_DOIT)) {
+                       lightgroup= ma->group;
+
+                       /* local group override */
+                       if((ma->shade_flag & MA_GROUP_LOCAL) && ma->id.lib && 
ma->group->id.lib) {
+                               for(group= G.main->group.first; group; group= 
group->id.next) {
+                                       if(!group->id.lib && 
strcmp(group->id.name, ma->group->id.name) == 0) {
+                                               lightgroup= group;
+                                               break;
+                                       }
+                               }
+                       }
+
+                       BLI_ghash_insert(re->db.lightgrouphash, ma->group, 
lightgroup);
+                       lightgroup_create(re, lightgroup, ma->mode & 
MA_GROUP_EXCLUSIVE);
+               }
        }
 }
 

Modified: branches/render25/source/blender/render/intern/source/database.c
===================================================================
--- branches/render25/source/blender/render/intern/source/database.c    
2010-04-26 12:50:48 UTC (rev 28436)
+++ branches/render25/source/blender/render/intern/source/database.c    
2010-04-26 15:55:18 UTC (rev 28437)
@@ -59,6 +59,7 @@
 
        rdb->lights.first= rdb->lights.last= NULL;
        rdb->lampren.first= rdb->lampren.last= NULL;
+       rdb->lightgrouphash= BLI_ghash_new(BLI_ghashutil_ptrhash, 
BLI_ghashutil_ptrcmp);
 }
 
 void render_db_free(RenderDB *rdb)
@@ -105,6 +106,11 @@
        BLI_freelistN(&rdb->lampren);
        BLI_freelistN(&rdb->lights);
 
+       if(rdb->lightgrouphash) {
+               BLI_ghash_free(rdb->lightgrouphash, NULL, NULL);
+               rdb->lightgrouphash= NULL;
+       }
+
        /* memarea */
        if(rdb->memArena) {
                BLI_memarena_free(rdb->memArena);

Modified: branches/render25/source/blender/render/intern/source/lamp.c
===================================================================
--- branches/render25/source/blender/render/intern/source/lamp.c        
2010-04-26 12:50:48 UTC (rev 28436)
+++ branches/render25/source/blender/render/intern/source/lamp.c        
2010-04-26 15:55:18 UTC (rev 28437)
@@ -29,6 +29,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_ghash.h"
 #include "BLI_math.h"
 #include "BLI_listbase.h"
 
@@ -594,8 +595,11 @@
                return &re->db.lights;
        if(shi->material.light_override)
                return &shi->material.light_override->gobject;
-       if(shi->material.mat && shi->material.mat->group)
-               return &shi->material.mat->group->gobject;
+       if(shi->material.mat && shi->material.mat->group) {
+               Group *group= BLI_ghash_lookup(re->db.lightgrouphash, 
shi->material.mat->group);
+               if(group)
+                       return &group->gobject;
+       }
        
        return &re->db.lights;
 }
@@ -904,7 +908,7 @@
 void lightgroup_create(Render *re, Group *group, int exclusive)
 {
        GroupObject *go, *gol;
-       
+
        group->id.flag &= ~LIB_DOIT;
 
        /* it's a bit too many loops in loops... but will survive */


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

Reply via email to