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:
Diffstat (limited to 'source/blender/blenkernel/intern/node.c')
-rw-r--r--source/blender/blenkernel/intern/node.c58
1 files changed, 52 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index c4d54cd6296..fd0edd83c7d 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1082,15 +1082,61 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal)
return nnode;
}
+/* fromsock and tosock can be NULL */
+/* also used via rna api, so we check for proper input output direction */
bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
{
- bNodeLink *link= MEM_callocN(sizeof(bNodeLink), "link");
+ bNodeSocket *sock;
+ bNodeLink *link= NULL;
+ int from= 0, to= 0;
+
+ if(fromsock) {
+ /* test valid input */
+ for(sock= fromnode->outputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= 1; /* OK */
+ else {
+ for(sock= fromnode->inputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= -1; /* OK but flip */
+ }
+ }
+ if(tosock) {
+ for(sock= tonode->inputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= 1; /* OK */
+ else {
+ for(sock= tonode->outputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= -1; /* OK but flip */
+ }
+ }
- BLI_addtail(&ntree->links, link);
- link->fromnode= fromnode;
- link->fromsock= fromsock;
- link->tonode= tonode;
- link->tosock= tosock;
+ /* this allows NULL sockets to work */
+ if(from >= 0 && to >= 0) {
+ link= MEM_callocN(sizeof(bNodeLink), "link");
+ BLI_addtail(&ntree->links, link);
+ link->fromnode= fromnode;
+ link->fromsock= fromsock;
+ link->tonode= tonode;
+ link->tosock= tosock;
+ }
+ else if(from <= 0 && to <= 0) {
+ link= MEM_callocN(sizeof(bNodeLink), "link");
+ BLI_addtail(&ntree->links, link);
+ link->fromnode= tonode;
+ link->fromsock= tosock;
+ link->tonode= fromnode;
+ link->tosock= fromsock;
+ }
return link;
}