[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42088] trunk/blender/source/blender/ editors/render/render_update.c: Fix #28934: missing GLSL/ icon update when changing materials used in nodes.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Nov 23 16:16:42 CET 2011


Revision: 42088
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42088
Author:   blendix
Date:     2011-11-23 15:16:41 +0000 (Wed, 23 Nov 2011)
Log Message:
-----------
Fix #28934: missing GLSL/icon update when changing materials used in nodes.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/render/render_update.c

Modified: trunk/blender/source/blender/editors/render/render_update.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_update.c	2011-11-23 14:40:15 UTC (rev 42087)
+++ trunk/blender/source/blender/editors/render/render_update.c	2011-11-23 15:16:41 UTC (rev 42088)
@@ -188,6 +188,10 @@
 			if(node->id == (ID*)tex) {
 				return 1;
 			}
+			else if(GS(node->id->name) == ID_MA) {
+				if(mtex_use_tex(((Material*)node->id)->mtex, MAX_MTEX, tex))
+					return 1;
+			}
 			else if(node->type==NODE_GROUP) {
 				if(nodes_use_tex((bNodeTree *)node->id, tex))
 					return 1;
@@ -198,14 +202,46 @@
 	return 0;
 }
 
-static void material_changed(Main *UNUSED(bmain), Material *ma)
+static int nodes_use_material(bNodeTree *ntree, Material *ma)
 {
+	bNode *node;
+
+	for(node=ntree->nodes.first; node; node= node->next) {
+		if(node->id) {
+			if(node->id == (ID*)ma) {
+				return 1;
+			}
+			else if(node->type==NODE_GROUP) {
+				if(nodes_use_material((bNodeTree *)node->id, ma))
+					return 1;
+			}
+		}
+	}
+
+	return 0;
+}
+
+static void material_changed(Main *bmain, Material *ma)
+{
+	Material *parent;
+
 	/* icons */
 	BKE_icon_changed(BKE_icon_getid(&ma->id));
 
 	/* glsl */
 	if(ma->gpumaterial.first)
 		GPU_material_free(ma);
+
+	/* find node materials using this */
+	for(parent=bmain->mat.first; parent; parent=parent->id.next) {
+		if(parent->use_nodes && parent->nodetree && nodes_use_material(parent->nodetree, ma));
+		else continue;
+
+		BKE_icon_changed(BKE_icon_getid(&parent->id));
+
+		if(parent->gpumaterial.first)
+			GPU_material_free(parent);
+	}
 }
 
 static void texture_changed(Main *bmain, Tex *tex)




More information about the Bf-blender-cvs mailing list