[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