Python API allowed to make links with input->output reversed.
Now node api checks for this case and flips order.
This commit is contained in:
Ton Roosendaal 2011-01-17 15:16:08 +00:00
parent 9924ade102
commit 4b7930dbbd
2 changed files with 59 additions and 12 deletions

@ -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;
BLI_addtail(&ntree->links, link);
link->fromnode= fromnode;
link->fromsock= fromsock;
link->tonode= tonode;
link->tosock= tosock;
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 */
}
}
/* 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;
}

@ -525,14 +525,15 @@ static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, b
ret= nodeAddLink(ntree, fromnode, in, tonode, out);
NodeTagChanged(ntree, tonode);
if(ret) {
NodeTagChanged(ntree, tonode);
nodeVerifyGroup(ntree); /* update group node socket links*/
nodeVerifyGroup(ntree); /* update group node socket links*/
ntreeSolveOrder(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
ntreeSolveOrder(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
}
return ret;
}