29struct FieldInferencingInterface;
31struct GeometryNodesLazyFunctionGraphInfo;
32namespace anonymous_attribute_lifetime {
34namespace aal = anonymous_attribute_lifetime;
52 return node->identifier;
63 return a->identifier ==
b->identifier;
67 return a->identifier ==
b;
156 std::unique_ptr<anonymous_attribute_inferencing::AnonymousAttributeInferencingResult>
166 std::unique_ptr<nodes::GeometryNodesLazyFunctionGraphInfo>
370namespace node_tree_runtime {
384 tree_.
runtime->allow_use_dirty_topology_cache.fetch_add(1);
389 tree_.
runtime->allow_use_dirty_topology_cache.fetch_sub(1);
395 if (!
tree.runtime->topology_cache_exists) {
398 if (
tree.runtime->allow_use_dirty_topology_cache.load() > 0) {
401 if (
tree.runtime->topology_cache_mutex.is_dirty()) {
410 if (ntree ==
nullptr) {
419 if (node ==
nullptr) {
427namespace node_field_inferencing {
438 return this->
runtime->nodes_by_id.as_span();
443 return this->
runtime->nodes_by_id;
446inline bNode *bNodeTree::node_by_id(
const int32_t identifier)
449 bNode *
const *node = this->
runtime->nodes_by_id.lookup_key_ptr_as(identifier);
450 return node ? *
node :
nullptr;
453inline const bNode *bNodeTree::node_by_id(
const int32_t identifier)
const
456 const bNode *
const *node = this->
runtime->nodes_by_id.lookup_key_ptr_as(identifier);
457 return node ? *
node :
nullptr;
476 return this->
runtime->toposort_left_to_right;
482 return this->
runtime->toposort_right_to_left;
488 return this->
runtime->toposort_left_to_right;
494 return this->
runtime->toposort_right_to_left;
500 return this->
runtime->group_nodes;
506 return this->
runtime->group_nodes;
509inline bool bNodeTree::has_available_link_cycle()
const
512 return this->
runtime->has_available_link_cycle;
515inline bool bNodeTree::has_undefined_nodes_or_sockets()
const
518 return this->
runtime->has_undefined_nodes_or_sockets;
521inline bNode *bNodeTree::group_output_node()
524 return this->
runtime->group_output_node;
527inline const bNode *bNodeTree::group_output_node()
const
530 return this->
runtime->group_output_node;
535 return this->nodes_by_type(
"NodeGroupInput");
540 return this->nodes_by_type(
"NodeGroupInput");
546 return this->
runtime->input_sockets;
552 return this->
runtime->input_sockets;
558 return this->
runtime->output_sockets;
564 return this->
runtime->output_sockets;
582 return this->
runtime->root_frames;
607inline void bNodeTree::ensure_interface_cache()
const
654inline int bNode::index()
const
656 const int index = this->
runtime->index_in_tree;
659 this->
runtime->owner_tree->runtime->nodes_by_id.index_of_as(this->identifier));
690 return *this->
runtime->inputs[index];
696 return *this->
runtime->outputs[index];
699inline const bNodeSocket &bNode::input_socket(
int index)
const
702 return *this->
runtime->inputs[index];
705inline const bNodeSocket &bNode::output_socket(
int index)
const
708 return *this->
runtime->outputs[index];
714 return *this->
runtime->inputs_by_identifier.lookup_as(identifier);
720 return *this->
runtime->outputs_by_identifier.lookup_as(identifier);
726 return *this->
runtime->inputs_by_identifier.lookup_as(identifier);
732 return *this->
runtime->outputs_by_identifier.lookup_as(identifier);
735inline const bNodeTree &bNode::owner_tree()
const
738 return *this->
runtime->owner_tree;
744 return *this->
runtime->owner_tree;
749 if (this->
label[0] ==
'\0') {
755inline bool bNode::is_muted()
const
760inline bool bNode::is_reroute()
const
765inline bool bNode::is_frame()
const
770inline bool bNode::is_group()
const
775inline bool bNode::is_group_input()
const
780inline bool bNode::is_group_output()
const
787 return this->
runtime->internal_links;
790inline bool bNode::is_dangling_reroute()
const
793 return this->
runtime->is_dangling_reroute;
796inline bool bNode::is_socket_drawn(
const bNodeSocket &socket)
const
798 return socket.is_visible();
801inline bool bNode::is_socket_icon_drawn(
const bNodeSocket &socket)
const
803 return socket.is_visible() && (this->
flag &
NODE_HIDDEN || !socket.is_panel_collapsed());
810 return this->
runtime->direct_children_in_frame;
815 return this->
runtime->declaration;
834inline bool bNodeLink::is_muted()
const
839inline bool bNodeLink::is_available()
const
841 return this->
fromsock->is_available() && this->
tosock->is_available();
844inline bool bNodeLink::is_used()
const
846 return !this->is_muted() && this->is_available();
855inline int bNodeSocket::index()
const
858 return this->
runtime->index_in_node;
861inline int bNodeSocket::index_in_tree()
const
864 return this->
runtime->index_in_all_sockets;
867inline int bNodeSocket::index_in_all_inputs()
const
871 return this->
runtime->index_in_inout_sockets;
874inline int bNodeSocket::index_in_all_outputs()
const
878 return this->
runtime->index_in_inout_sockets;
881inline bool bNodeSocket::is_hidden()
const
886inline bool bNodeSocket::is_available()
const
891inline bool bNodeSocket::is_panel_collapsed()
const
896inline bool bNodeSocket::is_visible()
const
898 return !this->is_hidden() && this->is_available();
901inline bNode &bNodeSocket::owner_node()
904 return *this->
runtime->owner_node;
907inline const bNodeTree &bNodeSocket::owner_tree()
const
910 return *this->
runtime->owner_node->runtime->owner_tree;
913inline bNodeTree &bNodeSocket::owner_tree()
916 return *this->
runtime->owner_node->runtime->owner_tree;
922 return this->
runtime->logically_linked_sockets;
928 return this->
runtime->directly_linked_links;
934 return this->
runtime->directly_linked_links;
940 return this->
runtime->directly_linked_sockets;
946 return this->
runtime->directly_linked_sockets;
949inline bool bNodeSocket::is_directly_linked()
const
951 return !this->directly_linked_links().is_empty();
954inline bool bNodeSocket::is_logically_linked()
const
956 return !this->logically_linked_sockets().is_empty();
959inline const bNodeSocket *bNodeSocket::internal_link_input()
const
963 return this->
runtime->internal_link_input;
966template<
typename T> T *bNodeSocket::default_value_typed()
971template<
typename T>
const T *bNodeSocket::default_value_typed()
const
976inline bool bNodeSocket::is_input()
const
981inline bool bNodeSocket::is_output()
const
986inline bool bNodeSocket::is_multi_input()
const
991inline const bNode &bNodeSocket::owner_node()
const
994 return *this->
runtime->owner_node;
1003inline bool bNodePanelState::is_collapsed()
const
1008inline bool bNodePanelState::is_parent_collapsed()
const
1013inline bool bNodePanelState::has_visible_content()
const
#define NODE_CUSTOM_GROUP
#define NODE_GROUP_OUTPUT
@ NODE_PANEL_PARENT_COLLAPSED
@ NODE_PANEL_CONTENT_VISIBLE
constexpr const char * c_str() const
bool has_available_linked_inputs
Array< bNodePanelRuntime > panels
Map< StringRefNull, bNodeSocket * > outputs_by_identifier
bool forward_compatible_versioning_done
Vector< bNode * > direct_children_in_frame
Vector< bNodeSocket * > outputs
Map< StringRefNull, bNodeSocket * > inputs_by_identifier
int toposort_left_to_right_index
Vector< bNodeSocket * > inputs
int toposort_right_to_left_index
bool has_available_linked_outputs
nodes::NodeDeclaration * declaration
Vector< bNodeLink > internal_links
Vector< bNodeSocket * > logically_linked_skipped_sockets
Vector< bNodeSocket * > directly_linked_sockets
Vector< bNodeSocket * > logically_linked_sockets
int index_in_inout_sockets
bNodeSocket * internal_link_input
std::optional< FieldSocketState > field_state
Vector< bNodeLink * > directly_linked_links
const nodes::SocketDeclaration * declaration
uint32_t output_topology_hash
std::unique_ptr< LoggedZoneGraphs > logged_zone_graphs
std::unique_ptr< anonymous_attribute_inferencing::AnonymousAttributeInferencingResult > anonymous_attribute_inferencing
void(* stats_draw)(void *, const char *str)
Vector< bNode * > root_frames
Vector< bNodeSocket * > output_sockets
Vector< bNode * > toposort_right_to_left
Vector< bNode * > group_nodes
bNode * group_output_node
Vector< bNodeSocket * > sockets
uint32_t previews_refresh_state
CacheMutex topology_cache_mutex
bool has_undefined_nodes_or_sockets
void(* update_draw)(void *)
CacheMutex tree_zones_cache_mutex
bool has_available_link_cycle
Vector< bNodeLink * > links
std::unique_ptr< nodes::gizmos::TreeGizmoPropagation > gizmo_propagation
Set< const bNodeSocket * > sockets_on_active_gizmo_paths
std::mutex geometry_nodes_lazy_function_graph_info_mutex
std::unique_ptr< nodes::GeometryNodesLazyFunctionGraphInfo > geometry_nodes_lazy_function_graph_info
std::atomic< bool > topology_cache_exists
MultiValueMap< const bNodeType *, bNode * > nodes_by_type
std::unique_ptr< bNodeTreeZones > tree_zones
bool(* test_break)(void *)
void(* progress)(void *, float progress)
NodeIDVectorSet nodes_by_id
std::unique_ptr< nodes::FieldInferencingInterface > field_inferencing_interface
MultiValueMap< int, NodeLinkError > link_errors_by_target_node
std::atomic< int > allow_use_dirty_topology_cache
Vector< bNode * > toposort_left_to_right
Vector< bNodeSocket * > input_sockets
AllowUsingOutdatedInfo(const bNodeTree &tree)
~AllowUsingOutdatedInfo()
local_group_size(16, 16) .push_constant(Type b
bool update_field_inferencing(const bNodeTree &tree)
bool topology_cache_is_available(const bNodeTree &tree)
void preprocess_geometry_node_tree_for_evaluation(bNodeTree &tree_cow)
bNodeType * node_type_find(const char *idname)
unsigned __int64 uint64_t
bNodeSocketRuntimeHandle * runtime
bNodeTreeInterfaceRuntimeHandle * runtime
bNodeTreeRuntimeHandle * runtime
bNestedNodeRef * nested_node_refs
bNodeTreeInterface tree_interface
bNodePanelState * panel_states_array
bNodeRuntimeHandle * runtime
bool operator()(const int32_t a, const bNode *b) const
bool operator()(const bNode *a, const int32_t b) const
bool operator()(const bNode *a, const bNode *b) const
uint64_t operator()(const int32_t id) const
uint64_t operator()(const bNode *node) const
Map< int, std::string > graph_by_zone_id