Fix #116885: Index Switch node assert fails when removing all items
`set_default_remaining_node_outputs` didn't work because the mapping between the original node group sockets and the lazy function outputs wasn't set up during the construction of the node type, as done by the bake node and others.
This commit is contained in:
@@ -394,7 +394,8 @@ std::unique_ptr<LazyFunction> get_simulation_input_lazy_function(
|
||||
const bNode &node,
|
||||
GeometryNodesLazyFunctionGraphInfo &own_lf_graph_info);
|
||||
std::unique_ptr<LazyFunction> get_switch_node_lazy_function(const bNode &node);
|
||||
std::unique_ptr<LazyFunction> get_index_switch_node_lazy_function(const bNode &node);
|
||||
std::unique_ptr<LazyFunction> get_index_switch_node_lazy_function(
|
||||
const bNode &node, GeometryNodesLazyFunctionGraphInfo &lf_graph_info);
|
||||
std::unique_ptr<LazyFunction> get_bake_lazy_function(
|
||||
const bNode &node, GeometryNodesLazyFunctionGraphInfo &own_lf_graph_info);
|
||||
|
||||
|
||||
@@ -179,23 +179,32 @@ class LazyFunctionForIndexSwitchNode : public LazyFunction {
|
||||
const CPPType *field_base_type_;
|
||||
|
||||
public:
|
||||
LazyFunctionForIndexSwitchNode(const bNode &node) : node_(node)
|
||||
LazyFunctionForIndexSwitchNode(const bNode &node,
|
||||
GeometryNodesLazyFunctionGraphInfo &lf_graph_info)
|
||||
: node_(node)
|
||||
{
|
||||
const NodeIndexSwitch &storage = node_storage(node);
|
||||
const eNodeSocketDatatype data_type = eNodeSocketDatatype(storage.data_type);
|
||||
can_be_field_ = socket_type_supports_fields(data_type);
|
||||
|
||||
const bNodeSocket &index_socket = node.input_socket(0);
|
||||
const bNodeSocket &output_socket = node.output_socket(0);
|
||||
const CPPType &cpp_type = *output_socket.typeinfo->geometry_nodes_cpp_type;
|
||||
field_base_type_ = output_socket.typeinfo->base_cpp_type;
|
||||
|
||||
debug_name_ = node.name;
|
||||
inputs_.append_as("Index", CPPType::get<SocketValueVariant>(), lf::ValueUsage::Used);
|
||||
can_be_field_ = socket_type_supports_fields(data_type);
|
||||
field_base_type_ = output_socket.typeinfo->base_cpp_type;
|
||||
|
||||
MutableSpan<int> lf_index_by_bsocket = lf_graph_info.mapping.lf_index_by_bsocket;
|
||||
|
||||
lf_index_by_bsocket[index_socket.index_in_tree()] = inputs_.append_and_get_index_as(
|
||||
"Index", CPPType::get<SocketValueVariant>(), lf::ValueUsage::Used);
|
||||
lf_index_by_bsocket[output_socket.index_in_tree()] = outputs_.append_and_get_index_as(
|
||||
"Value", cpp_type);
|
||||
|
||||
for (const int i : storage.items_span().index_range()) {
|
||||
const bNodeSocket &input = node.input_socket(value_inputs_start + i);
|
||||
inputs_.append_as(input.identifier, cpp_type, lf::ValueUsage::Maybe);
|
||||
lf_index_by_bsocket[input.index_in_tree()] = inputs_.append_and_get_index_as(
|
||||
input.identifier, cpp_type, lf::ValueUsage::Maybe);
|
||||
}
|
||||
outputs_.append_as("Value", cpp_type);
|
||||
}
|
||||
|
||||
void execute_impl(lf::Params ¶ms, const lf::Context & /*context*/) const override
|
||||
@@ -342,11 +351,12 @@ NOD_REGISTER_NODE(register_node)
|
||||
|
||||
namespace blender::nodes {
|
||||
|
||||
std::unique_ptr<LazyFunction> get_index_switch_node_lazy_function(const bNode &node)
|
||||
std::unique_ptr<LazyFunction> get_index_switch_node_lazy_function(
|
||||
const bNode &node, GeometryNodesLazyFunctionGraphInfo &lf_graph_info)
|
||||
{
|
||||
using namespace node_geo_index_switch_cc;
|
||||
BLI_assert(node.type == GEO_NODE_INDEX_SWITCH);
|
||||
return std::make_unique<LazyFunctionForIndexSwitchNode>(node);
|
||||
return std::make_unique<LazyFunctionForIndexSwitchNode>(node, lf_graph_info);
|
||||
}
|
||||
|
||||
} // namespace blender::nodes
|
||||
|
||||
@@ -3663,7 +3663,8 @@ struct GeometryNodesLazyFunctionBuilder {
|
||||
|
||||
void build_index_switch_node(const bNode &bnode, BuildGraphParams &graph_params)
|
||||
{
|
||||
std::unique_ptr<LazyFunction> lazy_function = get_index_switch_node_lazy_function(bnode);
|
||||
std::unique_ptr<LazyFunction> lazy_function = get_index_switch_node_lazy_function(
|
||||
bnode, *lf_graph_info_);
|
||||
lf::FunctionNode &lf_node = graph_params.lf_graph.add_function(*lazy_function);
|
||||
scope_.add(std::move(lazy_function));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user