[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51630] trunk/blender/source/blender: Internal node links are now cached in a per-node list, instead of being generated as a transient list that is returned from the callback and had to be freed by the caller .

Lukas Toenne lukas.toenne at googlemail.com
Thu Oct 25 18:49:07 CEST 2012


Revision: 51630
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51630
Author:   lukastoenne
Date:     2012-10-25 16:49:06 +0000 (Thu, 25 Oct 2012)
Log Message:
-----------
Internal node links are now cached in a per-node list, instead of being generated as a transient list that is returned from the callback and had to be freed by the caller. These internal links are used for muted nodes, disconnect operators and reroute nodes, to effectively replace the node with direct input-to-output links.

Storing this list in the node has the advantage of requiring far fewer calls to the potentially expensive internal_connect callback. This was called on every node redraw ...

Also it will allow Cycles to properly use the internal links for muted nodes, which ensures consistent behavior. The previous method was not applicable in Cycles because transient list return values are not supported well in the RNA and particularly the C++ API implementation.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/compositor/nodes/COM_MuteNode.cpp
    trunk/blender/source/blender/editors/space_node/node_draw.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/nodes/composite/node_composite_tree.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_composite.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_viewer.c
    trunk/blender/source/blender/nodes/intern/node_common.c
    trunk/blender/source/blender/nodes/intern/node_exec.c
    trunk/blender/source/blender/nodes/intern/node_util.c
    trunk/blender/source/blender/nodes/intern/node_util.h
    trunk/blender/source/blender/nodes/shader/node_shader_tree.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_output.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_output_lamp.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_output_material.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_output_world.c
    trunk/blender/source/blender/nodes/texture/node_texture_tree.c
    trunk/blender/source/blender/nodes/texture/nodes/node_texture_output.c
    trunk/blender/source/blender/nodes/texture/nodes/node_texture_viewer.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2012-10-25 15:42:36 UTC (rev 51629)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2012-10-25 16:49:06 UTC (rev 51630)
@@ -193,10 +193,8 @@
 	struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit);
 	void (*group_edit_clear)(struct bNode *node);
 	
-	/* Generate a temporary list of internal links (bNodeLink), for muting and disconnect operators.
-	 * Result must be freed by caller!
-	 */
-	ListBase (*internal_connect)(struct bNodeTree *, struct bNode *node);
+	/* Update the internal links list, for muting and disconnect operators. */
+	void (*update_internal_links)(struct bNodeTree *, struct bNode *node);
 	
 	/* **** execution callbacks **** */
 	void *(*initexecfunc)(struct bNode *node);
@@ -293,7 +291,7 @@
 	int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
 
 	/* Default internal linking. */
-	ListBase (*internal_connect)(struct bNodeTree *, struct bNode *node);
+	void (*update_internal_links)(struct bNodeTree *, struct bNode *node);
 } bNodeTreeType;
 
 /* ************** GENERIC API, TREES *************** */
@@ -389,6 +387,7 @@
 
 void            nodeUpdate(struct bNodeTree *ntree, struct bNode *node);
 int             nodeUpdateID(struct bNodeTree *ntree, struct ID *id);
+void            nodeUpdateInternalLinks(struct bNodeTree *ntree, struct bNode *node);
 
 void            nodeFreePreview(struct bNode *node);
 
@@ -445,7 +444,7 @@
                                    void (*freeexecfunc)(struct bNode *node, void *nodedata),
                                    void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata,
                                                        struct bNodeStack **, struct bNodeStack **));
-void            node_type_internal_connect(struct bNodeType *ntype, ListBase (*internal_connect)(struct bNodeTree *, struct bNode *));
+void            node_type_internal_links(struct bNodeType *ntype, void (*update_internal_links)(struct bNodeTree *, struct bNode *));
 void            node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node,
                                                                       struct GPUNodeStack *in, struct GPUNodeStack *out));
 void            node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node,

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2012-10-25 15:42:36 UTC (rev 51629)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2012-10-25 16:49:06 UTC (rev 51630)
@@ -347,6 +347,7 @@
 {
 	bNode *nnode = MEM_callocN(sizeof(bNode), "dupli node");
 	bNodeSocket *sock, *oldsock;
+	bNodeLink *link, *oldlink;
 
 	*nnode = *node;
 	/* can be called for nodes outside a node tree (e.g. clipboard) */
@@ -386,6 +387,15 @@
 		sock->cache = NULL;
 	}
 	
+	BLI_duplicatelist(&nnode->internal_links, &node->internal_links);
+	oldlink = node->internal_links.first;
+	for (link = nnode->internal_links.first; link; link = link->next, oldlink = oldlink->next) {
+		link->fromnode = nnode;
+		link->tonode = nnode;
+		link->fromsock = link->fromsock->new_sock;
+		link->tosock = link->tosock->new_sock;
+	}
+	
 	/* don't increase node->id users, freenode doesn't decrement either */
 	
 	if (node->typeinfo->copystoragefunc)
@@ -524,15 +534,12 @@
 void nodeInternalRelink(bNodeTree *ntree, bNode *node)
 {
 	bNodeLink *link, *link_next;
-	ListBase intlinks;
 	
-	if (!node->typeinfo->internal_connect)
+	if (node->internal_links.first == NULL)
 		return;
 	
-	intlinks = node->typeinfo->internal_connect(ntree, node);
-	
 	/* store link pointers in output sockets, for efficient lookup */
-	for (link = intlinks.first; link; link = link->next)
+	for (link = node->internal_links.first; link; link = link->next)
 		link->tosock->link = link;
 	
 	/* redirect downstream links */
@@ -566,8 +573,6 @@
 		if (link->tonode == node)
 			nodeRemLink(ntree, link);
 	}
-	
-	BLI_freelistN(&intlinks);
 }
 
 void nodeToView(bNode *node, float x, float y, float *rx, float *ry)
@@ -989,6 +994,8 @@
 		MEM_freeN(sock);
 	}
 
+	BLI_freelistN(&node->internal_links);
+
 	nodeFreePreview(node);
 
 	MEM_freeN(node);
@@ -1817,6 +1824,8 @@
 				ntreetype->update_node(ntree, node);
 			else if (node->typeinfo->updatefunc)
 				node->typeinfo->updatefunc(ntree, node);
+			
+			nodeUpdateInternalLinks(ntree, node);
 		}
 	}
 	
@@ -1854,6 +1863,9 @@
 		ntreetype->update_node(ntree, node);
 	else if (node->typeinfo->updatefunc)
 		node->typeinfo->updatefunc(ntree, node);
+	
+	nodeUpdateInternalLinks(ntree, node);
+	
 	/* clear update flag */
 	node->update = 0;
 }
@@ -1893,10 +1905,22 @@
 		}
 	}
 	
+	for (node = ntree->nodes.first; node; node = node->next) {
+		nodeUpdateInternalLinks(ntree, node);
+	}
+	
 	return change;
 }
 
+void nodeUpdateInternalLinks(bNodeTree *ntree, bNode *node)
+{
+	BLI_freelistN(&node->internal_links);
+	
+	if (node->typeinfo && node->typeinfo->update_internal_links)
+		node->typeinfo->update_internal_links(ntree, node);
+}
 
+
 /* ************* node type access ********** */
 
 int nodeValid(bNodeTree *ntree, bNodeTemplate *ntemp)
@@ -1968,7 +1992,7 @@
 
 	/* Default muting stuff. */
 	if (ttype)
-		ntype->internal_connect = ttype->internal_connect;
+		ntype->update_internal_links = ttype->update_internal_links;
 
 	/* default size values */
 	ntype->width = 140;
@@ -2064,9 +2088,9 @@
 	ntype->newexecfunc = newexecfunc;
 }
 
-void node_type_internal_connect(bNodeType *ntype, ListBase (*internal_connect)(bNodeTree *, bNode *))
+void node_type_internal_links(bNodeType *ntype, void (*update_internal_links)(bNodeTree *, bNode *))
 {
-	ntype->internal_connect = internal_connect;
+	ntype->update_internal_links = update_internal_links;
 }
 
 void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out))

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-10-25 15:42:36 UTC (rev 51629)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-10-25 16:49:06 UTC (rev 51630)
@@ -2413,6 +2413,8 @@
 		link_list(fd, &node->inputs);
 		link_list(fd, &node->outputs);
 		
+		link_list(fd, &node->internal_links);
+		
 		if (node->type == CMP_NODE_MOVIEDISTORTION) {
 			node->storage = newmclipadr(fd, node->storage);
 		}

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2012-10-25 15:42:36 UTC (rev 51629)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2012-10-25 16:49:06 UTC (rev 51630)
@@ -720,8 +720,10 @@
 			write_node_socket(wd, sock);
 		for (sock= node->outputs.first; sock; sock= sock->next)
 			write_node_socket(wd, sock);
-
 		
+		for (link = node->internal_links.first; link; link = link->next)
+			writestruct(wd, DATA, "bNodeLink", 1, link);
+		
 		if (node->storage) {
 			/* could be handlerized at some point, now only 1 exception still */
 			if (ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB))

Modified: trunk/blender/source/blender/compositor/nodes/COM_MuteNode.cpp
===================================================================
--- trunk/blender/source/blender/compositor/nodes/COM_MuteNode.cpp	2012-10-25 15:42:36 UTC (rev 51629)
+++ trunk/blender/source/blender/compositor/nodes/COM_MuteNode.cpp	2012-10-25 16:49:06 UTC (rev 51630)
@@ -108,27 +108,16 @@
 	/* mute node is also used for unknown nodes and couple of nodes in fast mode
 	 * can't use generic routines in that case
 	 */
-	if ((editorNode->flag & NODE_MUTED) && editorNode->typeinfo->internal_connect) {
+	if (editorNode->flag & NODE_MUTED) {
 		vector<InputSocket *> &inputsockets = this->getInputSockets();
 		vector<OutputSocket *> relinkedsockets;
-		bNodeTree *editorTree;
 		SocketMap socketMap;
-		ListBase intlinks;
 		bNodeLink *link;
 
-		if (this->getbNodeGroup()) {
-			editorTree = (bNodeTree *) getbNodeGroup()->id;
-		}
-		else {
-			editorTree = (bNodeTree *) context->getbNodeTree();
-		}
-
-		intlinks = editorNode->typeinfo->internal_connect(editorTree, editorNode);
-
 		this->fillSocketMap<OutputSocket>(outputsockets, socketMap);
 		this->fillSocketMap<InputSocket>(inputsockets, socketMap);
 
-		for (link = (bNodeLink *) intlinks.first; link; link = link->next) {
+		for (link = (bNodeLink *) editorNode->internal_links.first; link; link = link->next) {
 			if (link->fromnode == editorNode) {
 				InputSocket *fromSocket = (InputSocket *) socketMap.find(link->fromsock)->second;
 				OutputSocket *toSocket = (OutputSocket *) socketMap.find(link->tosock)->second;
@@ -170,8 +159,6 @@
 					createDefaultOutput(graph, output);
 			}
 		}
-
-		BLI_freelistN(&intlinks);
 	}
 	else {
 		for (unsigned int index = 0; index < outputsockets.size(); index++) {

Modified: trunk/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_draw.c	2012-10-25 15:42:36 UTC (rev 51629)
+++ trunk/blender/source/blender/editors/space_node/node_draw.c	2012-10-25 16:49:06 UTC (rev 51630)
@@ -506,25 +506,16 @@
 /* note: in node_edit.c is similar code, for untangle node */
 static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
 {
-	ListBase links;
 	bNodeLink *link;
 
-	if (node->typeinfo->internal_connect == NULL)
-		return;
-
-	/* Get default muting links. */
-	links = node->typeinfo->internal_connect(snode->edittree, node);
-
 	glEnable(GL_BLEND);
 	glEnable(GL_LINE_SMOOTH);
 
-	for (link = links.first; link; link = link->next)
+	for (link = node->internal_links.first; link; link = link->next)
 		node_draw_link_bezier(v2d, snode, link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
 
 	glDisable(GL_BLEND);
 	glDisable(GL_LINE_SMOOTH);
-
-	BLI_freelistN(&links);
 }
 
 /* this might have some more generic use */

Modified: trunk/blender/source/blender/editors/space_node/node_edit.c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list