[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35000] branches/particles-2010/source/ blender: Finished implementation of group and loop nodes.

Lukas Toenne lukas.toenne at googlemail.com
Sun Feb 20 16:43:10 CET 2011


Revision: 35000
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35000
Author:   lukastoenne
Date:     2011-02-20 15:43:08 +0000 (Sun, 20 Feb 2011)
Log Message:
-----------
Finished implementation of group and loop nodes. Groups are shared between tree types, which still requires some minor type switch in the execution callback, but only to avoid code duplication. Also compbuf freeing in nodes is still missing (mem leak).

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/node_edit.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesrna/RNA_access.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/SHD_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/TEX_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/node_common.c
    branches/particles-2010/source/blender/nodes/intern/node_exec.c
    branches/particles-2010/source/blender/nodes/intern/node_exec.h

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-02-20 15:35:01 UTC (rev 34999)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-02-20 15:43:08 UTC (rev 35000)
@@ -48,7 +48,8 @@
 struct bNodeStack;
 struct bNodeTree;
 struct bNodeSocketPanel;
-struct bNodeSocketIsland;
+struct bNodeExec;
+struct bNodeTreeExec;
 struct GPUMaterial;
 struct GPUNode;
 struct GPUNodeStack;
@@ -107,8 +108,6 @@
 	
 	char storagename[64];			/* struct name for DNA */
 	
-	void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
-	
 	/* this line is set on startup of blender */
 	/* basic drawing */
 	void (*drawfunc)(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree, struct bNode *node);
@@ -121,6 +120,8 @@
 	
 	/* called when the node is updated (e.g. linked) in the editor. */
 	void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
+	/* verify when internal ID data has changed */
+	void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id);
 	
 	void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
 	void (*freestoragefunc)(struct bNode *);
@@ -129,6 +130,9 @@
 	
 	int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
 	
+	/* Tree functions: These are called on node trees associated to this node type.
+	 * No actual instance of a node needs to exist!
+	 */
 	void (*inittreefunc)(struct bNodeTree *ntree);
 	void (*updatetreefunc)(struct bNodeTree *ntree);
 	
@@ -138,6 +142,15 @@
 	struct bNodeTree *(*edit_set)(struct bNode *node, int edit);
 	void (*edit_clear)(struct bNode *node);
 	
+	
+	/* **** execution callbacks **** */
+	void *(*initexecfunc)(struct bNode *node);
+	void (*freeexecfunc)(struct bNode *node, void *nodedata);
+	void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
+	/* XXX this alternative exec function has been added to avoid changing all node types.
+	 * when a final generic version of execution code is defined, this will be changed anyway
+	 */
+	void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
 	/* gpu */
 	int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
 } bNodeType;
@@ -192,16 +205,17 @@
 	void (*freeCache)(struct bNodeTree *ntree);
 	void (*freeNodeCache)(struct bNodeTree *ntree, struct bNode *node);
 	void (*foreachNodeTree)(struct Main *main, void *calldata, bNodeTreeCallback func);		/* iteration over all node trees */
-	struct bNodeTreeExec *(*beginExec)(struct bNodeTree *ntree);
-	void (*endExec)(struct bNodeTreeExec *execdata);
-	void (*exec)(struct bNodeTreeExec *execdata, void *callerdata, int thread);
 
-	/* general update function */
+	void (*exec_begin)(struct bNodeTreeExec *exec);
+	void (*exec_end)(struct bNodeTreeExec *exec);
+	void (*exec)(struct bNodeTreeExec *exec, void *callerdata, int thread);
+
+	/* Tree update. Overrides nodetype->updatetreefunc! */
 	void (*update)(struct bNodeTree *ntree);
-	/* called when a node is updated (e.g. linked) in the editor.
-	 * individual node update calls should be made internally if this function is defined! */
+	/* Node update. Overrides nodetype->updatefunc! */
 	void (*updateNode)(struct bNodeTree *ntree, struct bNode *node);
-	int (*verifyLink)(struct bNodeTree *ntree, struct bNodeLink *link);
+	
+	int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
 } bNodeTreeType;
 
 /* enum values for input/output */
@@ -215,7 +229,6 @@
 
 struct bNodeTree *ntreeAddTree(const char *name, int type, int nodetype);
 void			ntreeInitTypes(struct bNodeTree *ntree);
-void			ntreeVerifyTypes(struct bNodeTree *ntree);
 
 void			ntreeFreeTree(struct bNodeTree *ntree);
 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
@@ -226,11 +239,11 @@
 void			ntreeSocketUseFlags(struct bNodeTree *ntree);
 
 void			ntreeUpdateTree(struct bNodeTree *ntree);
+/* XXX Currently each tree update call does call to ntreeVerifyNodes too.
+ * Some day this should be replaced by a decent depsgraph automatism!
+ */
+void			ntreeVerifyNodes(struct Main *main, struct ID *id);
 
-struct bNodeTreeExec *ntreeBeginExecTree(struct bNodeTree *ntree);
-void			ntreeExecTree(struct bNodeTreeExec *execdata, void *callerdata, int thread);
-void			ntreeEndExecTree(struct bNodeTreeExec *execdata);
-
 void			ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
 void			ntreeClearPreview(struct bNodeTree *ntree);
 
@@ -243,8 +256,6 @@
 
 /* ************** GENERIC API, NODES *************** */
 
-void			nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
-
 void			nodeAddToPreview(struct bNode *, float *, int, int);
 
 struct bNode	*nodeAddNode(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
@@ -272,7 +283,7 @@
 void			nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
 
 struct bNode	*nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
-int			nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
+int				nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
 int				nodeFindNodeByPanel(struct bNodeTree *ntree, struct bNodeSocketPanel *panel, struct bNode **nodep, int *panelindex);
 
 
@@ -291,6 +302,12 @@
 
 void			nodeFreePreview(struct bNode *node);
 
+/* ************** EXECUTION *************** */
+
+struct bNodeTreeExec *ntreeBeginExecTree(struct bNodeTree *ntree);
+void			ntreeExecTree(struct bNodeTreeExec *exec, void *callerdata, int thread);
+void			ntreeEndExecTree(struct bNodeTreeExec *exec);
+
 /* ************** NODE TYPE ACCESS *************** */
 
 struct bNodeTemplate nodeMakeTemplate(struct bNode *node);
@@ -310,10 +327,11 @@
 								  const char *storagename,
 								  void (*freestoragefunc)(struct bNode *),
 								  void (*copystoragefunc)(struct bNode *, struct bNode *));
-void			node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **));
-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_update(struct bNodeType *ntype,
+								 void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node),
+								 void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id));
 void			node_type_tree(struct bNodeType *ntype,
 							   void (*inittreefunc)(struct bNodeTree *),
 							   void (*updatetreefunc)(struct bNodeTree *));
@@ -322,6 +340,13 @@
 							   struct bNodeTree *(*edit_set)(struct bNode *node, int edit),
 							   void (*edit_clear)(struct bNode *node));
 
+void			node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **));
+void			node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out));
+void			node_type_exec_new(struct bNodeType *ntype,
+								   void *(*initexecfunc)(struct bNode *node),
+								   void (*freeexecfunc)(struct bNode *node, void *nodedata),
+								   void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **));
+
 /* ************** INTERNAL EDITOR FUNCTIONS *************** */
 
 struct bNodeSocket *node_add_socket(struct bNodeTree *ntree, ListBase *lb, int in_out, const char *name, int type);

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-02-20 15:35:01 UTC (rev 34999)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-02-20 15:43:08 UTC (rev 35000)
@@ -1182,8 +1182,6 @@
 {
 	bNode *node;
 	
-	printf("============================================================\n");
-	
 	if(ntree==NULL) return;
 	
 	for(node= ntree->nodes.first; node; node= node->next)
@@ -1327,7 +1325,7 @@
 
 void ntree_validate_links(bNodeTree *ntree)
 {
-	bNodeTreeType *tti = ntreeGetType(ntree->type);
+	bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
 	bNodeLink *link;
 	
 	for (link = ntree->links.first; link; link = link->next) {
@@ -1336,25 +1334,52 @@
 		if (link->fromsock && link->tosock) {
 			if (link->fromnode && link->tonode && link->fromnode->level <= link->tonode->level)
 				link->flag &= ~NLINK_VALID;
-			else if (tti->verifyLink) {
-				if (!tti->verifyLink(ntree, link))
+			else if (ntreetype->validate_link) {
+				if (!ntreetype->validate_link(ntree, link))
 					link->flag &= ~NLINK_VALID;
 			}
 		}
 	}
 }
 
+static void ntree_verify_nodes_cb(void *calldata, struct ID *UNUSED(owner_id), struct bNodeTree *ntree)
+{
+	ID *id= (ID*)calldata;
+	bNode *node;
+	
+	for (node=ntree->nodes.first; node; node=node->next)
+		if (node->typeinfo->verifyfunc)
+			node->typeinfo->verifyfunc(ntree, node, id);
+}
+
+void ntreeVerifyNodes(struct Main *main, struct ID *id)
+{
+	bNodeTreeType *ntreetype;
+	bNodeTree *ntree;
+	int n;
+	
+	for (n=0; n < NUM_NTREE_TYPES; ++n) {
+		ntreetype= ntreeGetType(n);
+		if (ntreetype && ntreetype->foreachNodeTree)
+			ntreetype->foreachNodeTree(main, id, ntree_verify_nodes_cb);
+	}
+	for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
+		ntree_verify_nodes_cb(id, NULL, ntree);
+}
+
 void ntreeUpdateTree(bNodeTree *ntree)
 {
-	bNodeTreeType *tti= ntreeGetType(ntree->type);
+	bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
 	bNode *node;
 	
+	/* update individual nodes */
 	for (node=ntree->nodes.first; node; node=node->next)
-		if (tti->updateNode)
-			tti->updateNode(ntree, node);
+		if (ntreetype->updateNode)
+			ntreetype->updateNode(ntree, node);
 		else if (node->typeinfo->updatefunc)
 			node->typeinfo->updatefunc(ntree, node);
 	
+	/* general tree updates */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list