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:
Jacques Lucke
2025-06-09 08:30:03 +02:00
parent fd2be0026a
commit 101b94fe92

View File

@@ -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);