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) {
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];
149 if (
ELEM(&node, zone->input_node, zone->output_node)) {
152 if (parent_zone ==
nullptr) {
157 iter_zone = iter_zone->parent_zone)
159 if (iter_zone == parent_zone) {
166 iter_zone = 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);
181 r_zone_by_node_id.
add(node.identifier, parent_zone->
index);
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) {
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);
347 if (
ELEM(node, zone.input_node, zone.output_node)) {
350 tree_zones->zones[zone_i]->child_nodes.append(node);
540 stream << zone.index <<
": Parent index: ";
541 if (zone.parent_zone !=
nullptr) {
542 stream << zone.parent_zone->index;
548 stream <<
"; Input: " << (zone.input_node ? zone.input_node->name :
"null");
549 stream <<
", Output: " << (zone.output_node ? zone.output_node->name :
"null");
551 stream <<
"; Border Links: {\n";
552 for (
const bNodeLink *border_link : zone.border_links) {
553 stream <<
" " << border_link->fromnode->name <<
": " << border_link->fromsock->name <<
" -> ";
554 stream << border_link->tonode->name <<
": " << border_link->tosock->name <<
";\n";
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)