41 zone_output_nodes.
extend(
tree.nodes_by_type(zone_type->output_idname));
43 for (
const bNode *node : zone_output_nodes) {
44 auto zone = std::make_unique<bNodeTreeZone>();
46 zone->index = zones.
size();
47 zone->output_node = node;
48 r_zone_by_inout_node.
add(node, zone.get());
52 for (
const bNode *input_node :
tree.nodes_by_type(zone_type->input_idname)) {
53 if (
const bNode *output_node = zone_type->get_corresponding_output(
tree, *input_node)) {
55 zone->input_node = input_node;
56 r_zone_by_inout_node.
add(input_node, zone);
77 const Span<std::unique_ptr<bNodeTreeZone>> all_zones,
83 for (
const std::unique_ptr<bNodeTreeZone> &zone : all_zones) {
84 const int zone_i = zone->index;
85 for (
const bNode *node : {zone->output_node}) {
86 if (node ==
nullptr) {
89 const BoundedBitSpan depend_on_input_flags = depend_on_input_flag_array[node->index()];
91 if (parent_zone_i != zone_i) {
92 all_zone_relations.
add_new({all_zones[parent_zone_i].get(), zone.get()});
98 for (
const ZoneRelation &relation : all_zone_relations) {
99 const ZoneRelation reverse_relation{relation.child, relation.parent};
100 if (all_zone_relations.
contains(reverse_relation)) {
108 for (
const int a : all_zone_relations.
index_range()) {
119 const int transitive_relation_i = all_zone_relations.
index_of_try(transitive_relation);
120 if (transitive_relation_i != -1) {
125 std::sort(transitive_relations.
begin(), transitive_relations.
end(), std::greater<>());
128 for (
const int i : transitive_relations) {
132 return zone_relations;
136 const Span<std::unique_ptr<bNodeTreeZone>> all_zones,
142 bool found_node_in_multiple_zones =
false;
144 const bNode &node = *all_nodes[node_i];
145 const BoundedBitSpan depend_on_input_flags = depend_on_input_flag_array[node_i];
152 if (parent_zone ==
nullptr) {
159 if (iter_zone == parent_zone) {
168 if (iter_zone == zone) {
173 found_node_in_multiple_zones =
true;
175 if (parent_zone ==
nullptr) {
176 if (!zone_by_inout_node.
contains(&node)) {
177 r_node_outside_zones.
append(&node);
185 r_zone_by_node_id.
add_overwrite(item.key->identifier, item.value->index);
187 return found_node_in_multiple_zones;
219 tree.ensure_topology_cache();
220 if (
tree.has_available_link_cycle()) {
227 std::unique_ptr<bNodeTreeZones> tree_zones = std::make_unique<bNodeTreeZones>();
233 const int zones_num = tree_zones->zones.size();
234 const int nodes_num = all_nodes.
size();
241 for (
const bNode *node : sorted_nodes) {
242 const int node_i = node->index();
247 for (
const bNodeSocket *input_socket : node->input_sockets()) {
248 if (!input_socket->is_available()) {
251 for (
const bNodeLink *link : input_socket->directly_linked_links()) {
252 if (link->is_muted()) {
255 const bNode &from_node = *link->fromnode;
256 const int from_node_i = from_node.index();
257 depend_on_input_flags |= depend_on_input_flag_array[from_node_i];
258 depend_on_output_flags |= depend_on_output_flag_array[from_node_i];
261 if (input_types.
contains(node->type)) {
264 depend_on_input_flags[zone->index].set();
267 else if (output_types.
contains(node->type)) {
270 if (
const bNode *zone_input_node = zone->input_node) {
271 const int input_node_i = zone_input_node->index();
272 depend_on_input_flags |= depend_on_input_flag_array[input_node_i];
273 depend_on_output_flags |= depend_on_output_flag_array[input_node_i];
276 depend_on_input_flags[zone->index].reset();
277 depend_on_output_flags[zone->index].set();
288 tree_zones->zones, depend_on_input_flag_array);
289 if (!zone_relations) {
296 relation.parent->child_zones.append(relation.child);
297 BLI_assert(relation.child->parent_zone ==
nullptr);
298 relation.child->parent_zone = relation.parent;
302 for (std::unique_ptr<bNodeTreeZone> &main_zone : tree_zones->zones) {
304 for (
bNodeTreeZone *zone = main_zone.get(); zone; zone = zone->parent_zone) {
305 if (!found_zones.
add(zone)) {
313 for (std::unique_ptr<bNodeTreeZone> &zone : tree_zones->zones) {
317 for (std::unique_ptr<bNodeTreeZone> &zone : tree_zones->zones) {
318 if (zone->depth == 0) {
319 tree_zones->root_zones.append(zone.get());
325 depend_on_input_flag_array,
327 tree_zones->zone_by_node_id,
328 tree_zones->nodes_outside_zones);
329 if (found_node_in_multiple_zones) {
333 for (
const bNode *node :
tree.nodes_by_type(
"NodeGroupOutput")) {
334 if (tree_zones->zone_by_node_id.contains(node->identifier)) {
341 const bNode *node = all_nodes[node_i];
342 const int zone_i = tree_zones->zone_by_node_id.lookup_default(node->
identifier, -1);
350 tree_zones->zones[zone_i]->child_nodes.append(node);
static bool update_zone_per_node(const Span< const bNode * > all_nodes, const Span< std::unique_ptr< bNodeTreeZone > > all_zones, const BitGroupVector<> &depend_on_input_flag_array, const Map< const bNode *, bNodeTreeZone * > &zone_by_inout_node, Map< int, int > &r_zone_by_node_id, Vector< const bNode * > &r_node_outside_zones)