diff --git a/intern/cycles/blender/python.cpp b/intern/cycles/blender/python.cpp index 1e33b0b7207..f732d653a6e 100644 --- a/intern/cycles/blender/python.cpp +++ b/intern/cycles/blender/python.cpp @@ -605,14 +605,12 @@ static PyObject *osl_update_node_func(PyObject * /*self*/, PyObject *args) if (!found_existing) { /* Create new socket. */ - BL::NodeSocket b_sock = (param->isoutput) ? b_node.outputs.create(b_data, - socket_type.c_str(), - param_label.c_str(), - param->name.c_str()) : - b_node.inputs.create(b_data, - socket_type.c_str(), - param_label.c_str(), - param->name.c_str()); + BL::NodeSocket b_sock = + (param->isoutput) ? + b_node.outputs.create( + b_data, socket_type.c_str(), param_label.c_str(), param->name.c_str()) : + b_node.inputs.create( + b_data, socket_type.c_str(), param_label.c_str(), param->name.c_str(), false); /* set default value */ if (data_type == BL::NodeSocket::type_VALUE) { diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 892d523bdcf..292fa432186 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -1432,14 +1432,21 @@ static void rna_NodeTree_active_output_set(PointerRNA *ptr, int value) } } -static bNodeSocket *rna_NodeTree_inputs_new( - bNodeTree *ntree, Main *bmain, ReportList *reports, const char *type, const char *name) +static bNodeSocket *rna_NodeTree_inputs_new(bNodeTree *ntree, + Main *bmain, + ReportList *reports, + const char *type, + const char *name, + bool multi_input) { if (!rna_NodeTree_check(ntree, reports)) { return NULL; } bNodeSocket *sock = ntreeAddSocketInterface(ntree, SOCK_IN, type, name); + if (multi_input) { + sock->flag |= SOCK_MULTI_INPUT; + } if (sock == NULL) { BKE_report(reports, RPT_ERROR, "Unable to create socket"); @@ -2434,7 +2441,8 @@ static bNodeSocket *rna_Node_inputs_new(ID *id, ReportList *reports, const char *type, const char *name, - const char *identifier) + const char *identifier, + bool multi_input) { if (ELEM(node->type, NODE_GROUP_INPUT, NODE_FRAME)) { @@ -2444,7 +2452,7 @@ static bNodeSocket *rna_Node_inputs_new(ID *id, /* Adding an input to a group node is not working, * simpler to add it to its underlying nodetree. */ if (ELEM(node->type, NODE_GROUP, NODE_CUSTOM_GROUP) && node->id != NULL) { - return rna_NodeTree_inputs_new((bNodeTree *)node->id, bmain, reports, type, name); + return rna_NodeTree_inputs_new((bNodeTree *)node->id, bmain, reports, type, name, multi_input); } bNodeTree *ntree = (bNodeTree *)id; @@ -2456,6 +2464,10 @@ static bNodeSocket *rna_Node_inputs_new(ID *id, BKE_report(reports, RPT_ERROR, "Unable to create socket"); } else { + if (multi_input) { + sock->flag |= SOCK_MULTI_INPUT; + } + ED_node_tree_propagate_change(NULL, bmain, ntree); WM_main_add_notifier(NC_NODE | NA_EDITED, ntree); } @@ -12068,6 +12080,13 @@ static void rna_def_node_sockets_api(BlenderRNA *brna, PropertyRNA *cprop, int i parm = RNA_def_string(func, "name", NULL, MAX_NAME, "Name", ""); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); RNA_def_string(func, "identifier", NULL, MAX_NAME, "Identifier", "Unique socket identifier"); + if (in_out == SOCK_IN) { + RNA_def_boolean(func, + "is_multi_input", + false, + "Multi Input", + "Allow the socket to accept multiple ordered input links"); + } /* return value */ parm = RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket"); RNA_def_function_return(func, parm); @@ -12562,6 +12581,13 @@ static void rna_def_node_tree_sockets_api(BlenderRNA *brna, PropertyRNA *cprop, RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); parm = RNA_def_string(func, "name", NULL, MAX_NAME, "Name", ""); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + if (in_out == SOCK_IN) { + RNA_def_boolean(func, + "is_multi_input", + false, + "Multi Input", + "Allow the socket to accept multiple ordered input links"); + } /* return value */ parm = RNA_def_pointer(func, "socket", "NodeSocketInterface", "", "New socket"); RNA_def_function_return(func, parm); diff --git a/source/blender/nodes/intern/node_common.cc b/source/blender/nodes/intern/node_common.cc index 6402ec3f3d6..a29dc986439 100644 --- a/source/blender/nodes/intern/node_common.cc +++ b/source/blender/nodes/intern/node_common.cc @@ -133,7 +133,7 @@ static void update_socket_to_match_interface(bNodeTree &node_tree, { strcpy(socket_to_update.name, interface_socket.name); - const int mask = SOCK_HIDE_VALUE; + const int mask = (SOCK_HIDE_VALUE | SOCK_MULTI_INPUT); socket_to_update.flag = (socket_to_update.flag & ~mask) | (interface_socket.flag & mask); /* Update socket type if necessary */