[Bf-blender-cvs] [b4c3ea26443] master: Cleanup: move internal links of nodes to runtime data
Jacques Lucke
noreply at git.blender.org
Fri Nov 18 13:47:16 CET 2022
Commit: b4c3ea264439158df70e837e20f8dd9ec548de2d
Author: Jacques Lucke
Date: Fri Nov 18 13:46:21 2022 +0100
Branches: master
https://developer.blender.org/rBb4c3ea264439158df70e837e20f8dd9ec548de2d
Cleanup: move internal links of nodes to runtime data
No functional changes are expected.
===================================================================
M source/blender/blenkernel/BKE_node.h
M source/blender/blenkernel/BKE_node_runtime.hh
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/blenloader/intern/versioning_260.c
M source/blender/compositor/intern/COM_NodeGraph.cc
M source/blender/editors/space_node/node_draw.cc
M source/blender/makesdna/DNA_node_types.h
M source/blender/makesrna/intern/rna_nodetree.c
M source/blender/nodes/intern/derived_node_tree.cc
M source/blender/nodes/intern/geometry_nodes_lazy_function.cc
M source/blender/nodes/intern/node_exec.cc
M source/blender/nodes/intern/node_socket.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 2361d902d61..7efc28a3ab3 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -690,6 +690,7 @@ void nodeRemoveNode(struct Main *bmain,
void nodeDimensionsGet(const struct bNode *node, float *r_width, float *r_height);
void nodeTagUpdateID(struct bNode *node);
+void nodeInternalLinks(struct bNode *node, struct bNodeLink ***r_links, int *r_len);
#ifdef __cplusplus
diff --git a/source/blender/blenkernel/BKE_node_runtime.hh b/source/blender/blenkernel/BKE_node_runtime.hh
index 60a9fec7776..831b5330a2f 100644
--- a/source/blender/blenkernel/BKE_node_runtime.hh
+++ b/source/blender/blenkernel/BKE_node_runtime.hh
@@ -186,10 +186,12 @@ class bNodeRuntime : NonCopyable, NonMovable {
/** Offset that will be added to locx for insert offset animation. */
float anim_ofsx;
+ /** List of cached internal links (input to output), for muted nodes and operators. */
+ Vector<bNodeLink *> internal_links;
+
/** Only valid if #topology_cache_is_dirty is false. */
Vector<bNodeSocket *> inputs;
Vector<bNodeSocket *> outputs;
- Vector<bNodeLink *> internal_links;
Map<StringRefNull, bNodeSocket *> inputs_by_identifier;
Map<StringRefNull, bNodeSocket *> outputs_by_identifier;
int index_in_tree = -1;
@@ -481,9 +483,8 @@ inline bool bNode::is_group_output() const
return this->type == NODE_GROUP_OUTPUT;
}
-inline blender::Span<const bNodeLink *> bNode::internal_links_span() const
+inline blender::Span<const bNodeLink *> bNode::internal_links() const
{
- BLI_assert(blender::bke::node_tree_runtime::topology_cache_is_available(*this));
return this->runtime->internal_links;
}
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index b92dea6bfc6..81ee2bdd34b 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -699,8 +699,6 @@ void ntreeBlendReadData(BlendDataReader *reader, ID *owner_id, bNodeTree *ntree)
BLO_read_data_address(reader, &node->prop);
IDP_BlendDataRead(reader, &node->prop);
- BLI_listbase_clear(&node->internal_links);
-
if (node->type == CMP_NODE_MOVIEDISTORTION) {
/* Do nothing, this is runtime cache and hence handled by generic code using
* `IDTypeInfo.foreach_cache` callback. */
@@ -1970,11 +1968,12 @@ void nodeRemoveSocketEx(struct bNodeTree *ntree,
}
}
- LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &node->internal_links) {
+ for (bNodeLink *link : node->runtime->internal_links) {
if (link->fromsock == sock || link->tosock == sock) {
- BLI_remlink(&node->internal_links, link);
+ node->runtime->internal_links.remove_first_occurrence_and_reorder(link);
MEM_freeN(link);
BKE_ntree_update_tag_node_internal_link(ntree, node);
+ break;
}
}
@@ -1996,7 +1995,10 @@ void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
}
}
- BLI_freelistN(&node->internal_links);
+ for (bNodeLink *link : node->runtime->internal_links) {
+ MEM_freeN(link);
+ }
+ node->runtime->internal_links.clear();
LISTBASE_FOREACH_MUTABLE (bNodeSocket *, sock, &node->inputs) {
node_socket_free(sock, true);
@@ -2304,14 +2306,14 @@ bNode *node_copy_with_mapping(bNodeTree *dst_tree,
node_dst->prop = IDP_CopyProperty_ex(node_src.prop, flag);
}
- BLI_listbase_clear(&node_dst->internal_links);
- LISTBASE_FOREACH (const bNodeLink *, src_link, &node_src.internal_links) {
+ node_dst->runtime->internal_links.clear();
+ for (const bNodeLink *src_link : node_src.runtime->internal_links) {
bNodeLink *dst_link = (bNodeLink *)MEM_dupallocN(src_link);
dst_link->fromnode = node_dst;
dst_link->tonode = node_dst;
dst_link->fromsock = socket_map.lookup(src_link->fromsock);
dst_link->tosock = socket_map.lookup(src_link->tosock);
- BLI_addtail(&node_dst->internal_links, dst_link);
+ node_dst->runtime->internal_links.append(dst_link);
}
if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
@@ -2469,7 +2471,7 @@ static void adjust_multi_input_indices_after_removed_link(bNodeTree *ntree,
void nodeInternalRelink(bNodeTree *ntree, bNode *node)
{
/* store link pointers in output sockets, for efficient lookup */
- LISTBASE_FOREACH (bNodeLink *, link, &node->internal_links) {
+ for (bNodeLink *link : node->runtime->internal_links) {
link->tosock->link = link;
}
@@ -2977,7 +2979,10 @@ static void node_free_node(bNodeTree *ntree, bNode *node)
MEM_freeN(sock);
}
- BLI_freelistN(&node->internal_links);
+ for (bNodeLink *link : node->runtime->internal_links) {
+ MEM_freeN(link);
+ }
+ node->runtime->internal_links.clear();
if (node->prop) {
/* Remember, no ID user refcount management here! */
@@ -3763,6 +3768,12 @@ void nodeTagUpdateID(bNode *node)
node->runtime->update |= NODE_UPDATE_ID;
}
+void nodeInternalLinks(bNode *node, bNodeLink ***r_links, int *r_len)
+{
+ *r_links = node->runtime->internal_links.data();
+ *r_len = node->runtime->internal_links.size();
+}
+
/* ************** Node Clipboard *********** */
#define USE_NODE_CB_VALIDATE
diff --git a/source/blender/blenkernel/intern/node_runtime.cc b/source/blender/blenkernel/intern/node_runtime.cc
index 712a740bdb7..61f0bab9fef 100644
--- a/source/blender/blenkernel/intern/node_runtime.cc
+++ b/source/blender/blenkernel/intern/node_runtime.cc
@@ -67,21 +67,6 @@ static void update_link_vector(const bNodeTree &ntree)
}
}
-static void update_internal_links(const bNodeTree &ntree)
-{
- bNodeTreeRuntime &tree_runtime = *ntree.runtime;
- for (bNode *node : tree_runtime.nodes) {
- node->runtime->internal_links.clear();
- for (bNodeSocket *socket : node->runtime->outputs) {
- socket->runtime->internal_link_input = nullptr;
- }
- LISTBASE_FOREACH (bNodeLink *, link, &node->internal_links) {
- node->runtime->internal_links.append(link);
- link->tosock->runtime->internal_link_input = link->fromsock;
- }
- }
-}
-
static void update_socket_vectors_and_owner_node(const bNodeTree &ntree)
{
bNodeTreeRuntime &tree_runtime = *ntree.runtime;
@@ -431,7 +416,6 @@ static void ensure_topology_cache(const bNodeTree &ntree)
update_node_vector(ntree);
update_link_vector(ntree);
update_socket_vectors_and_owner_node(ntree);
- update_internal_links(ntree);
update_directly_linked_links_and_sockets(ntree);
threading::parallel_invoke(
tree_runtime.nodes.size() > 32,
diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc
index d068e150f25..3100a242c7d 100644
--- a/source/blender/blenkernel/intern/node_tree_update.cc
+++ b/source/blender/blenkernel/intern/node_tree_update.cc
@@ -1137,7 +1137,7 @@ class NodeTreeMainUpdater {
}
}
/* Rebuilt internal links if they have changed. */
- if (node->internal_links_span().size() != expected_internal_links.size()) {
+ if (node->runtime->internal_links.size() != expected_internal_links.size()) {
this->update_internal_links_in_node(ntree, *node, expected_internal_links);
}
else {
@@ -1145,7 +1145,7 @@ class NodeTreeMainUpdater {
const bNodeSocket *from_socket = item.first;
const bNodeSocket *to_socket = item.second;
bool found = false;
- for (const bNodeLink *internal_link : node->internal_links_span()) {
+ for (const bNodeLink *internal_link : node->runtime->internal_links) {
if (from_socket == internal_link->fromsock && to_socket == internal_link->tosock) {
found = true;
}
@@ -1192,7 +1192,9 @@ class NodeTreeMainUpdater {
bNode &node,
Span<std::pair<bNodeSocket *, bNodeSocket *>> links)
{
- BLI_freelistN(&node.internal_links);
+ for (bNodeLink *link : node.runtime->internal_links) {
+ MEM_freeN(link);
+ }
for (const auto &item : links) {
bNodeSocket *from_socket = item.first;
bNodeSocket *to_socket = item.second;
@@ -1202,7 +1204,7 @@ class NodeTreeMainUpdater {
link->tonode = &node;
link->tosock = to_socket;
link->flag |= NODE_LINK_VALID;
- BLI_addtail(&node.internal_links, link);
+ node.runtime->internal_links.append(link);
}
BKE_ntree_update_tag_node_internal_link(&ntree, &node);
}
diff --git a/source/blender/blenloader/intern/versioning_260.c b/source/blender/blenloader/intern/versioning_260.c
index 47a1f7f7241..504de311f7e 100644
--- a/source/blender/blenloader/intern/versioning_260.c
+++ b/source/blender/blenloader/intern/versioning_260.c
@@ -1707,26 +1707,6 @@ void blo_do_versions_260(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
- if (!MAIN_VERSION_ATLEAST(bmain, 264, 6)) {
- /* Fix for bug T32982, internal_links list could get corrupted from r51630 onward.
- * Simply remove bad internal_links lists to avoid NULL pointers.
- */
- FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
- bNode *node;
- bNodeLink *link, *nextlink;
-
- for (node = ntree->nodes.first; node; node = node->next) {
- for (link = node->internal_links.first; link; link = nextlink) {
- nextlink = link->next;
- if (!link->fromnode || !link->fromsock || !link->tonode || !link->tosock) {
- BLI_remlink(&node->internal_links, link);
- }
- }
- }
- }
- FOREACH_NODETREE_END;
- }
-
if (!MAIN_VERSION_ATLEAST(bmain, 264, 7)) {
/* convert tiles size from resolution and number of tiles */
{
diff --git a/source/blender/compositor/intern/COM_NodeGraph.cc b/source/blender/compositor/intern/COM_NodeGraph.cc
index b38ac804cf5..34a145f6bf5 100644
--- a/source/blender/compositor/intern/COM_NodeGraph.cc
+++ b/source/blender/compositor/intern/COM_NodeGraph.cc
@@ -6,6 +6,7 @@
#include "DNA_node_types.h"
#include "BKE_node.h"
+#include "BKE_node_runtime.hh"
#include "COM_Converter.h"
#include "COM_Debug.h"
@@ -180,8 +181,7 @@ void
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list