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

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


Commit: d57ec78e6ec4c4669296a6b837d8cd86123b30cc
Author: Jacques Lucke
Date:   Thu Nov 11 12:51:20 2021 +0100
Branches: node-tree-update-refactor
https://developer.blender.org/rBd57ec78e6ec4c4669296a6b837d8cd86123b30cc

progress

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

M	source/blender/blenkernel/BKE_node_tree_update.h
M	source/blender/blenkernel/intern/node_tree_update.cc
M	source/blender/editors/space_node/CMakeLists.txt
M	source/blender/editors/space_node/node_edit.cc
M	source/blender/makesdna/DNA_node_types.h

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

diff --git a/source/blender/blenkernel/BKE_node_tree_update.h b/source/blender/blenkernel/BKE_node_tree_update.h
index d43e1ba88b2..e54fef2c31e 100644
--- a/source/blender/blenkernel/BKE_node_tree_update.h
+++ b/source/blender/blenkernel/BKE_node_tree_update.h
@@ -24,6 +24,7 @@ struct bNode;
 struct bNodeSocket;
 struct bNodeTree;
 struct Main;
+struct ID;
 
 #ifdef __cplusplus
 extern "C" {
@@ -50,23 +51,25 @@ typedef struct NodeTreeUpdateExtraParams {
    */
   struct bNodeTree *only_tagged_tree;
 
+  void *user_data;
+
   /**
    * Called for every tree that has been changed during the update. This can be used to send
    * notifiers to trigger redraws or depsgraph updates.
    */
-  void (*tree_changed_fn)(struct bNodeTree *);
+  void (*tree_changed_fn)(struct ID *, struct bNodeTree *, void *user_data);
 
   /**
    * Called for every tree whose interface (e.g. input sockets) changed in some way. Other
    * (non-node-tree) data blocks may have to update when that happens.
    */
-  void (*tree_interface_changed_fn)(struct bNodeTree *);
+  void (*tree_interface_changed_fn)(struct ID *, struct bNodeTree *, void *user_data);
 
   /**
    * Called for every tree whose output value may have changed based on the provided update tags.
    * This can be used to tag the depsgraph if necessary.
    */
-  void (*tree_output_changed_fn)(struct bNodeTree *);
+  void (*tree_output_changed_fn)(struct ID *, struct bNodeTree *, void *user_data);
 } NodeTreeUpdateExtraParams;
 
 void BKE_node_tree_update(struct Main *bmain, struct NodeTreeUpdateExtraParams *params);
diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc
index fe275e50087..0079628945e 100644
--- a/source/blender/blenkernel/intern/node_tree_update.cc
+++ b/source/blender/blenkernel/intern/node_tree_update.cc
@@ -16,34 +16,52 @@
 
 #include "BLI_map.hh"
 
+#include "DNA_node_types.h"
+
+#include "BKE_node.h"
 #include "BKE_node_tree_update.h"
 
 void BKE_node_tree_update_tag(bNodeTree *tree)
 {
+  tree->changed_flag |= NTREE_CHANGED_ANY;
   UNUSED_VARS(tree);
 }
 
 void BKE_node_tree_update_tag_node(bNodeTree *tree, bNode *node)
 {
-  UNUSED_VARS(tree, node);
+  tree->changed_flag |= NTREE_CHANGED_NODE;
+  node->changed_flag |= NODE_CHANGED_ANY;
 }
 
 void BKE_node_tree_update_tag_socket(bNodeTree *tree, bNodeSocket *socket)
 {
-  UNUSED_VARS(tree, socket);
+  tree->changed_flag |= NTREE_CHANGED_SOCKET;
+  socket->changed_flag |= SOCK_CHANGED_ANY;
 }
 
 void BKE_node_tree_update_tag_node_removed(bNodeTree *tree)
 {
-  UNUSED_VARS(tree);
+  tree->changed_flag |= NTREE_CHANGED_REMOVED_ANY;
 }
 
 void BKE_node_tree_update_tag_link_removed(bNodeTree *tree)
 {
-  UNUSED_VARS(tree);
+  tree->changed_flag |= NTREE_CHANGED_REMOVED_ANY;
 }
 
 void BKE_node_tree_update(Main *bmain, NodeTreeUpdateExtraParams *params)
 {
-  UNUSED_VARS(bmain, params);
+  FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
+    ntreeUpdateTree(bmain, ntree);
+    if (params->tree_changed_fn) {
+      params->tree_changed_fn(id, ntree, params->user_data);
+    }
+    if (params->tree_interface_changed_fn) {
+      params->tree_interface_changed_fn(id, ntree, params->user_data);
+    }
+    if (params->tree_output_changed_fn) {
+      params->tree_output_changed_fn(id, ntree, params->user_data);
+    }
+  }
+  FOREACH_NODETREE_END;
 }
diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt
index 600309c2c86..677032d42bf 100644
--- a/source/blender/editors/space_node/CMakeLists.txt
+++ b/source/blender/editors/space_node/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
   ../../imbuf
   ../../makesdna
   ../../makesrna
+  ../../modifiers
   ../../nodes
   ../../render
   ../../windowmanager
diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc
index 1a4903e2cfe..d746f703cc6 100644
--- a/source/blender/editors/space_node/node_edit.cc
+++ b/source/blender/editors/space_node/node_edit.cc
@@ -27,6 +27,7 @@
 
 #include "DNA_light_types.h"
 #include "DNA_material_types.h"
+#include "DNA_modifier_types.h"
 #include "DNA_node_types.h"
 #include "DNA_text_types.h"
 #include "DNA_world_types.h"
@@ -41,6 +42,7 @@
 #include "BKE_main.h"
 #include "BKE_material.h"
 #include "BKE_node.h"
+#include "BKE_node_tree_update.h"
 #include "BKE_report.h"
 #include "BKE_scene.h"
 #include "BKE_workspace.h"
@@ -63,6 +65,8 @@
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
+#include "MOD_nodes.h"
+
 #include "WM_api.h"
 #include "WM_types.h"
 
@@ -440,27 +444,75 @@ void snode_notify(bContext *C, SpaceNode *snode)
   }
 }
 
-void ED_node_tree_propagate_change(bContext *C, Main *bmain, bNodeTree *only_tagged_tree)
+static void handle_tree_change(ID *id, bNodeTree *ntree)
 {
-  if (C != nullptr) {
-    SpaceNode *snode = CTX_wm_space_node(C);
-    if (snode != nullptr) {
-      snode_notify(C, snode);
-      snode_dag_update(C, snode);
+  WM_main_add_notifier(NC_NODE | NA_EDITED, nullptr);
+
+  if (ntree->type == NTREE_SHADER) {
+    if (GS(id->name) == ID_MA) {
+      WM_main_add_notifier(NC_MATERIAL | ND_SHADING, id);
+    }
+    else if (GS(id->name) == ID_LA) {
+      WM_main_add_notifier(NC_LAMP | ND_LIGHTING, id);
+    }
+    else if (GS(id->name) == ID_WO) {
+      WM_main_add_notifier(NC_WORLD | ND_WORLD, id);
     }
   }
-  if (only_tagged_tree != nullptr) {
-    ntreeUpdateTree(bmain, only_tagged_tree);
-    ED_node_tag_update_nodetree(bmain, only_tagged_tree, nullptr);
+  else if (ntree->type == NTREE_COMPOSIT) {
+    WM_main_add_notifier(NC_SCENE | ND_NODES, id);
   }
-  else {
-    FOREACH_NODETREE_BEGIN (bmain, tree, id) {
-      ntreeUpdateTree(bmain, tree);
+  else if (ntree->type == NTREE_TEXTURE) {
+    WM_main_add_notifier(NC_TEXTURE | ND_NODES, id);
+  }
+  else if (ntree->type == NTREE_GEOMETRY) {
+    WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, id);
+  }
+}
+
+static void handle_tree_interface_change(Main *bmain, bNodeTree *ntree)
+{
+  if (ntree->type != NTREE_GEOMETRY) {
+    return;
+  }
+  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 == ntree) {
+          MOD_nodes_update_interface(object, nmd);
+        }
+      }
     }
-    FOREACH_NODETREE_END;
   }
 }
 
+void ED_node_tree_propagate_change(bContext *UNUSED(C), Main *bmain, bNodeTree *only_tagged_tree)
+{
+  struct UserData {
+    Main *bmain;
+  } user_data = {bmain};
+
+  NodeTreeUpdateExtraParams params = {0};
+  params.only_tagged_tree = only_tagged_tree;
+  params.user_data = &user_data;
+  params.tree_changed_fn = [](ID *id, bNodeTree *ntree, void *UNUSED(user_data)) {
+    handle_tree_change(id, ntree);
+  };
+  params.tree_interface_changed_fn = [](ID *UNUSED(id), bNodeTree *ntree, void *user_data) {
+    UserData *data = (UserData *)user_data;
+    handle_tree_interface_change(data->bmain, ntree);
+  };
+  params.tree_output_changed_fn = [](ID *id, bNodeTree *ntree, void *UNUSED(user_data)) {
+    if (id != nullptr) {
+      DEG_id_tag_update(id, 0);
+    }
+    DEG_id_tag_update(&ntree->id, 0);
+  };
+
+  BKE_node_tree_update(bmain, &params);
+}
+
 void ED_node_set_tree_type(SpaceNode *snode, bNodeTreeType *typeinfo)
 {
   if (typeinfo) {
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index cfe34d83586..c275e2aacc6 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -172,6 +172,9 @@ typedef struct bNodeSocket {
    * data. It has to be updated when the node declaration changes.
    */
   const SocketDeclarationHandle *declaration;
+
+  uint8_t changed_flag;
+  char _pad[7];
 } bNodeSocket;
 
 /* sock->type */
@@ -261,7 +264,7 @@ typedef struct bNode {
   /** Used as a boolean for execution. */
   uint8_t need_exec;
 
-  char _pad[1];
+  uint8_t changed_flag;
 
   /** Custom user-defined color. */
   float color[3];
@@ -551,7 +554,8 @@ typedef struct bNodeTree {
    * in case multiple different editors are used and make context ambiguous.
    */
   bNodeInstanceKey active_viewer_key;
-  char _pad[4];
+  char _pad[3];
+  uint8_t changed_flag;
 
   /** Execution data.
    *
@@ -576,6 +580,25 @@ typedef struct bNodeTree {
   struct PreviewImage *preview;
 } bNodeTree;
 
+/** bNodeSocket->changed_flag */
+typedef enum eNodeSocketChangedFlag {
+  SOCK_CHANGED_NONE = 0,
+  SOCK_CHANGED_ANY = (1 << 0),
+} eNodeSocketChangedFlag;
+
+typedef enum eNodeChangedFlag {
+  NODE_CHANGED_NONE = 0,
+  NODE_CHANGED_ANY = (1 << 0),
+} eNodeChangedFlag;
+
+typedef enum eNodeTreeChangedFlag {
+  NTREE_CHANGED_None = 0,
+  NTREE_CHANGED_ANY = (1 << 0),
+  NTREE_CHANGED_SOCKET = (1 << 1),
+  NTREE_CHANGED_NODE = (1 << 2),
+  NTREE_CHANGED_REMOVED_ANY = (1 << 3),
+} eNodeTreeChangedFlag;
+
 /* ntree->type, index */
 
 #define NTREE_UNDEFINED -2 /* Represents #NodeTreeTypeUndefined type. */



More information about the Bf-blender-cvs mailing list