[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44490] trunk/blender/source/blender: Implements a new operator for detaching nodes.

Lukas Toenne lukas.toenne at googlemail.com
Mon Feb 27 18:38:16 CET 2012


Revision: 44490
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44490
Author:   lukastoenne
Date:     2012-02-27 17:38:16 +0000 (Mon, 27 Feb 2012)
Log Message:
-----------
Implements a new operator for detaching nodes. In the process i overhauled the node muting system as well.

There are a number of features that use a kind of "internal linking" in nodes:
1. muting
2. delete + reconnect (restore link to/from node after delete)
3. the new detach operator (same as 2, but don't delete the node)

The desired behavior in all cases is the same: find a sensible mapping of inputs-to-outputs of a node. In the case of muting these links are displayed in red on the node itself. For the other operators they are used to relink connections, such that one gets the best possible ongoing link between previous up- and downstream nodes.

Muting previously used a complicated callback system to ensure consistent behavior in the editor as well as execution in compositor, shader cpu/gpu and texture nodes. This has been greatly simplified by moving the muting step into the node tree localization functions. Any muted node is now bypassed using the generalized nodeInternalRelink function and then removed from the local tree. This way the internal execution system doesn't have to deal with muted nodes at all, as if they are non-existent.

The same function is also used by the delete_reconnect and the new links_detach operators (which work directly in the editor node tree). Detaching nodes is currently keymapped as a translation variant (macro operator): pressing ALTKEY + moving node first detaches and then continues with regular transform operator. The default key is ALT+DKEY though, instead ALT+GKEY, since the latter is already used for the ungroup operator.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/editors/space_node/node_draw.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/editors/space_node/node_intern.h
    trunk/blender/source/blender/editors/space_node/node_ops.c
    trunk/blender/source/blender/editors/transform/transform_ops.c
    trunk/blender/source/blender/gpu/GPU_material.h
    trunk/blender/source/blender/gpu/intern/gpu_codegen.c
    trunk/blender/source/blender/gpu/intern/gpu_shader_material.glsl
    trunk/blender/source/blender/gpu/intern/gpu_shader_material.glsl.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/node_composite_util.c
    trunk/blender/source/blender/nodes/composite/node_composite_util.h
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_composite.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_outputFile.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_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/node_shader_util.c
    trunk/blender/source/blender/nodes/shader/node_shader_util.h
    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/node_texture_util.c
    trunk/blender/source/blender/nodes/texture/node_texture_util.h
    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-02-27 16:45:48 UTC (rev 44489)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2012-02-27 17:38:16 UTC (rev 44490)
@@ -180,6 +180,10 @@
 	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);
 	
 	/* **** execution callbacks **** */
 	void *(*initexecfunc)(struct bNode *node);
@@ -189,24 +193,10 @@
 	 * 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 **);
-	/* This is the muting callback.
-	 * XXX Mimics the newexecfunc signature... Not sure all of this will be useful, we will see.
-	 */
-	void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
-	/* And the muting util.
-	 * Returns links as a ListBase, as pairs of bNodeStack* if in/out bNodeStacks were provided,
-	 * else as pairs of bNodeSocket* if node tree was provided.
-	 */
-	ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **, struct bNodeStack **,
-	                          struct GPUNodeStack *, struct GPUNodeStack *);
 	/* gpu */
 	int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
 	/* extended gpu function */
 	int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out);
-	/* This is the muting gpu callback.
-	 * XXX Mimics the gpuextfunc signature... Not sure all of this will be useful, we will see.
-	 */
-	int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *, struct GPUNodeStack *, struct GPUNodeStack *);
 } bNodeType;
 
 /* node->exec, now in use for composites (#define for break is same as ready yes) */
@@ -284,12 +274,8 @@
 	
 	int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
 
-	/* Default muting pointers. */
-	void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
-	ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **, struct bNodeStack **,
-	                          struct GPUNodeStack *, struct GPUNodeStack *);
-	/* gpu */
-	int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *, struct GPUNodeStack *, struct GPUNodeStack *);
+	/* Default internal linking. */
+	ListBase (*internal_connect)(struct bNodeTree *, struct bNode *node);
 } bNodeTreeType;
 
 /* ************** GENERIC API, TREES *************** */
@@ -353,6 +339,7 @@
 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
 void			nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
 void			nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
+void			nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
 
 void			nodeSpaceCoords(struct bNode *node, float *locx, float *locy);
 void			nodeAttachNode(struct bNode *node, struct bNode *parent);
@@ -418,18 +405,12 @@
 								   void (*freeexecfunc)(struct bNode *node, void *nodedata),
 								   void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata,
 								                       struct bNodeStack **, struct bNodeStack **));
-void			node_type_mute(struct bNodeType *ntype,
-                               void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata,
-                                                struct bNodeStack **, struct bNodeStack **),
-                               ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **,
-                                                         struct bNodeStack **, struct GPUNodeStack*, struct GPUNodeStack*));
+void			node_type_internal_connect(struct bNodeType *ntype, ListBase (*internal_connect)(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,
                                                                              void *nodedata, struct GPUNodeStack *in,
                                                                              struct GPUNodeStack *out));
-void			node_type_gpu_mute(struct bNodeType *ntype, int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *,
-                                                                               struct GPUNodeStack *, struct GPUNodeStack *));
 void			node_type_compatibility(struct bNodeType *ntype, short compatibility);
 
 /* ************** COMMON NODES *************** */

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2012-02-27 16:45:48 UTC (rev 44489)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2012-02-27 17:38:16 UTC (rev 44490)
@@ -542,6 +542,55 @@
 	ntree->update |= NTREE_UPDATE_LINKS;
 }
 
+void nodeInternalRelink(bNodeTree *ntree, bNode *node)
+{
+	bNodeLink *link, *link_next;
+	ListBase intlinks;
+	
+	if (!node->typeinfo->internal_connect)
+		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)
+		link->tosock->link = link;
+	
+	/* redirect downstream links */
+	for (link=ntree->links.first; link; link=link_next) {
+		link_next = link->next;
+		
+		/* do we have internal link? */
+		if (link->fromnode==node) {
+			if (link->fromsock->link) {
+				/* get the upstream input link */
+				bNodeLink *fromlink = link->fromsock->link->fromsock->link;
+				/* skip the node */
+				if (fromlink) {
+					link->fromnode = fromlink->fromnode;
+					link->fromsock = fromlink->fromsock;
+					
+					ntree->update |= NTREE_UPDATE_LINKS;
+				}
+				else
+					nodeRemLink(ntree, link);
+			}
+			else
+				nodeRemLink(ntree, link);
+		}
+	}
+	
+	/* remove remaining upstream links */
+	for (link=ntree->links.first; link; link=link_next) {
+		link_next = link->next;
+		
+		if (link->tonode==node)
+			nodeRemLink(ntree, link);
+	}
+	
+	BLI_freelistN(&intlinks);
+}
+
 /* transforms node location to area coords */
 void nodeSpaceCoords(bNode *node, float *locx, float *locy)
 {
@@ -1633,11 +1682,8 @@
 	ntype->flag = flag;
 
 	/* Default muting stuff. */
-	if(ttype) {
-		ntype->mutefunc      = ttype->mutefunc;
-		ntype->mutelinksfunc = ttype->mutelinksfunc;
-		ntype->gpumutefunc   = ttype->gpumutefunc;
-	}
+	if(ttype)
+		ntype->internal_connect = ttype->internal_connect;
 
 	/* default size values */
 	ntype->width = 140;
@@ -1733,14 +1779,9 @@
 	ntype->newexecfunc = newexecfunc;
 }
 
-void node_type_mute(struct bNodeType *ntype,
-                    void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata,
-                                     struct bNodeStack **, struct bNodeStack **),
-                    ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **, struct bNodeStack **,
-                                              struct GPUNodeStack *, struct GPUNodeStack *))
+void node_type_internal_connect(bNodeType *ntype, ListBase (*internal_connect)(bNodeTree *, bNode *))
 {
-	ntype->mutefunc = mutefunc;
-	ntype->mutelinksfunc = mutelinksfunc;
+	ntype->internal_connect = internal_connect;
 }
 
 void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out))
@@ -1753,12 +1794,6 @@
 	ntype->gpuextfunc = gpuextfunc;
 }
 
-void node_type_gpu_mute(struct bNodeType *ntype, int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *,
-                                                                    struct GPUNodeStack *, struct GPUNodeStack *))
-{
-	ntype->gpumutefunc = gpumutefunc;
-}
-
 void node_type_compatibility(struct bNodeType *ntype, short compatibility)
 {
 	ntype->compatibility = compatibility;

Modified: trunk/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_draw.c	2012-02-27 16:45:48 UTC (rev 44489)
+++ trunk/blender/source/blender/editors/space_node/node_draw.c	2012-02-27 17:38:16 UTC (rev 44490)
@@ -432,30 +432,19 @@
 static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
 {
 	ListBase links;
-	LinkInOutsMuteNode *lnk;
-	bNodeLink link= {NULL};
-	int i;
+	bNodeLink *link;
 
-	if(node->typeinfo->mutelinksfunc == NULL)
+	if(node->typeinfo->internal_connect == NULL)
 		return;
 
-	/* Get default muting links (as bNodeSocket pointers). */
-	links = node->typeinfo->mutelinksfunc(snode->edittree, node, NULL, NULL, NULL, NULL);
+	/* Get default muting links. */
+	links = node->typeinfo->internal_connect(snode->edittree, node);
 
 	glEnable(GL_BLEND);
 	glEnable(GL_LINE_SMOOTH);
 
-	link.fromnode = link.tonode = node;
-	for(lnk = links.first; lnk; lnk = lnk->next) {
-		for(i = 0; i < lnk->num_outs; i++) {
-			link.fromsock = (bNodeSocket*)(lnk->in);
-			link.tosock   = (bNodeSocket*)(lnk->outs)+i;
-			node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
-		}
-		/* If num_outs > 1, lnk->outs was an allocated table of pointers... */
-		if(i > 1)
-			MEM_freeN(lnk->outs);
-	}
+	for(link = 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);

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