Fix #140017: creating a node group from Bake node crashes
Extension sockets were not handled correctly. Those are not exposed in the group.
This commit is contained in:
@@ -1238,6 +1238,8 @@ struct WrapperNodeGroupMapping {
|
||||
int num_outputs = 0;
|
||||
Map<const bNodeSocket *, int> new_index_by_src_socket;
|
||||
Map<int, int> new_by_old_panel_identifier;
|
||||
Vector<int> exposed_input_indices;
|
||||
Vector<int> exposed_output_indices;
|
||||
|
||||
bNodeSocket *get_new_input(const bNodeSocket *old_socket, bNode &new_node) const
|
||||
{
|
||||
@@ -1272,12 +1274,17 @@ static void add_node_group_interface_from_declaration_recursive(
|
||||
}
|
||||
bNodeTreeInterfaceSocket *io_socket = bke::node_interface::add_interface_socket_from_node(
|
||||
group, src_node, socket);
|
||||
if (!io_socket) {
|
||||
return;
|
||||
}
|
||||
group.tree_interface.move_item_to_parent(io_socket->item, parent, INT32_MAX);
|
||||
if (socket.is_input()) {
|
||||
r_mapping.new_index_by_src_socket.add_new(&socket, r_mapping.num_inputs++);
|
||||
r_mapping.exposed_input_indices.append(socket.index());
|
||||
}
|
||||
else {
|
||||
r_mapping.new_index_by_src_socket.add_new(&socket, r_mapping.num_outputs++);
|
||||
r_mapping.exposed_output_indices.append(socket.index());
|
||||
}
|
||||
}
|
||||
else if (const nodes::PanelDeclaration *panel_decl =
|
||||
@@ -1343,21 +1350,25 @@ static bNodeTree *node_group_make_wrapper(const bContext &C,
|
||||
|
||||
const Array<bNodeSocket *> group_inputs = input_node.output_sockets().drop_back(1);
|
||||
const Array<bNodeSocket *> group_outputs = output_node.input_sockets().drop_back(1);
|
||||
Vector<bNodeSocket *> inner_inputs = inner_node.input_sockets();
|
||||
Vector<bNodeSocket *> inner_outputs = inner_node.output_sockets();
|
||||
|
||||
/* Some built-in nodes have unavailable sockets, those are not part of the wrapper node group. */
|
||||
inner_inputs.remove_if([&](const bNodeSocket *socket) { return !socket->is_available(); });
|
||||
inner_outputs.remove_if([&](const bNodeSocket *socket) { return !socket->is_available(); });
|
||||
BLI_assert(group_inputs.size() == inner_inputs.size());
|
||||
BLI_assert(inner_outputs.size() == group_outputs.size());
|
||||
const Array<bNodeSocket *> inner_inputs = inner_node.input_sockets();
|
||||
const Array<bNodeSocket *> inner_outputs = inner_node.output_sockets();
|
||||
BLI_assert(group_inputs.size() == r_mapping.exposed_input_indices.size());
|
||||
BLI_assert(group_outputs.size() == r_mapping.exposed_output_indices.size());
|
||||
|
||||
/* Add links. */
|
||||
for (const int i : group_inputs.index_range()) {
|
||||
bke::node_add_link(*dst_group, input_node, *group_inputs[i], inner_node, *inner_inputs[i]);
|
||||
bke::node_add_link(*dst_group,
|
||||
input_node,
|
||||
*group_inputs[i],
|
||||
inner_node,
|
||||
*inner_inputs[r_mapping.exposed_input_indices[i]]);
|
||||
}
|
||||
for (const int i : group_outputs.index_range()) {
|
||||
bke::node_add_link(*dst_group, inner_node, *inner_outputs[i], output_node, *group_outputs[i]);
|
||||
bke::node_add_link(*dst_group,
|
||||
inner_node,
|
||||
*inner_outputs[r_mapping.exposed_output_indices[i]],
|
||||
output_node,
|
||||
*group_outputs[i]);
|
||||
}
|
||||
|
||||
BKE_main_ensure_invariants(bmain, dst_group->id);
|
||||
|
||||
Reference in New Issue
Block a user