[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35563] branches/particles-2010/source/ blender: Fixed tree localization, this now uses callbacks too.

Lukas Toenne lukas.toenne at googlemail.com
Tue Mar 15 23:09:38 CET 2011


Revision: 35563
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35563
Author:   lukastoenne
Date:     2011-03-15 22:09:37 +0000 (Tue, 15 Mar 2011)
Log Message:
-----------
Fixed tree localization, this now uses callbacks too.

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/editors/sculpt_paint/paint_image.c
    branches/particles-2010/source/blender/editors/sculpt_paint/sculpt.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/SHD_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/TEX_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/node_util.c

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-03-15 20:10:32 UTC (rev 35562)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-03-15 22:09:37 UTC (rev 35563)
@@ -216,6 +216,11 @@
 	void (*exec_end)(struct bNodeTreeExec *exec);
 	void (*exec)(struct bNodeTreeExec *exec, void *callerdata, int thread);
 
+	/* calls allowing threaded composite */
+	void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree);
+	void (*local_sync)(struct bNodeTree *localtree, struct bNodeTree *ntree);
+	void (*local_merge)(struct bNodeTree *localtree, struct bNodeTree *ntree);
+
 	/* Tree update. Overrides nodetype->updatetreefunc! */
 	void (*update)(struct bNodeTree *ntree);
 	/* Node update. Overrides nodetype->updatefunc! */
@@ -246,12 +251,14 @@
  */
 void			ntreeVerifyNodes(struct Main *main, struct ID *id);
 
+void			ntreeSetOutput(struct bNodeTree *ntree);
 void			ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
 void			ntreeClearPreview(struct bNodeTree *ntree);
 
 void			ntreeFreeCache(struct bNodeTree *ntree);
-				
-				/* calls allowing threaded composite */
+
+int				ntreeNodeExists(struct bNodeTree *ntree, struct bNode *testnode);
+int				ntreeOutputExists(struct bNode *node, struct bNodeSocket *testsock);
 struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
 void			ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
 void			ntreeLocalMerge(struct bNodeTree *localtree, struct bNodeTree *ntree);

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-03-15 20:10:32 UTC (rev 35562)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-03-15 22:09:37 UTC (rev 35563)
@@ -1006,6 +1006,58 @@
 		treetype->freeCache(ntree);
 }
 
+void ntreeSetOutput(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... */
+}
+
 typedef struct MakeLocalCallData {
 	ID *group_id;
 	ID *new_id;
@@ -1087,7 +1139,114 @@
 	}
 }
 
+int ntreeNodeExists(bNodeTree *ntree, bNode *testnode)
+{
+	bNode *node= ntree->nodes.first;
+	for(; node; node= node->next)
+		if(node==testnode)
+			return 1;
+	return 0;
+}
 
+int ntreeOutputExists(bNode *node, bNodeSocket *testsock)
+{
+	bNodeSocket *sock= node->outputs.first;
+	for(; sock; sock= sock->next)
+		if(sock==testsock)
+			return 1;
+	return 0;
+}
+
+/* returns localized tree for execution in threads */
+bNodeTree *ntreeLocalize(bNodeTree *ntree)
+{
+	bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+
+	bNodeTree *ltree;
+	bNode *node;
+	
+	bAction *action_backup= NULL, *tmpact_backup= NULL;
+	
+	/* Workaround for copying an action on each render!
+	 * set action to NULL so animdata actions dont get copied */
+	AnimData *adt= BKE_animdata_from_id(&ntree->id);
+
+	if(adt) {
+		action_backup= adt->action;
+		tmpact_backup= adt->tmpact;
+
+		adt->action= NULL;
+		adt->tmpact= NULL;
+	}
+
+	/* node copy func */
+	ltree= ntreeCopyTree(ntree);
+
+	if(adt) {
+		AnimData *ladt= BKE_animdata_from_id(&ltree->id);
+
+		adt->action= ladt->action= action_backup;
+		adt->tmpact= ladt->tmpact= tmpact_backup;
+
+		if(action_backup) action_backup->id.us++;
+		if(tmpact_backup) tmpact_backup->id.us++;
+		
+	}
+	/* end animdata uglyness */
+
+	/* ensures only a single output node is enabled */
+	ntreeSetOutput(ntree);
+
+	for(node= ntree->nodes.first; node; node= node->next) {
+		
+		/* store new_node pointer to original */
+		node->new_node->new_node= node;
+		/* ensure new user input gets handled ok */
+		node->need_exec= 0;
+	}
+
+	if (ntreetype->localize)
+		ntreetype->localize(ltree, ntree);
+
+	return ltree;
+}
+
+/* sync local composite with real tree */
+/* local tree is supposed to be running, be careful moving previews! */
+/* is called by jobs manager, outside threads, so it doesnt happen during draw */
+void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
+{
+	bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+
+	if (ntreetype->local_sync)
+		return ntreetype->local_sync(localtree, ntree);
+}
+
+/* merge local tree results back, and free local tree */
+/* we have to assume the editor already changed completely */
+void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
+{
+	bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+	bNode *lnode;
+	
+	/* move over the compbufs and previews */
+	for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+		if(ntreeNodeExists(ntree, lnode->new_node)) {
+			if(lnode->preview && lnode->preview->rect) {
+				nodeFreePreview(lnode->new_node);
+				lnode->new_node->preview= lnode->preview;
+				lnode->preview= NULL;
+			}
+		}
+	}
+
+	if (ntreetype->local_merge)
+		return ntreetype->local_merge(localtree, ntree);
+
+	ntreeFreeTree(localtree);
+	MEM_freeN(localtree);
+}
+
 /* ************ find stuff *************** */
 
 int ntreeHasType(bNodeTree *ntree, int type)

Modified: branches/particles-2010/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- branches/particles-2010/source/blender/editors/sculpt_paint/paint_image.c	2011-03-15 20:10:32 UTC (rev 35562)
+++ branches/particles-2010/source/blender/editors/sculpt_paint/paint_image.c	2011-03-15 22:09:37 UTC (rev 35563)
@@ -60,6 +60,7 @@
 #include "DNA_brush_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_texture_types.h"
@@ -4796,7 +4797,7 @@
 	if(brush) {
 		MTex *mtex= &brush->mtex;
 		if(mtex->tex && mtex->tex->nodetree)
-			ntreeEndExecTree(mtex->tex->nodetree);
+			ntreeEndExecTree(mtex->tex->nodetree->execdata);
 	}	
 }
 

Modified: branches/particles-2010/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- branches/particles-2010/source/blender/editors/sculpt_paint/sculpt.c	2011-03-15 20:10:32 UTC (rev 35562)
+++ branches/particles-2010/source/blender/editors/sculpt_paint/sculpt.c	2011-03-15 22:09:37 UTC (rev 35563)
@@ -48,6 +48,7 @@
 #include "BLI_rand.h"
 
 #include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_brush_types.h"
@@ -3490,7 +3491,7 @@
 	MTex *mtex= &brush->mtex;
 
 	if(mtex->tex && mtex->tex->nodetree)
-		ntreeEndExecTree(mtex->tex->nodetree);
+		ntreeEndExecTree(mtex->tex->nodetree->execdata);
 }
 
 static void sculpt_stroke_done(bContext *C, struct PaintStroke *unused)

Modified: branches/particles-2010/source/blender/nodes/intern/CMP_nodetree.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/CMP_nodetree.c	2011-03-15 20:10:32 UTC (rev 35562)
+++ branches/particles-2010/source/blender/nodes/intern/CMP_nodetree.c	2011-03-15 22:09:37 UTC (rev 35563)
@@ -145,6 +145,82 @@
 		node->typeinfo->updatefunc(ntree, node);
 }
 
+/* local tree then owns all compbufs */
+static void localize(bNodeTree *UNUSED(localtree), bNodeTree *ntree)
+{
+	bNode *node;
+	bNodeSocket *sock;
+	
+	for(node= ntree->nodes.first; node; node= node->next) {
+		/* move over the compbufs */
+		/* right after ntreeCopyTree() oldsock pointers are valid */
+		
+		if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+			if(node->id) {
+				if(node->flag & NODE_DO_OUTPUT)
+					node->new_node->id= (ID *)copy_image((Image *)node->id);
+				else
+					node->new_node->id= NULL;
+			}
+		}
+		
+		for(sock= node->outputs.first; sock; sock= sock->next) {
+			
+			sock->new_sock->ns.data= sock->ns.data;
+			compbuf_set_node(sock->new_sock->ns.data, node->new_node);
+			
+			sock->ns.data= NULL;
+			sock->new_sock->new_sock= sock;
+		}
+	}
+}
+
+static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
+{
+	bNode *lnode;
+	
+	/* move over the compbufs and previews */
+	for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+		if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
+			if(ntreeNodeExists(ntree, lnode->new_node)) {
+				
+				if(lnode->preview && lnode->preview->rect) {
+					nodeFreePreview(lnode->new_node);
+					lnode->new_node->preview= lnode->preview;
+					lnode->preview= NULL;
+				}
+			}
+		}
+	}
+}
+
+static void local_merge(bNodeTree *localtree, bNodeTree *ntree)
+{
+	bNode *lnode;
+	bNodeSocket *lsock;
+	
+	/* move over the compbufs and previews */
+	for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+		if(ntreeNodeExists(ntree, lnode->new_node)) {
+			if(ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+				if(lnode->id && (lnode->flag & NODE_DO_OUTPUT)) {
+					/* image_merge does sanity check for pointers */
+					BKE_image_merge((Image *)lnode->new_node->id, (Image *)lnode->id);
+				}
+			}
+			
+			for(lsock= lnode->outputs.first; lsock; lsock= lsock->next) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list