forked from blender/blender
main sync #3
@ -898,28 +898,32 @@ static void displace_links(bNodeTree *ntree, const bNode *node, bNodeLink *inser
|
|||||||
bNodeSocket *replacement_socket = node_find_linkable_socket(*ntree, node, linked_socket);
|
bNodeSocket *replacement_socket = node_find_linkable_socket(*ntree, node, linked_socket);
|
||||||
|
|
||||||
if (linked_socket->is_input()) {
|
if (linked_socket->is_input()) {
|
||||||
if (linked_socket->limit + 1 < nodeSocketLinkLimit(linked_socket)) {
|
BLI_assert(!linked_socket->is_multi_input());
|
||||||
return;
|
ntree->ensure_topology_cache();
|
||||||
}
|
bNodeLink *displaced_link = linked_socket->runtime->directly_linked_links.first();
|
||||||
|
|
||||||
LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) {
|
|
||||||
if (link->tosock == linked_socket) {
|
|
||||||
if (!replacement_socket) {
|
if (!replacement_socket) {
|
||||||
nodeRemLink(ntree, link);
|
nodeRemLink(ntree, displaced_link);
|
||||||
BKE_ntree_update_tag_link_removed(ntree);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
link->tosock = replacement_socket;
|
displaced_link->tosock = replacement_socket;
|
||||||
|
|
||||||
if (replacement_socket->is_multi_input()) {
|
if (replacement_socket->is_multi_input()) {
|
||||||
link->multi_input_socket_index = node_socket_count_links(*ntree, *replacement_socket) -
|
/* Check for duplicate links when linking to multi input sockets. */
|
||||||
1;
|
for (bNodeLink *existing_link : replacement_socket->runtime->directly_linked_links) {
|
||||||
|
if (existing_link->fromsock == displaced_link->fromsock) {
|
||||||
|
nodeRemLink(ntree, displaced_link);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
const int multi_input_index = node_socket_count_links(*ntree, *replacement_socket) - 1;
|
||||||
|
displaced_link->multi_input_socket_index = multi_input_index;
|
||||||
|
}
|
||||||
|
|
||||||
BKE_ntree_update_tag_link_changed(ntree);
|
BKE_ntree_update_tag_link_changed(ntree);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) {
|
LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) {
|
||||||
if (link->fromsock == linked_socket) {
|
if (link->fromsock == linked_socket) {
|
||||||
@ -976,28 +980,45 @@ static void node_remove_existing_links_if_needed(bNodeLinkDrag &nldrag, bNodeTre
|
|||||||
{
|
{
|
||||||
bNodeSocket &linked_socket = *nldrag.hovered_socket;
|
bNodeSocket &linked_socket = *nldrag.hovered_socket;
|
||||||
|
|
||||||
const int link_count = node_socket_count_links(ntree, linked_socket);
|
int link_count = node_socket_count_links(ntree, linked_socket);
|
||||||
const int link_limit = nodeSocketLinkLimit(&linked_socket);
|
const int link_limit = nodeSocketLinkLimit(&linked_socket);
|
||||||
|
Set<bNodeLink *> links_to_remove;
|
||||||
|
|
||||||
if (link_count < link_limit) {
|
ntree.ensure_topology_cache();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* Remove duplicate links first. */
|
||||||
|
for (const bNodeLink dragged_link : nldrag.links) {
|
||||||
if (linked_socket.is_input()) {
|
if (linked_socket.is_input()) {
|
||||||
LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree.links) {
|
for (bNodeLink *link : linked_socket.runtime->directly_linked_links) {
|
||||||
if (link->tosock == &linked_socket) {
|
const bool duplicate_link = link->fromsock == dragged_link.fromsock;
|
||||||
nodeRemLink(&ntree, link);
|
if (duplicate_link) {
|
||||||
return;
|
links_to_remove.add(link);
|
||||||
|
link_count--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree.links) {
|
for (bNodeLink *link : linked_socket.runtime->directly_linked_links) {
|
||||||
if (link->fromsock == &linked_socket) {
|
const bool duplicate_link = link->tosock == dragged_link.tosock;
|
||||||
|
if (duplicate_link) {
|
||||||
|
links_to_remove.add(link);
|
||||||
|
link_count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (bNodeLink *link : linked_socket.runtime->directly_linked_links) {
|
||||||
|
const bool link_limit_exceeded = !(link_count < link_limit);
|
||||||
|
if (link_limit_exceeded) {
|
||||||
|
if (links_to_remove.add(link)) {
|
||||||
|
link_count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (bNodeLink *link : links_to_remove) {
|
||||||
nodeRemLink(&ntree, link);
|
nodeRemLink(&ntree, link);
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user