[Bf-blender-cvs] [57ecab55090] node-tree-update-refactor: progress

Jacques Lucke noreply at git.blender.org
Mon Nov 15 19:09:21 CET 2021


Commit: 57ecab550901f664e8bdc8062ab607dd07f36ca5
Author: Jacques Lucke
Date:   Mon Nov 15 13:59:07 2021 +0100
Branches: node-tree-update-refactor
https://developer.blender.org/rB57ecab550901f664e8bdc8062ab607dd07f36ca5

progress

===================================================================

M	source/blender/blenkernel/intern/node_tree_update.cc

===================================================================

diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc
index b1103e3175b..0ed21a847fc 100644
--- a/source/blender/blenkernel/intern/node_tree_update.cc
+++ b/source/blender/blenkernel/intern/node_tree_update.cc
@@ -15,14 +15,73 @@
  */
 
 #include "BLI_map.hh"
+#include "BLI_multi_value_map.hh"
 
+#include "DNA_modifier_types.h"
 #include "DNA_node_types.h"
 
+#include "BKE_main.h"
 #include "BKE_node.h"
 #include "BKE_node_tree_update.h"
 
 namespace blender::bke {
 
+using TreeNodePair = std::pair<bNodeTree *, bNode *>;
+using ObjectModifierPair = std::pair<Object *, ModifierData *>;
+
+struct NodeTreeRelations {
+ private:
+  Main *bmain_;
+  std::optional<MultiValueMap<bNodeTree *, TreeNodePair>> group_node_users_;
+  std::optional<MultiValueMap<bNodeTree *, ObjectModifierPair>> modifiers_users_;
+
+ public:
+  NodeTreeRelations(Main &bmain) : bmain_(&bmain)
+  {
+  }
+
+  void ensure_group_node_users()
+  {
+    if (group_node_users_.has_value()) {
+      return;
+    }
+
+    group_node_users_.emplace();
+    FOREACH_NODETREE_BEGIN (bmain_, ntree, id) {
+      LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+        if (node->id == nullptr) {
+          continue;
+        }
+        ID *id = node->id;
+        if (GS(id->name) == ID_NT) {
+          bNodeTree *group = (bNodeTree *)id;
+          group_node_users_->add(group, {ntree, node});
+        }
+      }
+    }
+    FOREACH_NODETREE_END;
+  }
+
+  void ensure_modifier_users()
+  {
+    if (modifiers_users_.has_value()) {
+      return;
+    }
+
+    modifiers_users_.emplace();
+    LISTBASE_FOREACH (Object *, object, &bmain_->objects) {
+      LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
+        if (md->type == eModifierType_Nodes) {
+          NodesModifierData *nmd = (NodesModifierData *)md;
+          if (nmd->node_group != nullptr) {
+            modifiers_users_->add(nmd->node_group, {object, md});
+          }
+        }
+      }
+    }
+  }
+};
+
 class NodeTreeMainUpdater {
  private:
   Main *bmain_;



More information about the Bf-blender-cvs mailing list