Cleanup: deduplicate code to create dummy nodes in simulation graph

The same new utility functions can also be used for serial loop zones later on.
This commit is contained in:
Jacques Lucke
2023-06-20 17:07:50 +02:00
parent 4268ac0ed9
commit a6d2bb92ed

View File

@@ -1528,13 +1528,16 @@ struct GeometryNodesLazyFunctionGraphBuilder {
lf::Node *lf_zone_input_node = nullptr;
lf::Node *lf_main_input_usage_node = nullptr;
if (zone.input_node != nullptr) {
lf_zone_input_node = &this->build_simulation_zone_input_node(zone, lf_graph);
lf_main_input_usage_node = &this->build_simulation_zone_input_usage_node(zone, lf_graph);
lf_zone_input_node = &this->build_dummy_node_for_sockets(
"Zone Input", {}, zone.input_node->input_sockets().drop_back(1), lf_graph);
lf_main_input_usage_node = &this->build_dummy_node_for_socket_usages(
"Input Usages", zone.input_node->input_sockets().drop_back(1), {}, lf_graph);
}
lf::Node &lf_border_link_input_node = this->build_zone_border_links_input_node(zone, lf_graph);
lf::Node &lf_zone_output_node = this->build_simulation_zone_output_node(zone, lf_graph);
lf::Node &lf_main_output_usage_node = this->build_simulation_zone_output_usage_node(zone,
lf_graph);
lf::Node &lf_zone_output_node = this->build_dummy_node_for_sockets(
"Zone Output", zone.output_node->output_sockets().drop_back(1), {}, lf_graph);
lf::Node &lf_main_output_usage_node = this->build_dummy_node_for_socket_usages(
"Output Usages", {}, zone.output_node->output_sockets().drop_back(1), lf_graph);
lf::Node &lf_border_link_usage_node = this->build_border_link_input_usage_node(zone, lf_graph);
lf::Node &lf_simulation_usage_node = [&]() -> lf::Node & {
@@ -1640,58 +1643,6 @@ struct GeometryNodesLazyFunctionGraphBuilder {
// std::cout << "\n\n" << lf_graph.to_dot() << "\n\n";
}
lf::DummyNode &build_simulation_zone_input_node(const bNodeTreeZone &zone, lf::Graph &lf_graph)
{
Vector<const CPPType *, 16> zone_input_types;
auto &debug_info = scope_.construct<lf::SimpleDummyDebugInfo>();
debug_info.name = "Zone Input";
for (const bNodeSocket *socket : zone.input_node->input_sockets().drop_back(1)) {
zone_input_types.append(socket->typeinfo->geometry_nodes_cpp_type);
debug_info.output_names.append(socket->identifier);
}
lf::DummyNode &node = lf_graph.add_dummy({}, zone_input_types, &debug_info);
return node;
}
lf::DummyNode &build_simulation_zone_output_node(const bNodeTreeZone &zone, lf::Graph &lf_graph)
{
auto &debug_info = scope_.construct<lf::SimpleDummyDebugInfo>();
debug_info.name = "Zone Output";
Vector<const CPPType *, 16> zone_output_types;
for (const bNodeSocket *socket : zone.output_node->output_sockets().drop_back(1)) {
zone_output_types.append(socket->typeinfo->geometry_nodes_cpp_type);
debug_info.input_names.append(socket->identifier);
}
lf::DummyNode &node = lf_graph.add_dummy(zone_output_types, {}, &debug_info);
return node;
}
lf::DummyNode &build_simulation_zone_input_usage_node(const bNodeTreeZone &zone,
lf::Graph &lf_graph)
{
auto &debug_info = scope_.construct<lf::SimpleDummyDebugInfo>();
debug_info.name = "Input Usages";
Vector<const CPPType *, 16> types;
types.append_n_times(&CPPType::get<bool>(),
zone.input_node->input_sockets().drop_back(1).size());
debug_info.input_names.append_n_times("Usage", types.size());
lf::DummyNode &node = lf_graph.add_dummy(types, {}, &debug_info);
return node;
}
lf::DummyNode &build_simulation_zone_output_usage_node(const bNodeTreeZone &zone,
lf::Graph &lf_graph)
{
auto &debug_info = scope_.construct<lf::SimpleDummyDebugInfo>();
debug_info.name = "Output Usages";
Vector<const CPPType *, 16> types;
types.append_n_times(&CPPType::get<bool>(),
zone.output_node->output_sockets().drop_back(1).size());
debug_info.output_names.append_n_times("Usage", types.size());
lf::DummyNode &node = lf_graph.add_dummy({}, types, &debug_info);
return node;
}
lf::DummyNode &build_zone_border_links_input_node(const bNodeTreeZone &zone, lf::Graph &lf_graph)
{
auto &debug_info = scope_.construct<lf::SimpleDummyDebugInfo>();
@@ -2856,6 +2807,48 @@ struct GeometryNodesLazyFunctionGraphBuilder {
}
}
lf::DummyNode &build_dummy_node_for_sockets(const StringRef name,
const Span<const bNodeSocket *> input_bsockets,
const Span<const bNodeSocket *> output_bsockets,
lf::Graph &lf_graph)
{
auto &debug_info = scope_.construct<lf::SimpleDummyDebugInfo>();
debug_info.name = name;
Vector<const CPPType *, 16> input_types;
Vector<const CPPType *, 16> output_types;
for (const bNodeSocket *bsocket : input_bsockets) {
input_types.append(bsocket->typeinfo->geometry_nodes_cpp_type);
debug_info.input_names.append(bsocket->identifier);
}
for (const bNodeSocket *bsocket : output_bsockets) {
output_types.append(bsocket->typeinfo->geometry_nodes_cpp_type);
debug_info.output_names.append(bsocket->identifier);
}
lf::DummyNode &node = lf_graph.add_dummy(input_types, output_types, &debug_info);
return node;
}
lf::DummyNode &build_dummy_node_for_socket_usages(
const StringRef name,
const Span<const bNodeSocket *> input_bsockets,
const Span<const bNodeSocket *> output_bsockets,
lf::Graph &lf_graph)
{
auto &debug_info = scope_.construct<lf::SimpleDummyDebugInfo>();
debug_info.name = name;
const CPPType &bool_cpp_type = CPPType::get<bool>();
Vector<const CPPType *, 16> input_types(input_bsockets.size(), &bool_cpp_type);
Vector<const CPPType *, 16> output_types(output_bsockets.size(), &bool_cpp_type);
for (const bNodeSocket *bsocket : input_bsockets) {
debug_info.input_names.append(bsocket->identifier);
}
for (const bNodeSocket *bsocket : output_bsockets) {
debug_info.output_names.append(bsocket->identifier);
}
lf::DummyNode &node = lf_graph.add_dummy(input_types, output_types, &debug_info);
return node;
}
struct TypeWithLinks {
const CPPType *type;
Vector<const bNodeLink *> links;