Geometry Nodes: new repeat zone #109164

Merged
Jacques Lucke merged 98 commits from JacquesLucke/blender:serial-loop into main 2023-07-11 22:36:17 +02:00
1 changed files with 43 additions and 19 deletions
Showing only changes of commit 86be601c60 - Show all commits

View File

@ -1752,20 +1752,25 @@ struct GeometryNodesLazyFunctionGraphBuilder {
}
lf::DummyNode &lf_main_output_node = this->build_dummy_node_for_sockets(
"Loop Output", zone.output_node->input_sockets().drop_back(1), {}, lf_body_graph);
for (const int i : zone.output_node->input_sockets().index_range()) {
const bNodeSocket &bsocket = zone.output_node->input_socket(i);
lf::InputSocket &lf_socket = lf_main_output_node.input(i);
graph_params.lf_inputs_by_bsocket.add(&bsocket, &lf_socket);
}
"Loop Output",
zone.output_node->input_sockets().drop_front(2).drop_back(1),
{},
lf_body_graph);
lf::Node &lf_main_input_usage_node = this->build_dummy_node_for_socket_usages(
"Input Usages", zone.input_node->output_sockets().drop_back(1), {}, lf_body_graph);
lf::Node &lf_main_output_usage_node = this->build_dummy_node_for_socket_usages(
"Output Usages", {}, zone.output_node->input_sockets().drop_back(1), lf_body_graph);
for (const int i : zone.output_node->input_sockets().index_range()) {
const bNodeSocket &bsocket = zone.output_node->input_socket(i);
"Output Usages",
{},
zone.output_node->input_sockets().drop_front(2).drop_back(1),
lf_body_graph);
for (const int i : zone.output_node->input_sockets().drop_front(2).drop_back(1).index_range())
{
const bNodeSocket &bsocket = zone.output_node->input_socket(i + 2);
lf::InputSocket &lf_socket = lf_main_output_node.input(i);
lf::OutputSocket &lf_usage = lf_main_output_usage_node.output(i);
graph_params.lf_inputs_by_bsocket.add(&bsocket, &lf_socket);
graph_params.usage_by_bsocket.add(&bsocket, &lf_usage);
}
@ -1774,6 +1779,35 @@ struct GeometryNodesLazyFunctionGraphBuilder {
lf::Node &lf_border_link_usage_node = this->build_border_link_input_usage_node(zone,
lf_body_graph);
LazyFunction &loop_status_fn = scope_.construct<LazyFunctionForSerialLoopStatus>();
lf::Node &lf_loop_status_node = lf_body_graph.add_function(loop_status_fn);
lf::Node &lf_status_output_node = [&]() -> lf::Node & {
auto &debug_info = scope_.construct<lf::SimpleDummyDebugInfo>();
debug_info.name = "Loop Status";
debug_info.input_names.append("Status");
return lf_body_graph.add_dummy({&CPPType::get<lf::SerialLoopStatus>()}, {}, &debug_info);
}();
lf::Node &lf_status_usage_node = [&]() -> lf::Node & {
auto &debug_info = scope_.construct<lf::SimpleDummyDebugInfo>();
debug_info.name = "Status Usage";
debug_info.output_names.append("Usage");
return lf_body_graph.add_dummy({}, {&CPPType::get<bool>()}, &debug_info);
}();
const bNodeSocket &break_before_bsocket = zone.output_node->input_socket(0);
const bNodeSocket &break_after_bsocket = zone.output_node->input_socket(1);
lf::OutputSocket &lf_status_usage = lf_status_usage_node.output(0);
graph_params.usage_by_bsocket.add_new(&break_before_bsocket, &lf_status_usage);
graph_params.usage_by_bsocket.add_new(&break_after_bsocket, &lf_status_usage);
graph_params.lf_inputs_by_bsocket.add(&break_before_bsocket, &lf_loop_status_node.input(0));
graph_params.lf_inputs_by_bsocket.add(&break_after_bsocket, &lf_loop_status_node.input(1));
lf_body_graph.add_link(lf_loop_status_node.output(0), lf_status_output_node.input(0));
this->insert_nodes_and_zones(zone.child_nodes, zone.child_zones, graph_params);
this->build_output_socket_usages(*zone.input_node, graph_params);
@ -1813,16 +1847,6 @@ struct GeometryNodesLazyFunctionGraphBuilder {
lf_attribute_set_by_caller_propagation_index);
this->fix_link_cycles(lf_body_graph, graph_params.socket_usage_inputs);
LazyFunction &loop_status_fn = scope_.construct<LazyFunctionForSerialLoopStatus>();
lf::Node &lf_loop_status_node = lf_body_graph.add_function(loop_status_fn);
lf::Node &lf_status_output_node = [&]() -> lf::Node & {
auto &debug_info = scope_.construct<lf::SimpleDummyDebugInfo>();
debug_info.name = "Loop Status";
debug_info.input_names.append("Status");
return lf_body_graph.add_dummy({&CPPType::get<lf::SerialLoopStatus>()}, {}, &debug_info);
}();
std::cout << "\n\n" << lf_body_graph.to_dot() << "\n\n";
/* TODO */