[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