Blender V5.0
node_tree_update.cc File Reference
#include <fmt/format.h>
#include "BLI_listbase.h"
#include "BLI_map.hh"
#include "BLI_multi_value_map.hh"
#include "BLI_noise.hh"
#include "BLI_rand.hh"
#include "BLI_set.hh"
#include "BLI_stack.hh"
#include "BLI_string.h"
#include "BLI_string_utf8_symbols.h"
#include "BLI_vector_set.hh"
#include "DNA_anim_types.h"
#include "DNA_modifier_types.h"
#include "DNA_node_types.h"
#include "BKE_anim_data.hh"
#include "BKE_image.hh"
#include "BKE_lib_id.hh"
#include "BKE_library.hh"
#include "BKE_main.hh"
#include "BKE_node.hh"
#include "BKE_node_enum.hh"
#include "BKE_node_legacy_types.hh"
#include "BKE_node_runtime.hh"
#include "BKE_node_tree_reference_lifetimes.hh"
#include "BKE_node_tree_update.hh"
#include "MOD_nodes.hh"
#include "NOD_geo_viewer.hh"
#include "NOD_geometry_nodes_dependencies.hh"
#include "NOD_geometry_nodes_gizmos.hh"
#include "NOD_geometry_nodes_lazy_function.hh"
#include "NOD_node_declaration.hh"
#include "NOD_socket.hh"
#include "NOD_socket_declarations.hh"
#include "NOD_sync_sockets.hh"
#include "NOD_texture.h"
#include "DEG_depsgraph_build.hh"
#include "BLT_translation.hh"

Go to the source code of this file.

Classes

struct  blender::bke::NodeTreeRelations
struct  blender::bke::TreeUpdateResult
class  blender::bke::NodeTreeMainUpdater

Namespaces

namespace  blender
namespace  blender::bke

Typedefs

using blender::bke::TreeNodePair = std::pair<bNodeTree *, bNode *>
using blender::bke::ObjectModifierPair = std::pair<Object *, ModifierData *>
using blender::bke::NodeSocketPair = std::pair<bNode *, bNodeSocket *>

Enumerations

enum  eNodeTreeChangedFlag {
  NTREE_CHANGED_NOTHING = 0 , NTREE_CHANGED_ANY = (1 << 1) , NTREE_CHANGED_NODE_PROPERTY = (1 << 2) , NTREE_CHANGED_NODE_OUTPUT = (1 << 3) ,
  NTREE_CHANGED_LINK = (1 << 4) , NTREE_CHANGED_REMOVED_NODE = (1 << 5) , NTREE_CHANGED_REMOVED_SOCKET = (1 << 6) , NTREE_CHANGED_SOCKET_PROPERTY = (1 << 7) ,
  NTREE_CHANGED_INTERNAL_LINK = (1 << 8) , NTREE_CHANGED_PARENT = (1 << 9) , NTREE_CHANGED_ALL = -1
}

Functions

static void add_tree_tag (bNodeTree *ntree, const eNodeTreeChangedFlag flag)
static void add_node_tag (bNodeTree *ntree, bNode *node, const eNodeTreeChangedFlag flag)
static void add_socket_tag (bNodeTree *ntree, bNodeSocket *socket, const eNodeTreeChangedFlag flag)
static int blender::bke::get_internal_link_type_priority (const bNodeSocketType *from, const bNodeSocketType *to)
static bool blender::bke::is_tree_changed (const bNodeTree &tree)
void BKE_ntree_update_tag_all (bNodeTree *ntree)
void BKE_ntree_update_tag_node_property (bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_node_new (bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_node_type (bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_socket_property (bNodeTree *ntree, bNodeSocket *socket)
void BKE_ntree_update_tag_socket_new (bNodeTree *ntree, bNodeSocket *socket)
void BKE_ntree_update_tag_socket_removed (bNodeTree *ntree)
void BKE_ntree_update_tag_socket_type (bNodeTree *ntree, bNodeSocket *socket)
void BKE_ntree_update_tag_socket_availability (bNodeTree *ntree, bNodeSocket *socket)
void BKE_ntree_update_tag_node_removed (bNodeTree *ntree)
void BKE_ntree_update_tag_node_mute (bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_node_internal_link (bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_link_changed (bNodeTree *ntree)
void BKE_ntree_update_tag_link_removed (bNodeTree *ntree)
void BKE_ntree_update_tag_link_added (bNodeTree *ntree, bNodeLink *)
void BKE_ntree_update_tag_link_mute (bNodeTree *ntree, bNodeLink *)
void BKE_ntree_update_tag_active_output_changed (bNodeTree *ntree)
void BKE_ntree_update_tag_missing_runtime_data (bNodeTree *ntree)
void BKE_ntree_update_tag_parent_change (bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_id_changed (Main *bmain, ID *id)
void BKE_ntree_update_tag_image_user_changed (bNodeTree *ntree, ImageUser *)
bool operator== (const bNestedNodePath &a, const bNestedNodePath &b)
void BKE_ntree_update (Main &bmain, const std::optional< blender::Span< bNodeTree * > > modified_trees, const NodeTreeUpdateExtraParams &params)
void BKE_ntree_update_after_single_tree_change (Main &bmain, bNodeTree &modified_tree, const NodeTreeUpdateExtraParams &params)
void BKE_ntree_update_without_main (bNodeTree &tree)

Variables

static bool is_updating = false

Enumeration Type Documentation

◆ eNodeTreeChangedFlag

These flags are used by the changed_flag field in bNodeTree, bNode and bNodeSocket. This enum is not part of the public API. It should be used through the BKE_ntree_update_tag_* API.

Enumerator
NTREE_CHANGED_NOTHING 
NTREE_CHANGED_ANY 
NTREE_CHANGED_NODE_PROPERTY 
NTREE_CHANGED_NODE_OUTPUT 
NTREE_CHANGED_LINK 
NTREE_CHANGED_REMOVED_NODE 
NTREE_CHANGED_REMOVED_SOCKET 
NTREE_CHANGED_SOCKET_PROPERTY 
NTREE_CHANGED_INTERNAL_LINK 
NTREE_CHANGED_PARENT 
NTREE_CHANGED_ALL 

Definition at line 57 of file node_tree_update.cc.

Function Documentation

◆ add_node_tag()

◆ add_socket_tag()

◆ add_tree_tag()

◆ BKE_ntree_update()

void BKE_ntree_update ( Main & bmain,
const std::optional< blender::Span< bNodeTree * > > modified_trees,
const NodeTreeUpdateExtraParams & params )

◆ BKE_ntree_update_after_single_tree_change()

◆ BKE_ntree_update_tag_active_output_changed()

void BKE_ntree_update_tag_active_output_changed ( bNodeTree * ntree)

Used when the a new output node becomes active and therefore changes the output.

Definition at line 2113 of file node_tree_update.cc.

References add_tree_tag(), and NTREE_CHANGED_ANY.

Referenced by ED_node_set_active(), blender::ed::space_node::viewer_linking::finalize_viewer_link(), and blender::ed::space_node::node_activate_viewer_exec().

◆ BKE_ntree_update_tag_all()

void BKE_ntree_update_tag_all ( bNodeTree * ntree)

Tag tree as changed without providing any more information about what has changed exactly. The update process has to assume that everything may have changed.

Using one of the methods below to tag the tree after changes is preferred when possible.

Definition at line 2033 of file node_tree_update.cc.

References add_tree_tag(), and NTREE_CHANGED_ANY.

Referenced by blo_do_versions_250(), foreach_libblock_remap_callback_apply(), blender::ed::space_node::node_group_separate_selected(), blender::bke::node_tree_update_all_new(), blender::bke::ntree_set_typeinfo(), and paste_material_exec().

◆ BKE_ntree_update_tag_id_changed()

◆ BKE_ntree_update_tag_image_user_changed()

void BKE_ntree_update_tag_image_user_changed ( bNodeTree * ntree,
ImageUser * iuser )

Used when an image user is updated that is used by any part of the node tree.

Definition at line 2141 of file node_tree_update.cc.

References add_tree_tag(), and NTREE_CHANGED_ANY.

◆ BKE_ntree_update_tag_link_added()

◆ BKE_ntree_update_tag_link_changed()

◆ BKE_ntree_update_tag_link_mute()

void BKE_ntree_update_tag_link_mute ( bNodeTree * ntree,
bNodeLink * link )

Definition at line 2108 of file node_tree_update.cc.

References add_tree_tag(), and NTREE_CHANGED_LINK.

Referenced by blender::bke::node_link_set_mute().

◆ BKE_ntree_update_tag_link_removed()

◆ BKE_ntree_update_tag_missing_runtime_data()

void BKE_ntree_update_tag_missing_runtime_data ( bNodeTree * ntree)

Used after file loading when run-time data on the tree has not been initialized yet.

Definition at line 2118 of file node_tree_update.cc.

References add_tree_tag(), and NTREE_CHANGED_ALL.

Referenced by blender::bke::node_tree_blend_read_data().

◆ BKE_ntree_update_tag_node_internal_link()

void BKE_ntree_update_tag_node_internal_link ( bNodeTree * ntree,
bNode * node )

◆ BKE_ntree_update_tag_node_mute()

void BKE_ntree_update_tag_node_mute ( bNodeTree * ntree,
bNode * node )

◆ BKE_ntree_update_tag_node_new()

◆ BKE_ntree_update_tag_node_property()

void BKE_ntree_update_tag_node_property ( bNodeTree * ntree,
bNode * node )

More specialized tag functions that may result in a more efficient update.

Definition at line 2038 of file node_tree_update.cc.

References add_node_tag(), and NTREE_CHANGED_NODE_PROPERTY.

Referenced by blender::ed::space_node::add_node_group_asset(), blender::ed::space_node::attribute_search_exec_fn(), BLO_update_defaults_startup_blend(), blender::ed::space_node::connect_nested_node_to_node(), blender::ed::space_node::node_add_group_exec(), blender::ed::space_node::node_add_image_exec(), blender::ed::space_node::node_deactivate_viewer_exec(), blender::ed::space_node::node_flag_toggle_exec(), blender::ed::space_node::node_group_make_from_node_declaration(), blender::ed::space_node::node_link_init(), blender::ed::space_node::node_link_item_apply(), blender::ed::space_node::node_property_update_default(), blender::ed::space_node::node_socket_add_replace(), blender::ed::space_node::node_socket_disconnect(), blender::ed::space_node::node_socket_remove(), blender::ed::space_node::node_swap_group_asset_invoke(), blender::bke::node_tree_update_all_users(), ntreeCompositTagRender(), blender::ed::space_node::pick_link(), blender::ed::space_node::search_link_ops_for_asset_metadata(), blender::nodes::sync_sockets_closure(), blender::nodes::sync_sockets_combine_bundle(), blender::nodes::sync_sockets_evaluate_closure(), blender::nodes::sync_sockets_separate_bundle(), blender::nodes::socket_items::try_add_item_via_extend_socket(), and blender::nodes::socket_items::ops::update_after_node_change().

◆ BKE_ntree_update_tag_node_removed()

void BKE_ntree_update_tag_node_removed ( bNodeTree * ntree)

◆ BKE_ntree_update_tag_node_type()

void BKE_ntree_update_tag_node_type ( bNodeTree * ntree,
bNode * node )

Definition at line 2048 of file node_tree_update.cc.

References add_node_tag(), and NTREE_CHANGED_NODE_PROPERTY.

Referenced by blender::bke::node_set_typeinfo().

◆ BKE_ntree_update_tag_parent_change()

void BKE_ntree_update_tag_parent_change ( bNodeTree * ntree,
bNode * node )

Used when change parent node.

Definition at line 2123 of file node_tree_update.cc.

References add_node_tag(), and NTREE_CHANGED_PARENT.

Referenced by blender::bke::node_attach_node(), and blender::bke::node_detach_node().

◆ BKE_ntree_update_tag_socket_availability()

void BKE_ntree_update_tag_socket_availability ( bNodeTree * ntree,
bNodeSocket * socket )

◆ BKE_ntree_update_tag_socket_new()

◆ BKE_ntree_update_tag_socket_property()

◆ BKE_ntree_update_tag_socket_removed()

void BKE_ntree_update_tag_socket_removed ( bNodeTree * ntree)

◆ BKE_ntree_update_tag_socket_type()

void BKE_ntree_update_tag_socket_type ( bNodeTree * ntree,
bNodeSocket * socket )

◆ BKE_ntree_update_without_main()

void BKE_ntree_update_without_main ( bNodeTree & tree)

Can be used to update trees locally, without affecting other trees. For example, when building a temporary node tree that is not in bmain.

Definition at line 2192 of file node_tree_update.cc.

References BLI_assert, ID_TAG_NO_MAIN, is_updating, params, tree, and blender::bke::NodeTreeMainUpdater::update_rooted().

Referenced by ntree_shader_implicit_closure_cast(), ntree_shader_pruned_unused(), ntree_shader_shader_to_rgba_branches(), and ntree_shader_weight_tree_invert().

◆ operator==()

bool operator== ( const bNestedNodePath & a,
const bNestedNodePath & b )

Definition at line 2152 of file node_tree_update.cc.

References b, bNestedNodePath::id_in_node, and bNestedNodePath::node_id.

Variable Documentation

◆ is_updating

bool is_updating = false
static

Protect from recursive calls into the updating function. Some node update functions might trigger this from Python or in other cases.

This could be added to Main, but given that there is generally only one Main, that's not really worth it now.

Definition at line 2164 of file node_tree_update.cc.

Referenced by BKE_ntree_update(), and BKE_ntree_update_without_main().