[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28437] branches/render25/source/blender: Render Branch: fix for crash with material light groups local option.
Brecht Van Lommel
brecht at blender.org
Mon Apr 26 17:55:18 CEST 2010
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 */
More information about the Bf-blender-cvs
mailing list