Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2006-12-06 00:33:56 +0300
committerTon Roosendaal <ton@blender.org>2006-12-06 00:33:56 +0300
commit09d3d15f45dfd2685253d5edd49566e2eab5ec4e (patch)
treea721f5784605f39362202f2ccccd95343f29263e
parent5e52bee5a7ba17e31d5195ad59913429a05457d4 (diff)
Node editor: when adding a new node, automatic links are created:
- from all selected nodes - only connections between highest order socket types; so if there's RGBA and Value sockets, only RGBA sockets are connected. This because in these cases the Value sockets usually are for user input. Example: Mix node. Thanks Trip for the hint!
-rw-r--r--source/blender/include/BSE_node.h2
-rw-r--r--source/blender/makesdna/DNA_node_types.h2
-rw-r--r--source/blender/src/editnode.c54
-rw-r--r--source/blender/src/header_node.c12
4 files changed, 68 insertions, 2 deletions
diff --git a/source/blender/include/BSE_node.h b/source/blender/include/BSE_node.h
index ed9276d88be..edd3c7f5542 100644
--- a/source/blender/include/BSE_node.h
+++ b/source/blender/include/BSE_node.h
@@ -79,6 +79,8 @@ int node_has_hidden_sockets(struct bNode *node);
struct bNode *node_add_node(struct SpaceNode *snode, int type, float locx, float locy);
void node_adduplicate(struct SpaceNode *snode);
+void snode_autoconnect(struct SpaceNode *snode, struct bNode *node_to, int flag);
+
/* ************* drawnode.c *************** */
struct SpaceNode;
struct bNodeLink;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 034369f6fe2..6a31dfebf01 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -140,6 +140,8 @@ typedef struct bNode {
#define NODE_ACTIVE_ID 32
#define NODE_DO_OUTPUT 64
#define NODE_GROUP_EDIT 128
+ /* free test flag, undefined */
+#define NODE_TEST 256
typedef struct bNodeLink {
struct bNodeLink *next, *prev;
diff --git a/source/blender/src/editnode.c b/source/blender/src/editnode.c
index 245a4a5339a..11c6cf83705 100644
--- a/source/blender/src/editnode.c
+++ b/source/blender/src/editnode.c
@@ -1380,6 +1380,58 @@ void node_border_select(SpaceNode *snode)
/* ****************** Add *********************** */
+void snode_autoconnect(SpaceNode *snode, bNode *node_to, int flag)
+{
+ bNodeSocket *sock, *sockfrom[8];
+ bNode *node, *nodefrom[8];
+ int totsock= 0, socktype=0;
+
+ if(node_to->inputs.first==NULL)
+ return;
+
+ /* no inputs for node allowed (code it) */
+
+ /* connect first 1 socket type now */
+ for(sock= node_to->inputs.first; sock; sock= sock->next)
+ if(socktype<sock->type)
+ socktype= sock->type;
+
+
+ /* find potential sockets, max 8 should work */
+ for(node= snode->edittree->nodes.first; node; node= node->next) {
+ if((node->flag & flag) && node!=node_to) {
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
+ sockfrom[totsock]= sock;
+ nodefrom[totsock]= node;
+ totsock++;
+ if(totsock>7)
+ break;
+ }
+ }
+ }
+ if(totsock>7)
+ break;
+ }
+
+ /* now just get matching socket types and create links */
+ for(sock= node_to->inputs.first; sock; sock= sock->next) {
+ int a;
+
+ for(a=0; a<totsock; a++) {
+ if(sockfrom[a]) {
+ if(sock->type==sockfrom[a]->type && sock->type==socktype) {
+ nodeAddLink(snode->edittree, nodefrom[a], sockfrom[a], node_to, sock);
+ sockfrom[a]= NULL;
+ break;
+ }
+ }
+ }
+ }
+
+ ntreeSolveOrder(snode->edittree);
+}
+
/* can be called from menus too, but they should do own undopush and redraws */
bNode *node_add_node(SpaceNode *snode, int type, float locx, float locy)
{
@@ -1421,7 +1473,7 @@ bNode *node_add_node(SpaceNode *snode, int type, float locx, float locy)
if(snode->nodetree->type==NTREE_COMPOSIT)
ntreeCompositForceHidden(G.scene->nodetree);
-
+
}
return node;
}
diff --git a/source/blender/src/header_node.c b/source/blender/src/header_node.c
index a29c94cf45d..51629fb0a98 100644
--- a/source/blender/src/header_node.c
+++ b/source/blender/src/header_node.c
@@ -198,13 +198,23 @@ static uiBlock *node_selectmenu(void *arg_unused)
void do_node_addmenu(void *arg, int event)
{
SpaceNode *snode= curarea->spacedata.first;
+ bNode *node;
float locx, locy;
short mval[2];
+ /* store selection in temp test flag */
+ for(node= snode->edittree->nodes.first; node; node= node->next) {
+ if(node->flag & NODE_SELECT) node->flag |= NODE_TEST;
+ else node->flag &= ~NODE_TEST;
+ }
+
getmouseco_areawin(mval);
areamouseco_to_ipoco(G.v2d, mval, &locx, &locy);
- node_add_node(snode, event, locx, locy);
+ node= node_add_node(snode, event, locx, locy);
+ /* uses test flag */
+ snode_autoconnect(snode, node, NODE_TEST);
+
addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
BIF_undo_push("Add Node");