Commit: 6239e089cf8e826c7fb99fb8a2a77229f5ccdac3 Author: Iliya Katueshenock Date: Fri Nov 18 11:20:13 2022 +0100 Branches: master https://developer.blender.org/rB6239e089cf8e826c7fb99fb8a2a77229f5ccdac3
Nodes: cache children of frame nodes This allows for optimizations because one does not have to iterate over all nodes anymore to find all nodes within a frame. Differential Revision: https://developer.blender.org/D16106 =================================================================== M source/blender/blenkernel/BKE_node.h M source/blender/blenkernel/BKE_node_runtime.hh M source/blender/blenkernel/BKE_node_tree_update.h M source/blender/blenkernel/intern/node.cc M source/blender/blenkernel/intern/node_runtime.cc M source/blender/blenkernel/intern/node_tree_update.cc M source/blender/editors/space_node/node_add.cc M source/blender/editors/space_node/node_edit.cc M source/blender/editors/space_node/node_group.cc M source/blender/editors/space_node/node_relationships.cc M source/blender/makesdna/DNA_node_types.h M source/blender/makesrna/intern/rna_nodetree.c =================================================================== diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 1a36f3be0b2..b6a6fd00b7e 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -730,8 +730,8 @@ void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node); void nodeToView(const struct bNode *node, float x, float y, float *rx, float *ry); void nodeFromView(const struct bNode *node, float x, float y, float *rx, float *ry); bool nodeAttachNodeCheck(const struct bNode *node, const struct bNode *parent); -void nodeAttachNode(struct bNode *node, struct bNode *parent); -void nodeDetachNode(struct bNode *node); +void nodeAttachNode(struct bNodeTree *ntree, struct bNode *node, struct bNode *parent); +void nodeDetachNode(struct bNodeTree *ntree, struct bNode *node); void nodePositionRelative(struct bNode *from_node, struct bNode *to_node, diff --git a/source/blender/blenkernel/BKE_node_runtime.hh b/source/blender/blenkernel/BKE_node_runtime.hh index 65c801a087b..5a73dff67ce 100644 --- a/source/blender/blenkernel/BKE_node_runtime.hh +++ b/source/blender/blenkernel/BKE_node_runtime.hh @@ -84,6 +84,7 @@ class bNodeTreeRuntime : NonCopyable, NonMovable { bool has_available_link_cycle = false; bool has_undefined_nodes_or_sockets = false; bNode *group_output_node = nullptr; + Vector<bNode *> root_frames; }; /** @@ -154,6 +155,7 @@ class bNodeRuntime : NonCopyable, NonMovable { int index_in_tree = -1; bool has_available_linked_inputs = false; bool has_available_linked_outputs = false; + Vector<bNode *> direct_children_in_frame; bNodeTree *owner_tree = nullptr; }; @@ -323,6 +325,12 @@ inline blender::Span<bNodeSocket *> bNodeTree::all_sockets() return this->runtime->sockets; } +inline blender::Span<bNode *> bNodeTree::root_frames() const +{ + BLI_assert(blender::bke::node_tree_runtime::topology_cache_is_available(*this)); + return this->runtime->root_frames; +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -439,6 +447,13 @@ inline blender::Span<const bNodeLink *> bNode::internal_links_span() const return this->runtime->internal_links; } +inline blender::Span<bNode *> bNode::direct_children_in_frame() const +{ + BLI_assert(blender::bke::node_tree_runtime::topology_cache_is_available(*this)); + BLI_assert(this->is_frame()); + return this->runtime->direct_children_in_frame; +} + inline const blender::nodes::NodeDeclaration *bNode::declaration() const { return this->runtime->declaration; diff --git a/source/blender/blenkernel/BKE_node_tree_update.h b/source/blender/blenkernel/BKE_node_tree_update.h index 801ba22b3e9..eafcf0fb8a1 100644 --- a/source/blender/blenkernel/BKE_node_tree_update.h +++ b/source/blender/blenkernel/BKE_node_tree_update.h @@ -54,6 +54,8 @@ void BKE_ntree_update_tag_active_output_changed(struct bNodeTree *ntree); void BKE_ntree_update_tag_missing_runtime_data(struct bNodeTree *ntree); /** Used when the interface sockets/values have changed. */ void BKE_ntree_update_tag_interface(struct bNodeTree *ntree); +/** Used when change parent node. */ +void BKE_ntree_update_tag_parent_change(struct bNodeTree *ntree, struct bNode *node); /** Used when an id data block changed that might be used by nodes that need to be updated. */ void BKE_ntree_update_tag_id_changed(struct Main *bmain, struct ID *id); /** Used when an image user is updated that is used by any part of the node tree. */ diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 96165fb6209..c3b1470f820 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -2571,7 +2571,7 @@ bool nodeAttachNodeCheck(const bNode *node, const bNode *parent) return false; } -void nodeAttachNode(bNode *node, bNode *parent) +void nodeAttachNode(bNodeTree *ntree, bNode *node, bNode *parent) { BLI_assert(parent->type == NODE_FRAME); BLI_assert(nodeAttachNodeCheck(parent, node) == false); @@ -2580,11 +2580,12 @@ void nodeAttachNode(bNode *node, bNode *parent) nodeToView(node, 0.0f, 0.0f, &locx, &locy); node->parent = parent; + BKE_ntree_update_tag_parent_change(ntree, node); /* transform to parent space */ nodeFromView(parent, locx, locy, &node->locx, &node->locy); } -void nodeDetachNode(struct bNode *node) +void nodeDetachNode(bNodeTree *ntree, bNode *node) { if (node->parent) { BLI_assert(node->parent->type == NODE_FRAME); @@ -2595,6 +2596,7 @@ void nodeDetachNode(struct bNode *node) node->locx = locx; node->locy = locy; node->parent = nullptr; + BKE_ntree_update_tag_parent_change(ntree, node); } } @@ -2935,7 +2937,7 @@ static void node_unlink_attached(bNodeTree *ntree, bNode *parent) { LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { if (node->parent == parent) { - nodeDetachNode(node); + nodeDetachNode(ntree, node); } } } diff --git a/source/blender/blenkernel/intern/node_runtime.cc b/source/blender/blenkernel/intern/node_runtime.cc index 4fb0e423a33..712a740bdb7 100644 --- a/source/blender/blenkernel/intern/node_runtime.cc +++ b/source/blender/blenkernel/intern/node_runtime.cc @@ -372,6 +372,36 @@ static void update_toposort(const bNodeTree &ntree, BLI_assert(tree_runtime.nodes.size() == r_sorted_nodes.size()); } +static void update_root_frames(const bNodeTree &ntree) +{ + bNodeTreeRuntime &tree_runtime = *ntree.runtime; + Span<bNode *> nodes = tree_runtime.nodes; + + tree_runtime.root_frames.clear(); + + for (bNode *node : nodes) { + if (!node->parent && node->is_frame()) { + tree_runtime.root_frames.append(node); + } + } +} + +static void update_direct_frames_childrens(const bNodeTree &ntree) +{ + bNodeTreeRuntime &tree_runtime = *ntree.runtime; + Span<bNode *> nodes = tree_runtime.nodes; + + for (bNode *node : nodes) { + node->runtime->direct_children_in_frame.clear(); + } + + for (bNode *node : nodes) { + if (const bNode *frame = node->parent) { + frame->runtime->direct_children_in_frame.append(node); + } + } +} + static void update_group_output_node(const bNodeTree &ntree) { bNodeTreeRuntime &tree_runtime = *ntree.runtime; @@ -403,22 +433,26 @@ static void ensure_topology_cache(const bNodeTree &ntree) update_socket_vectors_and_owner_node(ntree); update_internal_links(ntree); update_directly_linked_links_and_sockets(ntree); - threading::parallel_invoke([&]() { update_logical_origins(ntree); }, - [&]() { update_nodes_by_type(ntree); }, - [&]() { update_sockets_by_identifier(ntree); }, - [&]() { - update_toposort(ntree, - ToposortDirection::LeftToRight, - tree_runtime.toposort_left_to_right, - tree_runtime.has_available_link_cycle); - }, - [&]() { - bool dummy; - update_toposort(ntree, - ToposortDirection::RightToLeft, - tree_runtime.toposort_right_to_left, - dummy); - }); + threading::parallel_invoke( + tree_runtime.nodes.size() > 32, + [&]() { update_logical_origins(ntree); }, + [&]() { update_nodes_by_type(ntree); }, + [&]() { update_sockets_by_identifier(ntree); }, + [&]() { + update_toposort(ntree, + ToposortDirection::LeftToRight, + tree_runtime.toposort_left_to_right, + tree_runtime.has_available_link_cycle); + }, + [&]() { + bool dummy; + update_toposort(ntree, + ToposortDirection::RightToLeft, + tree_runtime.toposort_right_to_left, + dummy); + }, + [&]() { update_root_frames(ntree); }, + [&]() { update_direct_frames_childrens(ntree); }); update_group_output_node(ntree); tree_runtime.topology_cache_exists = true; }); diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc index 707bb83a3bc..7b6c7954508 100644 --- a/source/blender/blenkernel/intern/node_tree_update.cc +++ b/source/blender/blenkernel/intern/node_tree_update.cc @@ -44,6 +44,7 @@ enum eNodeTreeChangedFlag { NTREE_CHANGED_REMOVED_SOCKET = (1 << 7), NTREE_CHANGED_SOCKET_PROPERTY = (1 << 8), NTREE_CHANGED_INTERNAL_LINK = (1 << 9), + NTREE_CHANGED_PARENT = (1 << 10), NTREE_CHANGED_ALL = -1, }; @@ -1704,6 +1705,11 @@ void BKE_ntree_update_tag_interface(bNodeTree *ntree) add_tree_tag(ntree, NTREE_CHANGED_INTERFACE); } +void BKE_ntree_update_tag_parent_change(bNodeTree *ntree, bNode *node) +{ + add_node_tag(ntree, node, NTREE_CHANGED_PARENT); +} + void BKE_ntree_update_tag_id_changed(Main *bmain, ID *id) { FOREACH_NODETREE_BEGIN (bmain, ntree, ntree_id) { diff --git a/source/blender/editors/space_node/node_add.cc b/source/blender/editors/space_node/node_add.cc index 41f70a6d8cf..c18a6bda5d0 100644 --- a/source/blender/editors/space_node/node_add.cc +++ b/source/blender/editors/space_node/node_add.cc @@ -205,7 +205,7 @@ static int add_reroute_exec(bContext *C, wmOperator *op) for (const int i : frame_nodes.index_range()) { bNode *frame_node = frame_nodes.last(i); if (BLI_rctf_isect_pt_v(&frame_node->totr, insert_point)) { - nodeAttachNode(reroute, frame_node); + nodeAttachNode(&ntree, reroute, frame_node); break; } } diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/edito @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs