[Bf-blender-cvs] [6239e089cf8] master: Nodes: cache children of frame nodes
Iliya Katueshenock
noreply at git.blender.org
Fri Nov 18 11:22:05 CET 2022
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. @@
More information about the Bf-blender-cvs
mailing list