[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