[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34913] branches/particles-2010/source/ blender: Generic updates for node trees.

Lukas Toenne lukas.toenne at googlemail.com
Wed Feb 16 19:29:28 CET 2011


Revision: 34913
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34913
Author:   lukastoenne
Date:     2011-02-16 18:29:26 +0000 (Wed, 16 Feb 2011)
Log Message:
-----------
Generic updates for node trees. Node trees have a separate flag variable "update" now, which can be a generic value (all bits set) or define a specific change (only "links" and "nodes" currently). Actual updates are done by calling ntreeUpdateTree on the changed node tree. By default this will
a) Update the socket link backpointers (for input sockets)
b) Sort nodes by their dependencies
c) Verify links based on cyclic dependencies (and possibly type validity, etc. in future)
Custom behaviour for specific node types can be implement with callbacks in the associated node type. Currently this is used for group and for-loop nodes, which sync all instances of the group/loop in question to the exposed sockets (formerly called "verification").

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/BKE_node.h
    branches/particles-2010/source/blender/blenkernel/intern/node.c
    branches/particles-2010/source/blender/blenloader/intern/readfile.c
    branches/particles-2010/source/blender/editors/space_node/drawnode.c
    branches/particles-2010/source/blender/editors/space_node/node_edit.c
    branches/particles-2010/source/blender/editors/space_node/node_state.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/CMP_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/MOD_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/PAR_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/node_common.c
    branches/particles-2010/source/blender/nodes/intern/node_util.c
    branches/particles-2010/source/blender/nodes/intern/node_util.h

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-02-16 18:04:03 UTC (rev 34912)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-02-16 18:29:26 UTC (rev 34913)
@@ -128,9 +128,9 @@
 	struct bNodeTemplate (*templatefunc)(struct bNode *);
 	
 	int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
-	void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node);
 	
 	void (*inittreefunc)(struct bNodeTree *ntree);
+	void (*updatetreefunc)(struct bNodeTree *ntree);
 	
 	/* group edit callbacks for operators */
 	/* XXX this is going to be changed as required by the UI */
@@ -225,13 +225,7 @@
 void			ntreeSocketUseFlags(struct bNodeTree *ntree);
 
 void			ntreeUpdateTree(struct bNodeTree *ntree);
-void			ntreeUpdateGroupTree(struct bNodeTree *ntree, struct bNodeTree *group);
-void			ntreeUpdateFullTree(struct bNodeTree *ntree);
 
-void			ntreeSolveNodeOrder(struct bNodeTree *ntree);
-void			ntreeSetOutput(struct bNodeTree *ntree);
-void			ntreeValidateLinks(struct bNodeTree *ntree);
-
 struct bNodeTreeExec *ntreeBeginExecTree(struct bNodeTree *ntree);
 void			ntreeExecTree(struct bNodeTreeExec *execdata, void *callerdata, int thread);
 void			ntreeEndExecTree(struct bNodeTreeExec *execdata);
@@ -319,8 +313,9 @@
 void			node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out));
 void			node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *));
 void			node_type_template(struct bNodeType *ntype, struct bNodeTemplate (*templatefunc)(struct bNode *));
-void			node_type_verify(struct bNodeType *ntype, void (*verifyfunc)(struct bNodeTree *, struct bNode *));
-void			node_type_init_tree(struct bNodeType *ntype, void (*inittreefunc)(struct bNodeTree *));
+void			node_type_tree(struct bNodeType *ntype,
+							   void (*inittreefunc)(struct bNodeTree *),
+							   void (*updatetreefunc)(struct bNodeTree *));
 void			node_type_edit(struct bNodeType *ntype,
 							   struct bNodeTree *(*edit_get)(struct bNode *node),
 							   struct bNodeTree *(*edit_set)(struct bNode *node, int edit),
@@ -355,9 +350,7 @@
 struct bNode	*node_group_make_from_selected(struct bNodeTree *ntree);
 int				node_group_ungroup(struct bNodeTree *ntree, struct bNode *gnode);
 
-void			node_group_verify(struct bNodeTree *ngroup);
 
-
 /* For Loop */
 void register_node_type_forloop(ListBase *lb);
 

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-02-16 18:04:03 UTC (rev 34912)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-02-16 18:29:26 UTC (rev 34913)
@@ -157,6 +157,9 @@
 {
 	bNodeSocket *sock = make_socket(ntree, in_out, name, type);
 	BLI_addtail(lb, sock);
+	
+	ntree->update |= NTREE_UPDATE_NODES;
+	
 	return sock;
 }
 
@@ -164,6 +167,9 @@
 {
 	bNodeSocket *sock = make_socket(ntree, in_out, name, type);
 	BLI_insertlinkbefore(lb, next_sock, sock);
+	
+	ntree->update |= NTREE_UPDATE_NODES;
+	
 	return sock;
 }
 
@@ -180,6 +186,8 @@
 	
 	BLI_remlink(lb, sock);
 	MEM_freeN(sock);
+	
+	ntree->update |= NTREE_UPDATE_NODES;
 }
 
 void node_remove_all_sockets(bNodeTree *ntree, bNode *node)
@@ -195,25 +203,8 @@
 	
 	BLI_freelistN(&node->inputs);
 	BLI_freelistN(&node->outputs);
-}
-
-void nodeVerifyType(bNodeTree *ntree, bNode *node)
-{
-	if (node->typeinfo->verifyfunc)
-		node->typeinfo->verifyfunc(ntree, node);
-}
-
-void ntreeVerifyTypes(bNodeTree *ntree)
-{
-	bNode *node;
 	
-	/* if((ntree->init & NTREE_TYPE_INIT)==0) */
-	ntreeInitTypes(ntree);
-
-	/* check inputs and outputs, and remove or insert them */
-	for(node= ntree->nodes.first; node; node= node->next)
-		nodeVerifyType(ntree, node);
-	
+	ntree->update |= NTREE_UPDATE_NODES;
 }
 
 bNodeSocketPanel *nodeFindInputPanel(bNode *node, const char *name)
@@ -498,6 +489,8 @@
 	
 	BLI_addtail(&ntree->nodes, node);
 	
+	ntree->update |= NTREE_UPDATE_NODES;
+	
 	return node;
 }
 
@@ -579,6 +572,8 @@
 	nnode->new_node= NULL;
 	nnode->preview= NULL;
 	
+	ntree->update |= NTREE_UPDATE_NODES;
+	
 	return nnode;
 }
 
@@ -638,6 +633,8 @@
 		link->tosock= fromsock;
 	}
 	
+	ntree->update |= NTREE_UPDATE_LINKS;
+	
 	return link;
 }
 
@@ -649,6 +646,8 @@
 	if(link->tonode)
 		NodeTagChanged(ntree, link->tonode);
 	MEM_freeN(link);
+	
+	ntree->update |= NTREE_UPDATE_LINKS;
 }
 
 void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
@@ -661,6 +660,8 @@
 			nodeRemLink(ntree, link);
 		}
 	}
+	
+	ntree->update |= NTREE_UPDATE_LINKS;
 }
 
 bNodeTree *ntreeAddTree(const char *name, int type, int nodetype)
@@ -949,6 +950,8 @@
 	}
 
 	MEM_freeN(node);
+	
+	ntree->update |= NTREE_UPDATE_NODES;
 }
 
 /* do not free ntree itself here, free_libblock calls this function too */
@@ -1231,35 +1234,6 @@
 
 /* ************** dependency stuff *********** */
 
-/* sets the update flags for all trees containing another updated tree */
-static int set_update_flag_recursive(bNodeTree *ntree)
-{
-	bNode *node;
-	int update = 0;
-	
-	for (node=ntree->nodes.first; node; node = node->next)
-		if (node->type == NODE_GROUP && node->id)
-			update = set_update_flag_recursive((bNodeTree*)node->id);
-	
-	if (update) {
-		ntree->flag |= NTREE_UPDATE;
-	}
-	
-	return ((ntree->flag & NTREE_UPDATE) != 0);
-}
-
-/* sets the update flags for all trees in the hierarchy */
-static void set_all_update_flags_recursive(bNodeTree *ntree)
-{
-	bNode *node;
-	
-	for (node=ntree->nodes.first; node; node = node->next)
-		if (node->type == NODE_GROUP && node->id)
-			set_all_update_flags_recursive((bNodeTree*)node->id);
-	
-	ntree->flag |= NTREE_UPDATE;
-}
-
 /* node is guaranteed to be not checked before */
 static int node_recurs_check(bNode *node, bNode ***nsort)
 {
@@ -1286,63 +1260,9 @@
 	return level;
 }
 
-void ntreeSetOutput(bNodeTree *ntree)
+static void ntree_solve_node_order(bNodeTree *ntree)
 {
-	bNode *node;
-
-	/* find the active outputs, might become tree type dependant handler */
-	for(node= ntree->nodes.first; node; node= node->next) {
-		if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
-			bNode *tnode;
-			int output= 0;
-			
-			/* we need a check for which output node should be tagged like this, below an exception */
-			if(node->type==CMP_NODE_OUTPUT_FILE)
-			   continue;
-			   
-			/* there is more types having output class, each one is checked */
-			for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
-				if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
-					
-					if(ntree->type==NTREE_COMPOSIT) {
-							
-						/* same type, exception for viewer */
-						if(tnode->type==node->type ||
-						   (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
-							ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
-							if(tnode->flag & NODE_DO_OUTPUT) {
-								output++;
-								if(output>1)
-									tnode->flag &= ~NODE_DO_OUTPUT;
-							}
-						}
-					}
-					else {
-						/* same type */
-						if(tnode->type==node->type) {
-							if(tnode->flag & NODE_DO_OUTPUT) {
-								output++;
-								if(output>1)
-									tnode->flag &= ~NODE_DO_OUTPUT;
-							}
-						}
-					}
-				}
-			}
-			if(output==0)
-				node->flag |= NODE_DO_OUTPUT;
-		}
-	}
-	
-	/* here we could recursively set which nodes have to be done,
-		might be different for editor or for "real" use... */
-}
-
-void ntreeSolveNodeOrder(bNodeTree *ntree)
-{
 	bNode *node, **nodesort, **nsort;
-	bNodeSocket *sock;
-	bNodeLink *link;
 	int a, totnode=0;
 	
 	/* set links pointers the input sockets, to find dependencies */
@@ -1350,20 +1270,10 @@
 	for(node= ntree->nodes.first; node; node= node->next) {
 		node->done= 0;
 		totnode++;
-		for(sock= node->inputs.first; sock; sock= sock->next)
-			sock->link= NULL;
 	}
-	/* clear group socket links */
-	for(sock= ntree->outputs.first; sock; sock= sock->next)
-		sock->link= NULL;
 	if(totnode==0)
 		return;
 	
-	for(link= ntree->links.first; link; link= link->next) {
-		if (link->tosock)
-			link->tosock->link= link;
-	}
-	
 	nsort= nodesort= MEM_callocN(totnode*sizeof(void *), "sorted node array");
 	
 	/* recursive check */
@@ -1387,11 +1297,30 @@
 	}
 	
 	MEM_freeN(nodesort);
+}
 
-	ntreeSetOutput(ntree);
+static void ntree_update_link_pointers(bNodeTree *ntree)
+{
+	bNode *node;
+	bNodeSocket *sock;
+	bNodeLink *link;
+	
+	/* first clear data */
+	for(node= ntree->nodes.first; node; node= node->next) {
+		for(sock= node->inputs.first; sock; sock= sock->next)
+			sock->link= NULL;
+	}
+	/* clear group socket links */
+	for(sock= ntree->outputs.first; sock; sock= sock->next)
+		sock->link= NULL;
+
+	for(link= ntree->links.first; link; link= link->next) {
+		if (link->tosock)
+			link->tosock->link= link;
+	}
 }
 
-void ntreeValidateLinks(bNodeTree *ntree)
+void ntree_validate_links(bNodeTree *ntree)
 {
 	bNodeTreeType *tti = ntreeGetType(ntree->type);
 	bNodeLink *link;
@@ -1410,60 +1339,32 @@
 	}
 }
 
-
-static void update_tree_recursive(bNodeTree *ntree)
-{
-	bNode *node;
-	
-	/* update nested trees recursively */
-	for (node=ntree->nodes.first; node; node = node->next) {
-		if (node->type == NODE_GROUP && node->id && (((bNodeTree*)node->id)->flag & NTREE_UPDATE) != 0)
-			update_tree_recursive((bNodeTree*)node->id);
-	}
-	
-	ntreeSolveNodeOrder(ntree);
-
-	ntreeValidateLinks(ntree);
-	
-	ntree->flag &= ~NTREE_UPDATE;
-}
-
 void ntreeUpdateTree(bNodeTree *ntree)
 {
 	bNodeTreeType *tti= ntreeGetType(ntree->type);
-
-	ntree->flag |= NTREE_UPDATE;
-	set_update_flag_recursive(ntree);
+	bNode *node;
 	
-	if (tti->update)
-		tti->update(ntree);
-	else
-		update_tree_recursive(ntree);
-}
-
-void ntreeUpdateGroupTree(bNodeTree *ntree, bNodeTree *group)
-{
-	bNodeTreeType *tti= ntreeGetType(ntree->type);
-
-	group->flag |= NTREE_UPDATE;
-	set_update_flag_recursive(ntree);
+	for (node=ntree->nodes.first; node; node=node->next)
+		if (tti->updateNode)
+			tti->updateNode(ntree, node);
+		else if (node->typeinfo->updatefunc)
+			node->typeinfo->updatefunc(ntree, node);
 	
-	if (tti->update)
-		tti->update(ntree);
-	else
-		update_tree_recursive(ntree);
-}
-
-void ntreeUpdateFullTree(bNodeTree *ntree)
-{
-	bNodeTreeType *tti= ntreeGetType(ntree->type);
-
-	set_all_update_flags_recursive(ntree);
+	if (ntree->update & (NTREE_UPDATE_LINKS|NTREE_UPDATE_NODES)) {
+		ntree_update_link_pointers(ntree);
+		

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list