Blender V4.5
BKE_node_runtime.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include <memory>
12
13#include "BLI_cache_mutex.hh"
16#include "BLI_mutex.hh"
17#include "BLI_set.hh"
19#include "BLI_utility_mixins.hh"
20#include "BLI_vector.hh"
21#include "BLI_vector_set.hh"
22
23#include "DNA_node_types.h"
24
25#include "BKE_node.hh"
27
29
30struct bNode;
31struct bNodeSocket;
32struct bNodeTree;
33
34namespace blender::nodes {
37class NodeDeclaration;
42namespace aal = anonymous_attribute_lifetime;
43namespace gizmos {
45}
46} // namespace blender::nodes
47namespace blender::bke {
48struct bNodeType;
49class bNodeTreeZones;
50} // namespace blender::bke
51
55
56namespace blender::bke {
57
63
65 int32_t operator()(const bNode *value) const
66 {
67 return value->identifier;
68 }
69};
71
73 std::string tooltip;
74};
75
81 private:
82 int to_node_id_;
83 int input_socket_index_;
84 int input_link_index_;
85
86 public:
88 explicit NodeLinkKey(const bNodeLink &link);
89
90 bNodeLink *try_find(bNodeTree &ntree) const;
91 const bNodeLink *try_find(const bNodeTree &ntree) const;
92
93 uint64_t hash() const
94 {
95 return get_default_hash(this->to_node_id_, this->input_socket_index_, this->input_link_index_);
96 }
97
99 to_node_id_,
100 input_socket_index_,
101 input_link_index_);
102};
103
113
121 public:
127 uint32_t changed_flag = 0;
133
138 uint8_t runtime_flag = 0;
139
145
147 std::unique_ptr<LoggedZoneGraphs> logged_zone_graphs;
148
155
163 void (*progress)(void *, float progress) = nullptr;
165 void (*stats_draw)(void *, const char *str) = nullptr;
166 bool (*test_break)(void *) = nullptr;
167 void (*update_draw)(void *) = nullptr;
168 void *tbh = nullptr, *prh = nullptr, *sdh = nullptr, *udh = nullptr;
169
170 /* End legacy execution data. */
171
173 std::unique_ptr<nodes::FieldInferencingInterface> field_inferencing_interface;
177 std::unique_ptr<node_tree_reference_lifetimes::ReferenceLifetimesInfo> reference_lifetimes_info;
178 std::unique_ptr<nodes::gizmos::TreeGizmoPropagation> gizmo_propagation;
179 std::unique_ptr<nodes::StructureTypeInterface> structure_type_interface;
180
188
195 std::unique_ptr<nodes::GeometryNodesLazyFunctionGraphInfo>
197
203
209 std::atomic<bool> topology_cache_exists = false;
214 mutable std::atomic<int> allow_use_dirty_topology_cache = 0;
215
217 std::shared_ptr<bNodeTreeZones> tree_zones;
218
223 std::shared_ptr<bNodeTreeZones> last_valid_zones;
225
231
238 std::unique_ptr<nodes::GeometryNodesEvalDependencies> geometry_nodes_eval_dependencies;
239
245
259};
260
302
304 float min_y;
305 float max_y;
306 bool fill_node_end = false;
307};
308
310 public:
311 /* The vertical location of the panel in the tree, calculated while drawing the nodes and invalid
312 * if the node tree hasn't been drawn yet. In the node tree's "world space" (the same as
313 * #bNode::runtime::draw_bounds). */
314 std::optional<float> header_center_y;
315 std::optional<bNodePanelExtent> content_extent;
318};
319
402
404
409
411 private:
412 const bNodeTree &tree_;
413
414 public:
416 {
417 tree_.runtime->allow_use_dirty_topology_cache.fetch_add(1);
418 }
419
421 {
422 tree_.runtime->allow_use_dirty_topology_cache.fetch_sub(1);
423 }
424};
425
427{
428 if (!tree.runtime->topology_cache_exists) {
429 return false;
430 }
431 if (tree.runtime->allow_use_dirty_topology_cache.load() > 0) {
432 return true;
433 }
434 if (tree.runtime->topology_cache_mutex.is_dirty()) {
435 return false;
436 }
437 return true;
438}
439
440inline bool topology_cache_is_available(const bNode &node)
441{
442 const bNodeTree *ntree = node.runtime->owner_tree;
443 if (ntree == nullptr) {
444 return false;
445 }
446 return topology_cache_is_available(*ntree);
447}
448
449inline bool topology_cache_is_available(const bNodeSocket &socket)
450{
451 const bNode *node = socket.runtime->owner_node;
452 if (node == nullptr) {
453 return false;
454 }
455 return topology_cache_is_available(*node);
456}
457
458} // namespace node_tree_runtime
459
463
467
468} // namespace blender::bke
469
470/* -------------------------------------------------------------------- */
473
474inline blender::Span<const bNode *> bNodeTree::all_nodes() const
475{
476 return this->runtime->nodes_by_id.as_span();
477}
478
479inline blender::Span<bNode *> bNodeTree::all_nodes()
480{
481 return this->runtime->nodes_by_id;
482}
483
484inline bNode *bNodeTree::node_by_id(const int32_t identifier)
485{
486 BLI_assert(identifier >= 0);
487 bNode *const *node = this->runtime->nodes_by_id.lookup_key_ptr_as(identifier);
488 return node ? *node : nullptr;
489}
490
491inline const bNode *bNodeTree::node_by_id(const int32_t identifier) const
492{
493 BLI_assert(identifier >= 0);
494 const bNode *const *node = this->runtime->nodes_by_id.lookup_key_ptr_as(identifier);
495 return node ? *node : nullptr;
496}
497
498inline blender::Span<bNode *> bNodeTree::nodes_by_type(const blender::StringRefNull type_idname)
499{
501 return this->runtime->nodes_by_type.lookup(blender::bke::node_type_find(type_idname.c_str()));
502}
503
504inline blender::Span<const bNode *> bNodeTree::nodes_by_type(
505 const blender::StringRefNull type_idname) const
506{
508 return this->runtime->nodes_by_type.lookup(blender::bke::node_type_find(type_idname.c_str()));
509}
510
511inline blender::Span<const bNode *> bNodeTree::toposort_left_to_right() const
512{
514 return this->runtime->toposort_left_to_right;
515}
516
517inline blender::Span<const bNode *> bNodeTree::toposort_right_to_left() const
518{
520 return this->runtime->toposort_right_to_left;
521}
522
523inline blender::Span<bNode *> bNodeTree::toposort_left_to_right()
524{
526 return this->runtime->toposort_left_to_right;
527}
528
529inline blender::Span<bNode *> bNodeTree::toposort_right_to_left()
530{
532 return this->runtime->toposort_right_to_left;
533}
534
535inline blender::Span<const bNode *> bNodeTree::group_nodes() const
536{
538 return this->runtime->group_nodes;
539}
540
541inline blender::Span<bNode *> bNodeTree::group_nodes()
542{
544 return this->runtime->group_nodes;
545}
546
547inline bool bNodeTree::has_available_link_cycle() const
548{
550 return this->runtime->has_available_link_cycle;
551}
552
553inline bool bNodeTree::has_undefined_nodes_or_sockets() const
554{
556 return this->runtime->has_undefined_nodes_or_sockets;
557}
558
559inline bNode *bNodeTree::group_output_node()
560{
562 return this->runtime->group_output_node;
563}
564
565inline const bNode *bNodeTree::group_output_node() const
566{
568 return this->runtime->group_output_node;
569}
570
571inline blender::Span<bNode *> bNodeTree::group_input_nodes()
572{
573 return this->nodes_by_type("NodeGroupInput");
574}
575
576inline blender::Span<const bNode *> bNodeTree::group_input_nodes() const
577{
578 return this->nodes_by_type("NodeGroupInput");
579}
580
581inline blender::Span<const bNodeSocket *> bNodeTree::all_input_sockets() const
582{
584 return this->runtime->input_sockets;
585}
586
587inline blender::Span<bNodeSocket *> bNodeTree::all_input_sockets()
588{
590 return this->runtime->input_sockets;
591}
592
593inline blender::Span<const bNodeSocket *> bNodeTree::all_output_sockets() const
594{
596 return this->runtime->output_sockets;
597}
598
599inline blender::Span<bNodeSocket *> bNodeTree::all_output_sockets()
600{
602 return this->runtime->output_sockets;
603}
604
605inline blender::Span<const bNodeSocket *> bNodeTree::all_sockets() const
606{
608 return this->runtime->sockets;
609}
610
611inline blender::Span<bNodeSocket *> bNodeTree::all_sockets()
612{
614 return this->runtime->sockets;
615}
616
617inline blender::Span<bNode *> bNodeTree::root_frames() const
618{
620 return this->runtime->root_frames;
621}
622
623inline blender::Span<bNodeLink *> bNodeTree::all_links()
624{
626 return this->runtime->links;
627}
628
629inline blender::Span<const bNodeLink *> bNodeTree::all_links() const
630{
632 return this->runtime->links;
633}
634
635inline blender::MutableSpan<bNestedNodeRef> bNodeTree::nested_node_refs_span()
636{
637 return {this->nested_node_refs, this->nested_node_refs_num};
638}
639
640inline blender::Span<bNestedNodeRef> bNodeTree::nested_node_refs_span() const
641{
642 return {this->nested_node_refs, this->nested_node_refs_num};
643}
644
645inline void bNodeTree::ensure_interface_cache() const
646{
647 this->tree_interface.ensure_items_cache();
648}
649
650inline blender::Span<bNodeTreeInterfaceSocket *> bNodeTree::interface_inputs()
651{
652 BLI_assert(this->tree_interface.items_cache_is_available());
653 return this->tree_interface.runtime->inputs_;
654}
655
656inline blender::Span<const bNodeTreeInterfaceSocket *> bNodeTree::interface_inputs() const
657{
658 BLI_assert(this->tree_interface.items_cache_is_available());
659 return this->tree_interface.runtime->inputs_.as_span();
660}
661
662inline blender::Span<bNodeTreeInterfaceSocket *> bNodeTree::interface_outputs()
663{
664 BLI_assert(this->tree_interface.items_cache_is_available());
665 return this->tree_interface.runtime->outputs_;
666}
667
668inline blender::Span<const bNodeTreeInterfaceSocket *> bNodeTree::interface_outputs() const
669{
670 BLI_assert(this->tree_interface.items_cache_is_available());
671 return this->tree_interface.runtime->outputs_.as_span();
672}
673
674inline blender::Span<bNodeTreeInterfaceItem *> bNodeTree::interface_items()
675{
676 BLI_assert(this->tree_interface.items_cache_is_available());
677 return this->tree_interface.runtime->items_;
678}
679
680inline blender::Span<const bNodeTreeInterfaceItem *> bNodeTree::interface_items() const
681{
682 BLI_assert(this->tree_interface.items_cache_is_available());
683 return this->tree_interface.runtime->items_.as_span();
684}
685
686inline int bNodeTree::interface_input_index(const bNodeTreeInterfaceSocket &io_socket) const
687{
688 BLI_assert(this->tree_interface.items_cache_is_available());
689 return this->tree_interface.runtime->inputs_.index_of_as(&io_socket);
690}
691
692inline int bNodeTree::interface_output_index(const bNodeTreeInterfaceSocket &io_socket) const
693{
694 BLI_assert(this->tree_interface.items_cache_is_available());
695 return this->tree_interface.runtime->outputs_.index_of_as(&io_socket);
696}
697
698inline int bNodeTree::interface_item_index(const bNodeTreeInterfaceItem &io_item) const
699{
700 BLI_assert(this->tree_interface.items_cache_is_available());
701 return this->tree_interface.runtime->items_.index_of_as(&io_item);
702}
703
705
706/* -------------------------------------------------------------------- */
709
710inline int bNode::index() const
711{
712 const int index = this->runtime->index_in_tree;
713 /* The order of nodes should always be consistent with the `nodes_by_id` vector. */
714 BLI_assert(index ==
715 this->runtime->owner_tree->runtime->nodes_by_id.index_of_as(this->identifier));
716 return index;
717}
718
719inline blender::Span<bNodeSocket *> bNode::input_sockets()
720{
722 return this->runtime->inputs;
723}
724
725inline blender::Span<bNodeSocket *> bNode::output_sockets()
726{
728 return this->runtime->outputs;
729}
730
731inline blender::Span<const bNodeSocket *> bNode::input_sockets() const
732{
734 return this->runtime->inputs;
735}
736
737inline blender::Span<const bNodeSocket *> bNode::output_sockets() const
738{
740 return this->runtime->outputs;
741}
742
743inline blender::IndexRange bNode::input_socket_indices_in_tree() const
744{
746 const int num_inputs = this->runtime->inputs.size();
747 if (num_inputs == 0) {
748 return {};
749 }
750 return blender::IndexRange::from_begin_size(this->input_socket(0).index_in_tree(), num_inputs);
751}
752
753inline blender::IndexRange bNode::output_socket_indices_in_tree() const
754{
756 const int num_outputs = this->runtime->outputs.size();
757 if (num_outputs == 0) {
758 return {};
759 }
760 return blender::IndexRange::from_begin_size(this->output_socket(0).index_in_tree(), num_outputs);
761}
762
763inline blender::IndexRange bNode::input_socket_indices_in_all_inputs() const
764{
766 const int num_inputs = this->runtime->inputs.size();
767 if (num_inputs == 0) {
768 return {};
769 }
770 return blender::IndexRange::from_begin_size(this->input_socket(0).index_in_all_inputs(),
771 num_inputs);
772}
773
774inline blender::IndexRange bNode::output_socket_indices_in_all_outputs() const
775{
777 const int num_outputs = this->runtime->outputs.size();
778 if (num_outputs == 0) {
779 return {};
780 }
781 return blender::IndexRange::from_begin_size(this->output_socket(0).index_in_all_outputs(),
782 num_outputs);
783}
784
785inline bNodeSocket &bNode::input_socket(int index)
786{
788 return *this->runtime->inputs[index];
789}
790
791inline bNodeSocket &bNode::output_socket(int index)
792{
794 return *this->runtime->outputs[index];
795}
796
797inline const bNodeSocket &bNode::input_socket(int index) const
798{
800 return *this->runtime->inputs[index];
801}
802
803inline const bNodeSocket &bNode::output_socket(int index) const
804{
806 return *this->runtime->outputs[index];
807}
808
809inline const bNodeSocket &bNode::input_by_identifier(blender::StringRef identifier) const
810{
812 return *this->runtime->inputs_by_identifier.lookup_as(identifier);
813}
814
815inline const bNodeSocket &bNode::output_by_identifier(blender::StringRef identifier) const
816{
818 return *this->runtime->outputs_by_identifier.lookup_as(identifier);
819}
820
821inline bNodeSocket &bNode::input_by_identifier(blender::StringRef identifier)
822{
824 return *this->runtime->inputs_by_identifier.lookup_as(identifier);
825}
826
827inline bNodeSocket &bNode::output_by_identifier(blender::StringRef identifier)
828{
830 return *this->runtime->outputs_by_identifier.lookup_as(identifier);
831}
832
833inline const bNodeTree &bNode::owner_tree() const
834{
836 return *this->runtime->owner_tree;
837}
838
839inline bNodeTree &bNode::owner_tree()
840{
842 return *this->runtime->owner_tree;
843}
844
845inline blender::StringRefNull bNode::label_or_name() const
846{
847 if (this->label[0] == '\0') {
848 return this->name;
849 }
850 return this->label;
851}
852
853inline bool bNode::is_muted() const
854{
855 return this->flag & NODE_MUTED;
856}
857
858inline bool bNode::is_reroute() const
859{
860 return this->type_legacy == NODE_REROUTE;
861}
862
863inline bool bNode::is_frame() const
864{
865 return this->type_legacy == NODE_FRAME;
866}
867
868inline bool bNode::is_group() const
869{
871}
872
873inline bool bNode::is_custom_group() const
874{
875 return this->type_legacy == NODE_CUSTOM_GROUP;
876}
877
878inline bool bNode::is_group_input() const
879{
880 return this->type_legacy == NODE_GROUP_INPUT;
881}
882
883inline bool bNode::is_group_output() const
884{
885 return this->type_legacy == NODE_GROUP_OUTPUT;
886}
887
888inline bool bNode::is_undefined() const
889{
891}
892
893inline bool bNode::is_type(const blender::StringRef query_idname) const
894{
895 return this->typeinfo->is_type(query_idname);
896}
897
898inline blender::Span<bNodeLink> bNode::internal_links() const
899{
900 return this->runtime->internal_links;
901}
902
903inline bool bNode::is_dangling_reroute() const
904{
906 return this->runtime->is_dangling_reroute;
907}
908
909inline blender::Span<bNode *> bNode::direct_children_in_frame() const
910{
912 BLI_assert(this->is_frame());
913 return this->runtime->direct_children_in_frame;
914}
915
916inline const blender::nodes::NodeDeclaration *bNode::declaration() const
917{
918 return this->runtime->declaration;
919}
920
921inline blender::Span<bNodePanelState> bNode::panel_states() const
922{
924}
925
926inline blender::MutableSpan<bNodePanelState> bNode::panel_states()
927{
929}
930
932
933/* -------------------------------------------------------------------- */
936
937inline bool bNodeLink::is_muted() const
938{
939 return this->flag & NODE_LINK_MUTED;
940}
941
942inline bool bNodeLink::is_available() const
943{
944 return this->fromsock->is_available() && this->tosock->is_available();
945}
946
947inline bool bNodeLink::is_used() const
948{
949 return !this->is_muted() && this->is_available();
950}
951
953
954/* -------------------------------------------------------------------- */
957
958inline int bNodeSocket::index() const
959{
961 return this->runtime->index_in_node;
962}
963
964inline int bNodeSocket::index_in_tree() const
965{
967 return this->runtime->index_in_all_sockets;
968}
969
970inline int bNodeSocket::index_in_all_inputs() const
971{
973 BLI_assert(this->is_input());
974 return this->runtime->index_in_inout_sockets;
975}
976
977inline int bNodeSocket::index_in_all_outputs() const
978{
980 BLI_assert(this->is_output());
981 return this->runtime->index_in_inout_sockets;
982}
983
984inline bool bNodeSocket::is_user_hidden() const
985{
986 return (this->flag & SOCK_HIDDEN) != 0;
987}
988
989inline bool bNodeSocket::is_inactive() const
990{
991 /* Gray out inputs that do not affect the output of the node currently.
992 * Don't gray out any inputs if the node has no outputs (in which case no input can affect the
993 * output). Otherwise, viewer node inputs would be inactive. */
994 return this->is_input() && !this->affects_node_output() &&
995 !this->owner_node().output_sockets().is_empty();
996}
997
998inline bool bNodeSocket::is_available() const
999{
1000 return (this->flag & SOCK_UNAVAIL) == 0;
1001}
1002
1003inline bool bNodeSocket::is_panel_collapsed() const
1004{
1005 return (this->flag & SOCK_PANEL_COLLAPSED) != 0;
1006}
1007
1008inline bool bNodeSocket::is_visible() const
1009{
1010 return !this->is_user_hidden() && this->is_available() &&
1011 (this->is_output() || this->inferred_input_socket_visibility());
1012}
1013
1014inline bool bNodeSocket::is_icon_visible() const
1015{
1016 return this->is_visible() &&
1017 (this->owner_node().flag & NODE_HIDDEN || !this->is_panel_collapsed());
1018}
1019
1020inline bNode &bNodeSocket::owner_node()
1021{
1023 return *this->runtime->owner_node;
1024}
1025
1026inline const bNodeTree &bNodeSocket::owner_tree() const
1027{
1029 return *this->runtime->owner_node->runtime->owner_tree;
1030}
1031
1032inline bNodeTree &bNodeSocket::owner_tree()
1033{
1035 return *this->runtime->owner_node->runtime->owner_tree;
1036}
1037
1038inline blender::Span<const bNodeSocket *> bNodeSocket::logically_linked_sockets() const
1039{
1041 return this->runtime->logically_linked_sockets;
1042}
1043
1044inline blender::Span<const bNodeLink *> bNodeSocket::directly_linked_links() const
1045{
1047 return this->runtime->directly_linked_links;
1048}
1049
1050inline blender::Span<bNodeLink *> bNodeSocket::directly_linked_links()
1051{
1053 return this->runtime->directly_linked_links;
1054}
1055
1056inline blender::Span<const bNodeSocket *> bNodeSocket::directly_linked_sockets() const
1057{
1059 return this->runtime->directly_linked_sockets;
1060}
1061
1062inline blender::Span<bNodeSocket *> bNodeSocket::directly_linked_sockets()
1063{
1065 return this->runtime->directly_linked_sockets;
1066}
1067
1068inline bool bNodeSocket::is_directly_linked() const
1069{
1070 return !this->directly_linked_links().is_empty();
1071}
1072
1073inline bool bNodeSocket::is_logically_linked() const
1074{
1075 return !this->logically_linked_sockets().is_empty();
1076}
1077
1078inline const bNodeSocket *bNodeSocket::internal_link_input() const
1079{
1081 BLI_assert(this->in_out == SOCK_OUT);
1082 return this->runtime->internal_link_input;
1083}
1084
1085template<typename T> T *bNodeSocket::default_value_typed()
1086{
1087 return static_cast<T *>(this->default_value);
1088}
1089
1090template<typename T> const T *bNodeSocket::default_value_typed() const
1091{
1092 return static_cast<const T *>(this->default_value);
1093}
1094
1095inline bool bNodeSocket::is_input() const
1096{
1097 return this->in_out == SOCK_IN;
1098}
1099
1100inline bool bNodeSocket::is_output() const
1101{
1102 return this->in_out == SOCK_OUT;
1103}
1104
1105inline bool bNodeSocket::is_multi_input() const
1106{
1107 return this->flag & SOCK_MULTI_INPUT;
1108}
1109
1110inline const bNode &bNodeSocket::owner_node() const
1111{
1113 return *this->runtime->owner_node;
1114}
1115
1117
1118/* -------------------------------------------------------------------- */
1121
1122inline bool bNodePanelState::is_collapsed() const
1123{
1124 return flag & NODE_PANEL_COLLAPSED;
1125}
1126
1127inline bool bNodePanelState::is_parent_collapsed() const
1128{
1130}
1131
1132inline bool bNodePanelState::has_visible_content() const
1133{
1135}
1136
#define NODE_REROUTE
Definition BKE_node.hh:798
#define NODE_CUSTOM_GROUP
Definition BKE_node.hh:801
#define NODE_GROUP_OUTPUT
Definition BKE_node.hh:800
#define NODE_GROUP
Definition BKE_node.hh:796
#define NODE_FRAME
Definition BKE_node.hh:797
#define NODE_GROUP_INPUT
Definition BKE_node.hh:799
#define BLI_assert(a)
Definition BLI_assert.h:46
#define ELEM(...)
@ SOCK_OUT
@ SOCK_IN
@ NODE_HIDDEN
@ NODE_MUTED
@ SOCK_MULTI_INPUT
@ SOCK_PANEL_COLLAPSED
@ SOCK_HIDDEN
@ SOCK_UNAVAIL
struct bNode bNode
@ NODE_LINK_MUTED
@ NODE_PANEL_COLLAPSED
@ NODE_PANEL_PARENT_COLLAPSED
@ NODE_PANEL_CONTENT_VISIBLE
unsigned long long int uint64_t
static constexpr IndexRange from_begin_size(const int64_t begin, const int64_t size)
NonCopyable(const NonCopyable &other)=delete
NonMovable(NonMovable &&other)=delete
constexpr const char * c_str() const
std::optional< float > header_center_y
std::optional< bNodePanelExtent > content_extent
Array< bNodePanelRuntime > panels
Map< StringRefNull, bNodeSocket * > outputs_by_identifier
Vector< bNode * > direct_children_in_frame
Vector< bNodeSocket * > outputs
Map< StringRefNull, bNodeSocket * > inputs_by_identifier
Vector< bNodeSocket * > inputs
nodes::NodeDeclaration * declaration
Vector< bNodeLink > internal_links
Vector< bNodeSocket * > logically_linked_skipped_sockets
Vector< bNodeSocket * > directly_linked_sockets
Vector< bNodeSocket * > logically_linked_sockets
Vector< bNodeLink * > directly_linked_links
const nodes::SocketDeclaration * declaration
MultiValueMap< NodeLinkKey, NodeLinkError > link_errors
std::unique_ptr< LoggedZoneGraphs > logged_zone_graphs
void(* stats_draw)(void *, const char *str)
Vector< bNodeSocket * > output_sockets
std::unique_ptr< node_tree_reference_lifetimes::ReferenceLifetimesInfo > reference_lifetimes_info
Array< FieldSocketState > field_states
Vector< bNodeSocket * > sockets
std::unique_ptr< nodes::StructureTypeInterface > structure_type_interface
std::unique_ptr< nodes::gizmos::TreeGizmoPropagation > gizmo_propagation
Set< const bNodeSocket * > sockets_on_active_gizmo_paths
std::unique_ptr< nodes::GeometryNodesLazyFunctionGraphInfo > geometry_nodes_lazy_function_graph_info
Map< bNodeInstanceKey, bNodePreview > previews
std::atomic< bool > topology_cache_exists
MultiValueMap< const bNodeType *, bNode * > nodes_by_type
std::shared_ptr< bNodeTreeZones > tree_zones
void(* progress)(void *, float progress)
std::unique_ptr< nodes::FieldInferencingInterface > field_inferencing_interface
blender::Array< nodes::socket_usage_inference::SocketUsage > inferenced_input_socket_usage
std::unique_ptr< nodes::GeometryNodesEvalDependencies > geometry_nodes_eval_dependencies
std::shared_ptr< bNodeTreeZones > last_valid_zones
std::atomic< int > allow_use_dirty_topology_cache
Vector< bNodeSocket * > input_sockets
KDTree_3d * tree
#define str(s)
#define this
#define T
bool topology_cache_is_available(const bNodeTree &tree)
void preprocess_geometry_node_tree_for_evaluation(bNodeTree &tree_cow)
CustomIDVectorSet< bNode *, NodeIDGetter > NodeIDVectorSet
bNodeType NodeTypeUndefined
Definition node.cc:122
bNodeType * node_type_find(StringRef idname)
Definition node.cc:2711
uint64_t get_default_hash(const T &v, const Args &...args)
Definition BLI_hash.hh:233
VecBase< float, 2 > float2
VectorSet< T, InlineBufferCapacity, DefaultProbingStrategy, CustomIDHash< T, GetIDFn >, CustomIDEqual< T, GetIDFn > > CustomIDVectorSet
std::mutex Mutex
Definition BLI_mutex.hh:47
bNodeSocketRuntimeHandle * runtime
void * default_value
bNodeTreeRuntimeHandle * runtime
int nested_node_refs_num
bNestedNodeRef * nested_node_refs
bNodeTreeInterface tree_interface
bNodeTypeHandle * typeinfo
int num_panel_states
char name[64]
bNodePanelState * panel_states_array
int16_t type_legacy
bNodeRuntimeHandle * runtime
char label[64]
int32_t identifier
Map< int, std::string > graph_by_zone_id
int32_t operator()(const bNode *value) const
bNodeLink * try_find(bNodeTree &ntree) const
NodeLinkKey(const bNodeLink &link)
BLI_STRUCT_EQUALITY_OPERATORS_3(NodeLinkKey, to_node_id_, input_socket_index_, input_link_index_)