/* SPDX-FileCopyrightText: 2023 Blender Authors * * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once /** \file * \ingroup bke */ #include #include "DNA_node_types.h" #include "BLI_vector.hh" namespace blender::bke { class bNodeTreeZones; class bNodeTreeZone { public: bNodeTreeZones *owner = nullptr; /** Index of the zone in the array of all zones in a node tree. */ int index = -1; /** Zero for top level zones, one for a nested zone, and so on. */ int depth = -1; /** Input node of the zone. */ const bNode *input_node = nullptr; /** Output node of the zone. */ const bNode *output_node = nullptr; /** Direct parent of the zone. If this is null, this is a top level zone. */ bNodeTreeZone *parent_zone = nullptr; /** Direct children zones. Does not contain recursively nested zones. */ Vector child_zones; /** Direct children nodes excluding nodes that belong to child zones. */ Vector child_nodes; /** * Links that enter the zone through the zone border and carry information. This excludes muted * and unavailable links as well as links that are dangling because they are only connected to a * reroute. */ Vector border_links; bool contains_node_recursively(const bNode &node) const; bool contains_zone_recursively(const bNodeTreeZone &other_zone) const; friend std::ostream &operator<<(std::ostream &stream, const bNodeTreeZone &zone); }; class bNodeTreeZones { public: Vector> zones; Vector root_zones; Vector nodes_outside_zones; /** * Zone index by node. Nodes that are in no zone, are not included. Nodes that are at the border * of a zone (e.g. Simulation Input) are mapped to the zone they create. */ Map zone_by_node_id; /** * Get the deepest zone that a socket is in. Note that the inputs of a Simulation Input node are * in a different zone than its output sockets. */ const bNodeTreeZone *get_zone_by_socket(const bNodeSocket &socket) const; /** * Get the deepest zone that the node is in. Note that the e.g. Simulation Input and Output nodes * are considered to be inside of the zone they create. */ const bNodeTreeZone *get_zone_by_node(const int32_t node_id) const; /** * Get a sorted list of zones that the node is in. First comes the root zone and last the most * nested zone. For nodes that are at the root level, the returned list is empty. */ Vector get_zone_stack_for_node(const int32_t node_id) const; friend std::ostream &operator<<(std::ostream &stream, const bNodeTreeZones &zones); }; const bNodeTreeZones *get_tree_zones(const bNodeTree &tree); } // namespace blender::bke inline const blender::bke::bNodeTreeZones *bNodeTree::zones() const { return blender::bke::get_tree_zones(*this); }