[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40003] trunk/blender/source/blender/nodes /composite/node_composite_tree.c: Code for setting/getting/ freeing executable nodes in compositor was still using the plain nodetree-> nodes list, which is not dependency sorted any more.

Lukas Toenne lukas.toenne at googlemail.com
Wed Sep 7 12:26:22 CEST 2011


Revision: 40003
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40003
Author:   lukastoenne
Date:     2011-09-07 10:26:22 +0000 (Wed, 07 Sep 2011)
Log Message:
-----------
Code for setting/getting/freeing executable nodes in compositor was still using the plain nodetree->nodes list, which is not dependency sorted any more. This caused missing updates for viewers and other nodes. Instead this code now uses the execution data generated before, which has a correctly sorted list of bNodeExecData.

Modified Paths:
--------------
    trunk/blender/source/blender/nodes/composite/node_composite_tree.c

Modified: trunk/blender/source/blender/nodes/composite/node_composite_tree.c
===================================================================
--- trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2011-09-07 10:09:24 UTC (rev 40002)
+++ trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2011-09-07 10:26:22 UTC (rev 40003)
@@ -341,24 +341,26 @@
 }
 
 /* return total of executable nodes, for timecursor */
-static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd)
+static int setExecutableNodes(bNodeTreeExec *exec, ThreadData *thd)
 {
+	bNodeTree *ntree = exec->nodetree;
 	bNodeStack *nsin[MAX_SOCKET];	/* arbitrary... watch this */
 	bNodeStack *nsout[MAX_SOCKET];	/* arbitrary... watch this */
+	bNodeExec *nodeexec;
 	bNode *node;
 	bNodeSocket *sock;
-	int totnode= 0, group_edit= 0;
+	int n, totnode= 0, group_edit= 0;
 	
-	/* note; do not add a dependency sort here, the stack was created already */
-	
 	/* if we are in group edit, viewer nodes get skipped when group has viewer */
 	for(node= ntree->nodes.first; node; node= node->next)
 		if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
 			if(ntreeHasType((bNodeTree *)node->id, CMP_NODE_VIEWER))
 				group_edit= 1;
 	
-	for(node= ntree->nodes.first; node; node= node->next) {
+	/* NB: using the exec data list here to have valid dependency sort */
+	for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
 		int a;
+		node = nodeexec->node;
 		
 		node_get_stack(node, thd->stack, nsin, nsout);
 		
@@ -422,7 +424,8 @@
 	/* last step: set the stack values for only-value nodes */
 	/* just does all now, compared to a full buffer exec this is nothing */
 	if(totnode) {
-		for(node= ntree->nodes.first; node; node= node->next) {
+		for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+			node = nodeexec->node;
 			if(node->need_exec==0 && node_only_value(node)) {
 				if(node->typeinfo->execfunc) {
 					node_get_stack(node, thd->stack, nsin, nsout);
@@ -436,14 +439,17 @@
 }
 
 /* while executing tree, free buffers from nodes that are not needed anymore */
-static void freeExecutableNode(bNodeTree *ntree, bNodeTreeExec *exec)
+static void freeExecutableNode(bNodeTreeExec *exec)
 {
 	/* node outputs can be freed when:
 	- not a render result or image node
 	- when node outputs go to nodes all being set NODE_FINISHED
 	*/
+	bNodeTree *ntree = exec->nodetree;
+	bNodeExec *nodeexec;
 	bNode *node;
 	bNodeSocket *sock;
+	int n;
 	
 	/* set exec flag for finished nodes that might need freed */
 	for(node= ntree->nodes.first; node; node= node->next) {
@@ -451,8 +457,11 @@
 			if(node->exec & NODE_FINISHED)
 				node->exec |= NODE_FREEBUFS;
 	}
-	/* clear this flag for input links that are not done yet */
-	for(node= ntree->nodes.first; node; node= node->next) {
+	/* clear this flag for input links that are not done yet.
+	 * Using the exec data for valid dependency sort.
+	 */
+	for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+		node = nodeexec->node;
 		if((node->exec & NODE_FINISHED)==0) {
 			for(sock= node->inputs.first; sock; sock= sock->next)
 				if(sock->link)
@@ -551,7 +560,7 @@
 	BLI_srandom(rd->cfra);
 
 	/* sets need_exec tags in nodes */
-	curnode = totnode= setExecutableNodes(ntree, &thdata);
+	curnode = totnode= setExecutableNodes(exec, &thdata);
 
 	BLI_init_threads(&threads, exec_composite_node, rd->threads);
 	
@@ -597,7 +606,7 @@
 					
 					/* freeing unused buffers */
 					if(rd->scemode & R_COMP_FREE)
-						freeExecutableNode(ntree, exec);
+						freeExecutableNode(exec);
 				}
 			}
 			else rendering= 1;




More information about the Bf-blender-cvs mailing list