[Bf-blender-cvs] [36bf158e5c1] node-tree-update-refactor: progress
Jacques Lucke
noreply at git.blender.org
Mon Nov 15 19:09:21 CET 2021
Commit: 36bf158e5c184e048d59d3da202c8e1a5a109140
Author: Jacques Lucke
Date: Thu Nov 11 15:03:51 2021 +0100
Branches: node-tree-update-refactor
https://developer.blender.org/rB36bf158e5c184e048d59d3da202c8e1a5a109140
progress
===================================================================
M source/blender/blenkernel/BKE_node_tree_update.h
M source/blender/blenkernel/intern/linestyle.c
M source/blender/blenkernel/intern/node.cc
M source/blender/blenkernel/intern/node_tree_update.cc
M source/blender/blenloader/intern/versioning_280.c
M source/blender/blenloader/intern/versioning_300.c
M source/blender/blenloader/intern/versioning_cycles.c
M source/blender/editors/include/ED_node.h
M source/blender/editors/sculpt_paint/paint_image_proj.c
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/editors/space_node/node_templates.cc
M source/blender/editors/transform/transform_convert_node.c
M source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
M source/blender/io/collada/Materials.cpp
M source/blender/io/usd/intern/usd_reader_material.cc
M source/blender/makesrna/intern/rna_nodetree.c
M source/blender/modifiers/intern/MOD_nodes.cc
M source/blender/nodes/intern/node_exec.cc
M source/blender/nodes/shader/node_shader_tree.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_node_tree_update.h b/source/blender/blenkernel/BKE_node_tree_update.h
index c4d742c1d0d..83183a61ce3 100644
--- a/source/blender/blenkernel/BKE_node_tree_update.h
+++ b/source/blender/blenkernel/BKE_node_tree_update.h
@@ -35,29 +35,23 @@ extern "C" {
* Tag tree as changed without providing any more information about what has changed exactly.
* The update process has to assume that everything may have changed.
*/
-void BKE_node_tree_update_tag(struct bNodeTree *tree);
+void BKE_node_tree_update_tag(struct bNodeTree *ntree);
/**
* More specialized tag functions that may result in a more efficient update.
*/
-void BKE_node_tree_update_tag_node(struct bNodeTree *tree, struct bNode *node);
-void BKE_node_tree_update_tag_socket(struct bNodeTree *tree, struct bNodeSocket *socket);
-void BKE_node_tree_update_tag_link(struct bNodeTree *tree);
-void BKE_node_tree_update_tag_node_removed(struct bNodeTree *tree);
-void BKE_node_tree_update_tag_node_added(struct bNodeTree *tree, struct bNode *node);
-void BKE_node_tree_update_tag_link_removed(struct bNodeTree *tree);
-void BKE_node_tree_update_tag_link_added(struct bNodeTree *tree, struct bNodeLink *link);
-void BKE_node_tree_update_tag_link_mute(struct bNodeTree *tree, struct bNodeLink *link);
-void BKE_node_tree_update_tag_missing_runtime_data(struct bNodeTree *tree);
-void BKE_node_tree_update_tag_interface(struct bNodeTree *tree);
+void BKE_node_tree_update_tag_node(struct bNodeTree *ntree, struct bNode *node);
+void BKE_node_tree_update_tag_socket(struct bNodeTree *ntree, struct bNodeSocket *socket);
+void BKE_node_tree_update_tag_link(struct bNodeTree *ntree);
+void BKE_node_tree_update_tag_node_removed(struct bNodeTree *ntree);
+void BKE_node_tree_update_tag_node_added(struct bNodeTree *ntree, struct bNode *node);
+void BKE_node_tree_update_tag_link_removed(struct bNodeTree *ntree);
+void BKE_node_tree_update_tag_link_added(struct bNodeTree *ntree, struct bNodeLink *link);
+void BKE_node_tree_update_tag_link_mute(struct bNodeTree *ntree, struct bNodeLink *link);
+void BKE_node_tree_update_tag_missing_runtime_data(struct bNodeTree *ntree);
+void BKE_node_tree_update_tag_interface(struct bNodeTree *ntree);
typedef struct NodeTreeUpdateExtraParams {
- /**
- * Hint to the update function that this is the only tree that has been tagged for update. Under
- * some circumstances checking the entirety of #bmain can be avoided with that.
- */
- struct bNodeTree *only_tagged_tree;
-
/**
* Data passed into the callbacks.
*/
@@ -86,6 +80,19 @@ typedef struct NodeTreeUpdateExtraParams {
*/
void BKE_node_tree_update_main(struct Main *bmain, struct NodeTreeUpdateExtraParams *params);
+/**
+ * Same as #BKE_node_tree_update_main, but will first only look at the provided tree and only looks
+ * at #bmain when something relevant for other data-blocks changed.
+ *
+ * If #bmain is null, only the provided tree is updated. This should only be used in very rare
+ * cases because it may result it incorrectly synced data in DNA.
+ *
+ * If #tree is null, this will update everything.
+ */
+void BKE_node_tree_update_main_rooted(struct Main *bmain,
+ struct bNodeTree *ntree,
+ struct NodeTreeUpdateExtraParams *params);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c
index 3c305d1fb3f..8e473f7795d 100644
--- a/source/blender/blenkernel/intern/linestyle.c
+++ b/source/blender/blenkernel/intern/linestyle.c
@@ -50,6 +50,7 @@
#include "BKE_linestyle.h"
#include "BKE_main.h"
#include "BKE_node.h"
+#include "BKE_node_tree_update.h"
#include "BKE_texture.h"
#include "BLO_read_write.h"
@@ -2087,5 +2088,5 @@ void BKE_linestyle_default_shader(const bContext *C, FreestyleLineStyle *linesty
tosock = BLI_findlink(&output_linestyle->inputs, 0); /* Color */
nodeAddLink(ntree, input_texure, fromsock, output_linestyle, tosock);
- ntreeUpdateTree(CTX_data_main(C), ntree);
+ BKE_node_tree_update_main_rooted(CTX_data_main(C), ntree, NULL);
}
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index f075e8c1209..f8e23da5222 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -4522,92 +4522,6 @@ static void ntree_validate_links(bNodeTree *ntree)
}
}
-namespace blender::bke::tree_update_order {
-
-enum class Mark {
- None,
- Temporary,
- Permanent,
-};
-
-static bool visit(bNodeTree *ntree,
- Map<bNodeTree *, Mark> &marks,
- Map<bNodeTree *, Set<bNodeTree *>> &dependent_trees_map,
- Vector<bNodeTree *> &sorted_trees)
-{
- Mark &mark = marks.lookup(ntree);
- if (mark == Mark::Permanent) {
- return true;
- }
- if (mark == Mark::Temporary) {
- /* Cyclic dependencies between graphs. */
- return false;
- }
-
- mark = Mark::Temporary;
-
- for (bNodeTree *dependent_tree : dependent_trees_map.lookup(ntree)) {
- visit(dependent_tree, marks, dependent_trees_map, sorted_trees);
- }
-
- mark = Mark::Permanent;
- sorted_trees.append(ntree);
- return true;
-}
-
-static Vector<bNodeTree *> get_tree_update_order(Main *main, const Span<bNodeTree *> changed_trees)
-{
- /* Find all dependencies between node trees. */
- Map<bNodeTree *, Set<bNodeTree *>> dependent_trees_map;
- FOREACH_NODETREE_BEGIN (main, ntree, owner_id) {
- /* Ensure there is an entry for all trees which simplifies the code below. */
- dependent_trees_map.lookup_or_add_default(ntree);
- LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
- if (node->id == nullptr) {
- continue;
- }
- if (GS(node->id->name) != ID_NT) {
- continue;
- }
- bNodeTree *used_ntree = (bNodeTree *)node->id;
- dependent_trees_map.lookup_or_add_default(used_ntree).add(ntree);
- }
- }
- FOREACH_NODETREE_END;
-
- /* Find all trees that have to be updated. */
- Map<bNodeTree *, Mark> marks;
- VectorSet<bNodeTree *> trees_to_check = changed_trees;
- while (!trees_to_check.is_empty()) {
- bNodeTree *ntree = trees_to_check.pop();
- if (!marks.add(ntree, Mark::None)) {
- /* Handled already. */
- continue;
- }
- const Set<bNodeTree *> &dependent_trees = dependent_trees_map.lookup(ntree);
- for (bNodeTree *dependent_tree : dependent_trees) {
- if (marks.contains(dependent_tree)) {
- continue;
- }
- trees_to_check.add(dependent_tree);
- }
- }
-
- /* Sort trees that have to be updated. */
- Vector<bNodeTree *> sorted_trees;
- for (const auto item : marks.items()) {
- if (item.value == Mark::None) {
- visit(item.key, marks, dependent_trees_map, sorted_trees);
- }
- }
-
- /* Above the nodes were sorted in the wrong direction to avoid inverting the dependency map. */
- std::reverse(sorted_trees.begin(), sorted_trees.end());
- return sorted_trees;
-}
-
-} // namespace blender::bke::tree_update_order
-
void ntreeUpdateAllNew(Main *main)
{
Vector<bNodeTree *> new_ntrees;
@@ -4617,22 +4531,17 @@ void ntreeUpdateAllNew(Main *main)
* might have been set in file reading or versioning. */
FOREACH_NODETREE_BEGIN (main, ntree, owner_id) {
if (owner_id->tag & LIB_TAG_NEW) {
- new_ntrees.append(ntree);
- }
- }
- FOREACH_NODETREE_END;
-
- Vector<bNodeTree *> ntrees_to_update = blender::bke::tree_update_order::get_tree_update_order(
- main, new_ntrees);
- for (bNodeTree *ntree : ntrees_to_update) {
- LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
- if (node->typeinfo->group_update_func) {
- node->typeinfo->group_update_func(ntree, node);
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ /* TODO: Move to update function. */
+ if (node->typeinfo->group_update_func) {
+ node->typeinfo->group_update_func(ntree, node);
+ }
}
+ BKE_node_tree_update_tag(ntree);
}
-
- ntreeUpdateTree(nullptr, ntree);
}
+ FOREACH_NODETREE_END;
+ BKE_node_tree_update_main(main, nullptr);
}
static FieldInferencingInterface *node_field_inferencing_interface_copy(
diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc
index 2b05f88ffc4..37943647cf3 100644
--- a/source/blender/blenkernel/intern/node_tree_update.cc
+++ b/source/blender/blenkernel/intern/node_tree_update.cc
@@ -21,83 +21,92 @@
#include "BKE_node.h"
#include "BKE_node_tree_update.h"
-void BKE_node_tree_update_tag(bNodeTree *tree)
+void BKE_node_tree_update_tag(bNodeTree *ntree)
{
- tree->changed_flag |= NTREE_CHANGED_ANY;
- UNUSED_VARS(tree);
+ ntree->changed_flag |= NTREE_CHANGED_ANY;
+ ntree->update |= NTREE_UPDATE;
}
-void BKE_node_tree_update_tag_node(bNodeTree *tree, bNode *node)
+void BKE_node_tree_update_tag_node(bNodeTree *ntree, bNode *node)
{
- tree->changed_flag |= NTREE_CHANGED_NODE;
+ ntree->changed_flag |= NTREE_CHANGED_NODE;
node->changed_flag |= NODE_CHANGED_ANY;
- tree->update |= NTREE_UPDATE;
+ ntree->update |= NTREE_UPDATE;
}
-void BKE_node_tree_update_tag_socket(bNodeTree *tree, bNodeSocket *socket)
+void BKE_node_tree_update_tag_socket(bNodeTree *ntree, bNodeSocket *socket)
{
- tree->changed_flag |= NTREE_CHANGED_SOCKET;
+ ntree->changed_flag |= NTREE_CHANGED_SOCKET;
socket->changed_flag |= SOCK_CHANGED_ANY;
- tree->update |= NTREE_UPDATE;
+ ntree->update |= NTREE_UPDATE;
}
-void BKE_node_tree_update_tag_node_removed(bNodeTree *tree)
+void BKE_node_tree_update_tag_node_removed(bNodeTree *ntree)
{
- tree->changed_flag |= NTREE_CHANGED_REMOVED_ANY;
- tree->update |= NTREE_UPDATE;
+ ntree->changed_flag |= NTREE_CHANGED_REMOVED_ANY;
+ ntree->update |= NTREE_UPDATE;
}
-void BKE_node_tree_update_tag_link(bNodeTree *tree)
+void BKE_node_tree_update_tag_link(bNodeTree *ntree)
{
- tree->changed_flag |= NTREE_CHANGED_LINK;
- tree->update |= NTREE_UPDATE;
+ ntree->changed_flag |= NTREE_CHANGED_LINK;
+ ntree->update |= NTREE_UPDATE;
}
-void BKE_node_tree_update_tag_node_added(bNodeTree *tree, bNode *node)
+void BKE_n
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list