Blender  V3.3
Classes | Namespaces | Typedefs | Enumerations | Functions | Variables
node_tree_update.cc File Reference
#include "BLI_map.hh"
#include "BLI_multi_value_map.hh"
#include "BLI_noise.hh"
#include "BLI_set.hh"
#include "BLI_stack.hh"
#include "BLI_vector_set.hh"
#include "DNA_anim_types.h"
#include "DNA_modifier_types.h"
#include "DNA_node_types.h"
#include "BKE_anim_data.h"
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "BKE_node_tree_update.h"
#include "MOD_nodes.h"
#include "NOD_node_declaration.hh"
#include "NOD_node_tree_ref.hh"
#include "NOD_texture.h"
#include "DEG_depsgraph_query.h"

Go to the source code of this file.

Classes

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

Namespaces

 blender
 
 blender::bke
 
 blender::bke::node_field_inferencing
 

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_INTERFACE = (1 << 4) , NTREE_CHANGED_LINK = (1 << 5) , NTREE_CHANGED_REMOVED_NODE = (1 << 6) , NTREE_CHANGED_REMOVED_SOCKET = (1 << 7) ,
  NTREE_CHANGED_SOCKET_PROPERTY = (1 << 8) , NTREE_CHANGED_INTERNAL_LINK = (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 bool blender::bke::node_field_inferencing::is_field_socket_type (eNodeSocketDatatype type)
 
static bool blender::bke::node_field_inferencing::is_field_socket_type (const SocketRef &socket)
 
static InputSocketFieldType blender::bke::node_field_inferencing::get_interface_input_field_type (const NodeRef &node, const InputSocketRef &socket)
 
static OutputFieldDependency blender::bke::node_field_inferencing::get_interface_output_field_dependency (const NodeRef &node, const OutputSocketRef &socket)
 
static FieldInferencingInterface blender::bke::node_field_inferencing::get_dummy_field_inferencing_interface (const NodeRef &node)
 
static FieldInferencingInterface blender::bke::node_field_inferencing::get_node_field_inferencing_interface (const NodeRef &node)
 
static Vector< const InputSocketRef * > blender::bke::node_field_inferencing::gather_input_socket_dependencies (const OutputFieldDependency &field_dependency, const NodeRef &node)
 
static OutputFieldDependency blender::bke::node_field_inferencing::find_group_output_dependencies (const InputSocketRef &group_output_socket, const Span< SocketFieldState > field_state_by_socket_id)
 
static void blender::bke::node_field_inferencing::propagate_data_requirements_from_right_to_left (const NodeTreeRef &tree, const MutableSpan< SocketFieldState > field_state_by_socket_id)
 
static void blender::bke::node_field_inferencing::determine_group_input_states (const NodeTreeRef &tree, FieldInferencingInterface &new_inferencing_interface, const MutableSpan< SocketFieldState > field_state_by_socket_id)
 
static void blender::bke::node_field_inferencing::propagate_field_status_from_left_to_right (const NodeTreeRef &tree, const MutableSpan< SocketFieldState > field_state_by_socket_id)
 
static void blender::bke::node_field_inferencing::determine_group_output_states (const NodeTreeRef &tree, FieldInferencingInterface &new_inferencing_interface, const Span< SocketFieldState > field_state_by_socket_id)
 
static void blender::bke::node_field_inferencing::update_socket_shapes (const NodeTreeRef &tree, const Span< SocketFieldState > field_state_by_socket_id)
 
static bool blender::bke::node_field_inferencing::update_field_inferencing (const NodeTreeRef &tree)
 
static int blender::bke::get_internal_link_type_priority (const bNodeSocketType *from, const bNodeSocketType *to)
 
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_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 *UNUSED(link))
 
void BKE_ntree_update_tag_link_mute (bNodeTree *ntree, bNodeLink *UNUSED(link))
 
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_interface (bNodeTree *ntree)
 
void BKE_ntree_update_tag_id_changed (Main *bmain, ID *id)
 
void BKE_ntree_update_tag_image_user_changed (bNodeTree *ntree, ImageUser *UNUSED(iuser))
 
void BKE_ntree_update_main (Main *bmain, NodeTreeUpdateExtraParams *params)
 
void BKE_ntree_update_main_tree (Main *bmain, bNodeTree *ntree, NodeTreeUpdateExtraParams *params)
 

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_INTERFACE 
NTREE_CHANGED_LINK 
NTREE_CHANGED_REMOVED_NODE 
NTREE_CHANGED_REMOVED_SOCKET 
NTREE_CHANGED_SOCKET_PROPERTY 
NTREE_CHANGED_INTERNAL_LINK 
NTREE_CHANGED_ALL 

Definition at line 36 of file node_tree_update.cc.

Function Documentation

◆ add_node_tag()

static void add_node_tag ( bNodeTree ntree,
bNode node,
const eNodeTreeChangedFlag  flag 
)
static

◆ add_socket_tag()

static void add_socket_tag ( bNodeTree ntree,
bNodeSocket socket,
const eNodeTreeChangedFlag  flag 
)
static

◆ add_tree_tag()

static void add_tree_tag ( bNodeTree ntree,
const eNodeTreeChangedFlag  flag 
)
static

◆ BKE_ntree_update_main()

void BKE_ntree_update_main ( struct Main bmain,
struct NodeTreeUpdateExtraParams params 
)

◆ BKE_ntree_update_main_tree()

void BKE_ntree_update_main_tree ( struct Main bmain,
struct bNodeTree ntree,
struct NodeTreeUpdateExtraParams params 
)

Same as BKE_ntree_update_main, but will first only look at the provided tree and only looks at #bmain when something relevant for other data-blocks changed. This avoids scanning #bmain in many cases.

If #bmain is null, only the provided tree is updated. This should only be used in very rare cases because it may result it incorrectly synced data in DNA.

If tree is null, this is the same as calling BKE_ntree_update_main.

Definition at line 1748 of file node_tree_update.cc.

References BKE_ntree_update_main(), is_updating, ntree, and params.

Referenced by BKE_linestyle_default_shader(), ED_node_composit_default(), ED_node_shader_default(), ED_node_texture_default(), ED_node_tree_propagate_change(), blender::io::obj::get_or_create_material(), Freestyle::BlenderStrokeRenderer::GetStrokeShader(), blender::io::usd::USDMaterialReader::import_usd_preview(), ntree_exec_begin(), ntree_shader_groups_expand_inputs(), ntree_shader_groups_flatten(), ntree_shader_implicit_closure_cast(), ntree_shader_pruned_unused(), ntree_shader_shader_to_rgba_branch(), ntree_shader_unlink_hidden_value_sockets(), ntree_shader_weight_tree_invert(), and MaterialNode::update_material_nodetree().

◆ BKE_ntree_update_tag_active_output_changed()

void BKE_ntree_update_tag_active_output_changed ( struct bNodeTree ntree)

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

Definition at line 1693 of file node_tree_update.cc.

References add_tree_tag(), ntree, and NTREE_CHANGED_ANY.

Referenced by ED_node_set_active().

◆ BKE_ntree_update_tag_all()

void BKE_ntree_update_tag_all ( struct 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 1618 of file node_tree_update.cc.

References add_tree_tag(), ntree, and NTREE_CHANGED_ANY.

Referenced by blo_do_versions_250(), flatten_group_do(), blender::ed::space_node::node_group_separate_selected(), ntree_set_typeinfo(), and ntreeUpdateAllNew().

◆ BKE_ntree_update_tag_id_changed()

void BKE_ntree_update_tag_id_changed ( struct Main bmain,
struct ID id 
)

Used when an id data block changed that might be used by nodes that need to be updated.

Definition at line 1708 of file node_tree_update.cc.

References add_node_tag(), FOREACH_NODETREE_BEGIN, FOREACH_NODETREE_END, LISTBASE_FOREACH, node, NODE_UPDATE_ID, bNodeTree::nodes, ntree, and NTREE_CHANGED_NODE_PROPERTY.

Referenced by BKE_image_signal(), BKE_movieclip_reload(), render_endjob(), and special_aftertrans_update__movieclip().

◆ BKE_ntree_update_tag_image_user_changed()

void BKE_ntree_update_tag_image_user_changed ( bNodeTree ntree,
ImageUser UNUSEDiuser 
)

Definition at line 1721 of file node_tree_update.cc.

References add_tree_tag(), ntree, and NTREE_CHANGED_ANY.

◆ BKE_ntree_update_tag_interface()

void BKE_ntree_update_tag_interface ( struct bNodeTree ntree)

◆ BKE_ntree_update_tag_link_added()

void BKE_ntree_update_tag_link_added ( bNodeTree ntree,
bNodeLink UNUSEDlink 
)

Definition at line 1683 of file node_tree_update.cc.

References add_tree_tag(), ntree, and NTREE_CHANGED_LINK.

◆ BKE_ntree_update_tag_link_changed()

void BKE_ntree_update_tag_link_changed ( bNodeTree ntree)

◆ BKE_ntree_update_tag_link_mute()

void BKE_ntree_update_tag_link_mute ( bNodeTree ntree,
bNodeLink UNUSEDlink 
)

Definition at line 1688 of file node_tree_update.cc.

References add_tree_tag(), ntree, and NTREE_CHANGED_LINK.

◆ BKE_ntree_update_tag_link_removed()

void BKE_ntree_update_tag_link_removed ( bNodeTree ntree)

Definition at line 1678 of file node_tree_update.cc.

References add_tree_tag(), ntree, and NTREE_CHANGED_LINK.

Referenced by nodeRemLink().

◆ BKE_ntree_update_tag_missing_runtime_data()

void BKE_ntree_update_tag_missing_runtime_data ( struct bNodeTree ntree)

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

Definition at line 1698 of file node_tree_update.cc.

References add_tree_tag(), ntree, and NTREE_CHANGED_ALL.

Referenced by ntreeBlendReadData().

◆ BKE_ntree_update_tag_node_internal_link()

void BKE_ntree_update_tag_node_internal_link ( bNodeTree ntree,
bNode node 
)

Definition at line 1668 of file node_tree_update.cc.

References add_node_tag(), node, ntree, and NTREE_CHANGED_INTERNAL_LINK.

Referenced by nodeRemoveSocketEx().

◆ BKE_ntree_update_tag_node_mute()

void BKE_ntree_update_tag_node_mute ( bNodeTree ntree,
bNode node 
)

◆ BKE_ntree_update_tag_node_new()

void BKE_ntree_update_tag_node_new ( bNodeTree ntree,
bNode node 
)

◆ BKE_ntree_update_tag_node_property()

void BKE_ntree_update_tag_node_property ( struct bNodeTree ntree,
struct bNode node 
)

◆ BKE_ntree_update_tag_node_removed()

void BKE_ntree_update_tag_node_removed ( bNodeTree ntree)

◆ BKE_ntree_update_tag_socket_availability()

void BKE_ntree_update_tag_socket_availability ( bNodeTree ntree,
bNodeSocket socket 
)

Definition at line 1653 of file node_tree_update.cc.

References add_socket_tag(), ntree, and NTREE_CHANGED_SOCKET_PROPERTY.

Referenced by nodeSetSocketAvailability().

◆ BKE_ntree_update_tag_socket_new()

void BKE_ntree_update_tag_socket_new ( bNodeTree ntree,
bNodeSocket socket 
)

Definition at line 1638 of file node_tree_update.cc.

References add_socket_tag(), ntree, and NTREE_CHANGED_SOCKET_PROPERTY.

Referenced by nodeAddSocket().

◆ BKE_ntree_update_tag_socket_property()

void BKE_ntree_update_tag_socket_property ( bNodeTree ntree,
bNodeSocket socket 
)

Definition at line 1633 of file node_tree_update.cc.

References add_socket_tag(), ntree, and NTREE_CHANGED_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 
)

Definition at line 1648 of file node_tree_update.cc.

References add_socket_tag(), ntree, and NTREE_CHANGED_SOCKET_PROPERTY.

Referenced by node_socket_set_typeinfo().

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 1734 of file node_tree_update.cc.

Referenced by BKE_ntree_update_main(), and BKE_ntree_update_main_tree().