[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41115] trunk/blender/source/blender: Adds an update flag to the bNode struct (similar to bNodeTree->update).

Lukas Toenne lukas.toenne at googlemail.com
Wed Oct 19 19:08:36 CEST 2011


Revision: 41115
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41115
Author:   lukastoenne
Date:     2011-10-19 17:08:35 +0000 (Wed, 19 Oct 2011)
Log Message:
-----------
Adds an update flag to the bNode struct (similar to bNodeTree->update).

This prevents access to non-existent typeinfo during type initialization,
when node types have been removed and such nodes are deleted from older files.
All blenkernel functions now only set the node->update flag instead of directly
calling the update function.  All operators, etc. calling blenkernel functions
to modify nodes should make a ntreeUpdate call afterward (they already did that
anyway).

Editor/RNA/renderer/etc. high-level functions still can do immediate updates by
using nodeUpdate and nodeUpdateID (replacing NodeTagChanged/NodeTagIDChanged
respectively). These old functions were previously used only for setting
compositor node needexec flags and clearing cached data, but have become generic
update functions that require type-specific functionality (i.e. a valid typeinfo
struct).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/editors/space_node/node_draw.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/editors/space_node/space_node.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/nodes/composite/node_composite_tree.c
    trunk/blender/source/blender/nodes/intern/node_common.c
    trunk/blender/source/blender/nodes/shader/node_shader_tree.c
    trunk/blender/source/blender/nodes/texture/node_texture_tree.c
    trunk/blender/source/blender/render/intern/source/pipeline.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2011-10-19 17:08:35 UTC (rev 41115)
@@ -346,9 +346,8 @@
 int				nodeSetActiveID(struct bNodeTree *ntree, short idtype, struct ID *id);
 void			nodeClearActiveID(struct bNodeTree *ntree, short idtype);
 
-void			NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
-int				NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
-void			ntreeClearTags(struct bNodeTree *ntree);
+void			nodeUpdate(struct bNodeTree *ntree, struct bNode *node);
+int				nodeUpdateID(struct bNodeTree *ntree, struct ID *id);
 
 void			nodeFreePreview(struct bNode *node);
 
@@ -601,9 +600,9 @@
 int ntreeCompositTagAnimated(struct bNodeTree *ntree);
 void ntreeCompositTagGenerators(struct bNodeTree *ntree);
 void ntreeCompositForceHidden(struct bNodeTree *ntree, struct Scene *scene);
+void ntreeCompositClearTags(struct bNodeTree *ntree);
 
 
-
 /* ************** TEXTURE NODES *************** */
 
 struct TexResult;

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2011-10-19 17:08:35 UTC (rev 41115)
@@ -1962,7 +1962,7 @@
 			if(node->id==(ID *)sce) {
 				SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
 				if(srl && (srl->lay & lay_changed))
-					NodeTagChanged(sce->nodetree, node);
+					nodeUpdate(sce->nodetree, node);
 			}
 		}
 	}

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2011-10-19 17:08:35 UTC (rev 41115)
@@ -1514,7 +1514,7 @@
 		Scene *scene;
 		for(scene= G.main->scene.first; scene; scene= scene->id.next) {
 			if(scene->nodetree) {
-				NodeTagIDChanged(scene->nodetree, &ima->id);
+				nodeUpdateID(scene->nodetree, &ima->id);
 			}
 		}
 	}

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2011-10-19 17:08:35 UTC (rev 41115)
@@ -184,7 +184,7 @@
 	else if (in_out==SOCK_OUT)
 		BLI_addtail(&node->outputs, sock);
 	
-	ntree->update |= NTREE_UPDATE_NODES;
+	node->update |= NODE_UPDATE;
 	
 	return sock;
 }
@@ -197,7 +197,7 @@
 	else if (in_out==SOCK_OUT)
 		BLI_insertlinkbefore(&node->outputs, next_sock, sock);
 	
-	ntree->update |= NTREE_UPDATE_NODES;
+	node->update |= NODE_UPDATE;
 	
 	return sock;
 }
@@ -221,7 +221,7 @@
 		MEM_freeN(sock->default_value);
 	MEM_freeN(sock);
 	
-	ntree->update |= NTREE_UPDATE_NODES;
+	node->update |= NODE_UPDATE;
 }
 
 void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
@@ -246,7 +246,7 @@
 	
 	BLI_freelistN(&node->outputs);
 	
-	ntree->update |= NTREE_UPDATE_NODES;
+	node->update |= NODE_UPDATE;
 }
 
 /* finds a node based on its name */
@@ -823,7 +823,7 @@
 		if(link->fromnode==node) {
 			lb= &node->outputs;
 			if (link->tonode)
-				NodeTagChanged(ntree, link->tonode);
+				link->tonode->update |= NODE_UPDATE;
 		}
 		else if(link->tonode==node)
 			lb= &node->inputs;
@@ -1495,18 +1495,19 @@
 		/* update individual nodes */
 		for (n=0; n < totnodes; ++n) {
 			node = deplist[n];
-			if (ntreetype->update_node)
-				ntreetype->update_node(ntree, node);
-			else if (node->typeinfo->updatefunc)
-				node->typeinfo->updatefunc(ntree, node);
+			
+			/* node tree update tags override individual node update flags */
+			if ((node->update & NODE_UPDATE) || (ntree->update & NTREE_UPDATE)) {
+				if (ntreetype->update_node)
+					ntreetype->update_node(ntree, node);
+				else if (node->typeinfo->updatefunc)
+					node->typeinfo->updatefunc(ntree, node);
+			}
+			/* clear update flag */
+			node->update = 0;
 		}
 		
 		MEM_freeN(deplist);
-		
-		/* ensures only a single output node is enabled, texnode allows multiple though */
-		if(ntree->type!=NTREE_TEXTURE)
-			ntreeSetOutput(ntree);
-		
 	}
 	
 	/* general tree updates */
@@ -1518,6 +1519,9 @@
 	if (ntreetype->update)
 		ntreetype->update(ntree);
 	else {
+		/* Trees can be associated with a specific node type (i.e. group nodes),
+		 * in that case a tree update function may be defined by that node type.
+		 */
 		bNodeType *ntype= node_get_type(ntree, ntree->nodetype);
 		if (ntype && ntype->updatetreefunc)
 			ntype->updatetreefunc(ntree);
@@ -1530,24 +1534,24 @@
 	ntree->update = 0;
 }
 
-void NodeTagChanged(bNodeTree *ntree, bNode *node)
+void nodeUpdate(bNodeTree *ntree, bNode *node)
 {
-	bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
+	bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
 	
-	/* extra null pointer checks here because this is called when unlinking
-	   unknown nodes on file load, so typeinfo pointers may not be set */
-	if (ntreetype && ntreetype->update_node)
+	if (ntreetype->update_node)
 		ntreetype->update_node(ntree, node);
-	else if (node->typeinfo && node->typeinfo->updatefunc)
+	else if (node->typeinfo->updatefunc)
 		node->typeinfo->updatefunc(ntree, node);
+	/* clear update flag */
+	node->update = 0;
 }
 
-int NodeTagIDChanged(bNodeTree *ntree, ID *id)
+int nodeUpdateID(bNodeTree *ntree, ID *id)
 {
 	bNodeTreeType *ntreetype;
 	bNode *node;
 	int change = FALSE;
-
+	
 	if(ELEM(NULL, id, ntree))
 		return change;
 	
@@ -1558,6 +1562,8 @@
 			if(node->id==id) {
 				change = TRUE;
 				ntreetype->update_node(ntree, node);
+				/* clear update flag */
+				node->update = 0;
 			}
 		}
 	}
@@ -1567,6 +1573,8 @@
 				change = TRUE;
 				if (node->typeinfo->updatefunc)
 					node->typeinfo->updatefunc(ntree, node);
+				/* clear update flag */
+				node->update = 0;
 			}
 		}
 	}

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2011-10-19 17:08:35 UTC (rev 41115)
@@ -398,13 +398,13 @@
 		ED_update_for_newframe(G.main, rj->scene, rj->win->screen, 1);
 	
 	/* XXX above function sets all tags in nodes */
-	ntreeClearTags(rj->scene->nodetree);
+	ntreeCompositClearTags(rj->scene->nodetree);
 	
 	/* potentially set by caller */
 	rj->scene->r.scemode &= ~R_NO_FRAME_UPDATE;
 	
 	if(rj->srl) {
-		NodeTagIDChanged(rj->scene->nodetree, &rj->scene->id);
+		nodeUpdateID(rj->scene->nodetree, &rj->scene->id);
 		WM_main_add_notifier(NC_NODE|NA_EDITED, rj->scene);
 	}
 	

Modified: trunk/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_draw.c	2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/editors/space_node/node_draw.c	2011-10-19 17:08:35 UTC (rev 41115)
@@ -102,12 +102,12 @@
 		WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, id);
 	}
 	else if(treetype==NTREE_COMPOSIT) {
-		NodeTagChanged(edittree, node);
+		nodeUpdate(edittree, node);
 		/* don't use NodeTagIDChanged, it gives far too many recomposites for image, scene layers, ... */
 			
 		node= node_tree_get_editgroup(nodetree);
 		if(node)
-			NodeTagIDChanged(nodetree, node->id);
+			nodeUpdateID(nodetree, node->id);
 
 		WM_main_add_notifier(NC_SCENE|ND_NODES, id);
 	}			

Modified: trunk/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_edit.c	2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c	2011-10-19 17:08:35 UTC (rev 41115)
@@ -496,17 +496,17 @@
 	node_tree_from_ID(snode->id, &snode->nodetree, &snode->edittree, NULL);
 }
 
-static void snode_tag_changed(SpaceNode *snode, bNode *node)
+static void snode_update(SpaceNode *snode, bNode *node)
 {
 	bNode *gnode;
 	
 	if (node)
-		NodeTagChanged(snode->edittree, node);
+		nodeUpdate(snode->edittree, node);
 	
 	/* if inside group, tag entire group */
 	gnode= node_tree_get_editgroup(snode->nodetree);
 	if(gnode)
-		NodeTagIDChanged(snode->nodetree, gnode->id);
+		nodeUpdateID(snode->nodetree, gnode->id);
 }
 
 static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
@@ -1775,7 +1775,7 @@
 				link->fromsock= sock;
 			}
 			ntreeUpdateTree(snode->edittree);
-			snode_tag_changed(snode, node);
+			snode_update(snode, node);
 		}
 	}
 }
@@ -2127,7 +2127,7 @@
 				continue;
 			}
 			
-			snode_tag_changed(snode, node_to);
+			snode_update(snode, node_to);
 			++numlinks;
 			break;
 		}
@@ -2175,7 +2175,7 @@
 		if(node->id)
 			id_us_plus(node->id);
 			
-		snode_tag_changed(snode, node);
+		snode_update(snode, node);
 	}
 	
 	if(snode->nodetree->type==NTREE_TEXTURE) {
@@ -2412,7 +2412,7 @@
 		case MIDDLEMOUSE:
 			if(link->tosock && link->fromsock) {
 				/* send changed events for original tonode and new */
-				snode_tag_changed(snode, link->tonode);
+				snode_update(snode, link->tonode);
 				
 				/* we might need to remove a link */
 				if(in_out==SOCK_OUT)
@@ -2495,7 +2495,7 @@
 			if(link) {
 				/* send changed event to original tonode */
 				if(link->tonode) 
-					snode_tag_changed(snode, link->tonode);
+					snode_update(snode, link->tonode);
 				
 				nldrag->node= link->fromnode;
 				nldrag->sock= link->fromsock;
@@ -2663,7 +2663,7 @@
 			next= link->next;
 			
 			if(cut_links_intersect(link, mcoords, i)) {
-				snode_tag_changed(snode, link->tonode);
+				snode_update(snode, link->tonode);
 				nodeRemLink(snode->edittree, link);
 			}
 		}
@@ -2794,7 +2794,7 @@
 		
 		nodeAddLink(snode->edittree, select, socket_best_match(&select->outputs, sockto->type), node, sockto);
 		ntreeUpdateTree(snode->edittree);	/* needed for pointers */
-		snode_tag_changed(snode, select);
+		snode_update(snode, select);
 		ED_node_changed_update(snode->id, select);
 	}
 }
@@ -3198,7 +3198,7 @@
 			/* Be able to mute in-/output nodes as well.  - DingTo

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list