[Bf-blender-cvs] [7b82d8f029c] master: Nodes: move most runtime data out of bNode

Jacques Lucke noreply at git.blender.org
Fri Nov 18 12:47:36 CET 2022


Commit: 7b82d8f029cd1088efd5fbb8bf0a9ab40ed2998f
Author: Jacques Lucke
Date:   Fri Nov 18 12:46:20 2022 +0100
Branches: master
https://developer.blender.org/rB7b82d8f029cd1088efd5fbb8bf0a9ab40ed2998f

Nodes: move most runtime data out of bNode

* This patch just moves runtime data to the runtime struct to cleanup
  the dna struct. Arguably, some of this data should not even be there
  because it's very use case specific. This can be cleaned up separately.
* `miniwidth` was removed completely, because it was not used anywhere.
  The corresponding rna property `width_hidden` is kept to avoid
  script breakage, but does not do anything (e.g. node wrangler sets it).
* Since rna is in C, some helper functions where added to access the
  C++ runtime data from rna.
* This size of `bNode` decreases from 432 to 368 bytes.

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/BKE_node_runtime.hh
M	source/blender/blenkernel/intern/node.cc
M	source/blender/blenkernel/intern/node_tree_update.cc
M	source/blender/compositor/intern/COM_NodeOperationBuilder.cc
M	source/blender/editors/space_node/drawnode.cc
M	source/blender/editors/space_node/node_add.cc
M	source/blender/editors/space_node/node_draw.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_select.cc
M	source/blender/editors/space_node/node_view.cc
M	source/blender/editors/transform/transform_convert_node.cc
M	source/blender/editors/transform/transform_snap.cc
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/NOD_composite.h
M	source/blender/nodes/composite/node_composite_tree.cc
M	source/blender/nodes/composite/node_composite_util.cc
M	source/blender/nodes/composite/nodes/node_composite_image.cc
M	source/blender/nodes/composite/nodes/node_composite_switchview.cc
M	source/blender/nodes/intern/node_exec.cc
M	source/blender/nodes/shader/node_shader_tree.cc
M	source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc
M	source/blender/nodes/shader/nodes/node_shader_normal_map.cc
M	source/blender/nodes/shader/nodes/node_shader_subsurface_scattering.cc
M	source/blender/nodes/shader/nodes/node_shader_tex_environment.cc
M	source/blender/nodes/shader/nodes/node_shader_tex_image.cc
M	source/blender/nodes/texture/node_texture_tree.cc
M	source/blender/nodes/texture/node_texture_util.cc
M	source/blender/nodes/texture/node_texture_util.hh
M	source/blender/nodes/texture/nodes/node_texture_common.cc
M	source/blender/nodes/texture/nodes/node_texture_texture.cc

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index b6a6fd00b7e..2361d902d61 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -688,6 +688,9 @@ void nodeRemoveNode(struct Main *bmain,
                     struct bNode *node,
                     bool do_id_user);
 
+void nodeDimensionsGet(const struct bNode *node, float *r_width, float *r_height);
+void nodeTagUpdateID(struct bNode *node);
+
 #ifdef __cplusplus
 
 namespace blender::bke {
diff --git a/source/blender/blenkernel/BKE_node_runtime.hh b/source/blender/blenkernel/BKE_node_runtime.hh
index 5a73dff67ce..60a9fec7776 100644
--- a/source/blender/blenkernel/BKE_node_runtime.hh
+++ b/source/blender/blenkernel/BKE_node_runtime.hh
@@ -146,6 +146,46 @@ class bNodeRuntime : NonCopyable, NonMovable {
   /** #eNodeTreeChangedFlag. */
   uint32_t changed_flag = 0;
 
+  /** Both for dependency and sorting. */
+  short done = 0;
+  short level = 0;
+
+  /** Used as a boolean for execution. */
+  uint8_t need_exec = 0;
+
+  /** The original node in the tree (for localized tree). */
+  struct bNode *original = nullptr;
+
+  /**
+   * XXX TODO
+   * Node totr size depends on the prvr size, which in turn is determined from preview size.
+   * In earlier versions bNodePreview was stored directly in nodes, but since now there can be
+   * multiple instances using different preview images it is possible that required node size
+   * varies between instances. preview_xsize, preview_ysize defines a common reserved size for
+   * preview rect for now, could be replaced by more accurate node instance drawing,
+   * but that requires removing totr from DNA and replacing all uses with per-instance data.
+   */
+  /** Reserved size of the preview rect. */
+  short preview_xsize, preview_ysize = 0;
+  /** Entire bound-box (world-space). */
+  rctf totr{};
+  /** Optional preview area. */
+  rctf prvr{};
+
+  /** Used at runtime when going through the tree. Initialize before use. */
+  short tmp_flag = 0;
+
+  /** Used at runtime when iterating over node branches. */
+  char iter_flag = 0;
+
+  /** Update flags. */
+  int update = 0;
+
+  /** Initial locx for insert offset animation. */
+  float anim_init_locx;
+  /** Offset that will be added to locx for insert offset animation. */
+  float anim_ofsx;
+
   /** Only valid if #topology_cache_is_dirty is false. */
   Vector<bNodeSocket *> inputs;
   Vector<bNodeSocket *> outputs;
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index c3b1470f820..b92dea6bfc6 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -1115,7 +1115,6 @@ static void node_init(const struct bContext *C, bNodeTree *ntree, bNode *node)
 
   node->flag = NODE_SELECT | NODE_OPTIONS | ntype->flag;
   node->width = ntype->width;
-  node->miniwidth = 42.0f;
   node->height = ntype->height;
   node->color[0] = node->color[1] = node->color[2] = 0.608; /* default theme color */
   /* initialize the node name with the node label.
@@ -2116,11 +2115,11 @@ static void iter_backwards_ex(const bNodeTree *ntree,
       /* Skip links marked as cyclic. */
       continue;
     }
-    if (link->fromnode->iter_flag & recursion_mask) {
+    if (link->fromnode->runtime->iter_flag & recursion_mask) {
       continue;
     }
 
-    link->fromnode->iter_flag |= recursion_mask;
+    link->fromnode->runtime->iter_flag |= recursion_mask;
 
     if (!callback(link->fromnode, link->tonode, userdata)) {
       return;
@@ -2145,7 +2144,7 @@ void nodeChainIterBackwards(const bNodeTree *ntree,
 
   /* Reset flag. */
   LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
-    node->iter_flag &= ~recursion_mask;
+    node->runtime->iter_flag &= ~recursion_mask;
   }
 
   iter_backwards_ex(ntree, node_start, callback, userdata, recursion_mask);
@@ -2789,8 +2788,8 @@ static void node_preview_init_tree_recursive(bNodeInstanceHash *previews,
     bNodeInstanceKey key = BKE_node_instance_key(parent_key, ntree, node);
 
     if (BKE_node_preview_used(node)) {
-      node->preview_xsize = xsize;
-      node->preview_ysize = ysize;
+      node->runtime->preview_xsize = xsize;
+      node->runtime->preview_ysize = ysize;
 
       BKE_node_preview_verify(previews, key, xsize, ysize, false);
     }
@@ -3277,7 +3276,7 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
   bNode *node_src = (bNode *)ntree->nodes.first;
   bNode *node_local = (bNode *)ltree->nodes.first;
   while (node_src != nullptr) {
-    node_local->original = node_src;
+    node_local->runtime->original = node_src;
     node_src = node_src->next;
     node_local = node_local->next;
   }
@@ -3753,6 +3752,17 @@ bool nodeDeclarationEnsure(bNodeTree *ntree, bNode *node)
   return false;
 }
 
+void nodeDimensionsGet(const bNode *node, float *r_width, float *r_height)
+{
+  *r_width = node->runtime->totr.xmax - node->runtime->totr.xmin;
+  *r_height = node->runtime->totr.ymax - node->runtime->totr.ymin;
+}
+
+void nodeTagUpdateID(bNode *node)
+{
+  node->runtime->update |= NODE_UPDATE_ID;
+}
+
 /* ************** Node Clipboard *********** */
 
 #define USE_NODE_CB_VALIDATE
@@ -4064,28 +4074,28 @@ static int node_get_deplist_recurs(bNodeTree *ntree, bNode *node, bNode ***nsort
 {
   int level = 0xFFF;
 
-  node->done = true;
+  node->runtime->done = true;
 
   /* check linked nodes */
   LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) {
     if (link->tonode == node) {
       bNode *fromnode = link->fromnode;
-      if (fromnode->done == 0) {
-        fromnode->level = node_get_deplist_recurs(ntree, fromnode, nsort);
+      if (fromnode->runtime->done == 0) {
+        fromnode->runtime->level = node_get_deplist_recurs(ntree, fromnode, nsort);
       }
-      if (fromnode->level <= level) {
-        level = fromnode->level - 1;
+      if (fromnode->runtime->level <= level) {
+        level = fromnode->runtime->level - 1;
       }
     }
   }
 
   /* check parent node */
   if (node->parent) {
-    if (node->parent->done == 0) {
-      node->parent->level = node_get_deplist_recurs(ntree, node->parent, nsort);
+    if (node->parent->runtime->done == 0) {
+      node->parent->runtime->level = node_get_deplist_recurs(ntree, node->parent, nsort);
     }
-    if (node->parent->level <= level) {
-      level = node->parent->level - 1;
+    if (node->parent->runtime->level <= level) {
+      level = node->parent->runtime->level - 1;
     }
   }
 
@@ -4103,7 +4113,7 @@ void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***r_deplist,
 
   /* first clear data */
   LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
-    node->done = false;
+    node->runtime->done = false;
     (*r_deplist_len)++;
   }
   if (*r_deplist_len == 0) {
@@ -4117,8 +4127,8 @@ void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***r_deplist,
 
   /* recursive check */
   LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
-    if (node->done == 0) {
-      node->level = node_get_deplist_recurs(ntree, node, &nsort);
+    if (node->runtime->done == 0) {
+      node->runtime->level = node_get_deplist_recurs(ntree, node, &nsort);
     }
   }
 }
@@ -4128,13 +4138,13 @@ void ntreeUpdateNodeLevels(bNodeTree *ntree)
 {
   /* first clear tag */
   LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
-    node->done = false;
+    node->runtime->done = false;
   }
 
   /* recursive check */
   LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
-    if (node->done == 0) {
-      node->level = node_get_deplist_recurs(ntree, node, nullptr);
+    if (node->runtime->done == 0) {
+      node->runtime->level = node_get_deplist_recurs(ntree, node, nullptr);
     }
   }
 }
diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc
index 7b6c7954508..d068e150f25 100644
--- a/source/blender/blenkernel/intern/node_tree_update.cc
+++ b/source/blender/blenkernel/intern/node_tree_update.cc
@@ -1275,7 +1275,8 @@ class NodeTreeMainUpdater {
   {
     LISTBASE_FOREACH (bNodeLink *, link, &ntree.links) {
       link->flag |= NODE_LINK_VALID;
-      if (link->fromnode && link->tonode && link->fromnode->level <= link->tonode->level) {
+      if (link->fromnode && link->tonode &&
+          link->fromnode->runtime->level <= link->tonode->runtime->level) {
         link->flag &= ~NODE_LINK_VALID;
       }
       else if (ntree.typeinfo->validate_link) {
@@ -1597,7 +1598,7 @@ class NodeTreeMainUpdater {
     ntree.runtime->changed_flag = NTREE_CHANGED_NOTHING;
     LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
       node->runtime->changed_flag = NTREE_CHANGED_NOTHING;
-      node->update = 0;
+      node->runtime->update = 0;
       LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
         socket->runtime->changed_flag = NTREE_CHANGED_NOTHING;
       }
@@ -1715,7 +1716,7 @@ void BKE_ntree_update_tag_id_changed(Main *bmain, ID *id)
   FOREACH_NODETREE_BEGIN (bmain, ntree, ntree_id) {
     LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
       if (node->id == id) {
-        node->update |= NODE_UPDATE_ID;
+        node->runtime->update |= NODE_UPDATE_ID;
         add_node_tag(ntree, node, NTREE_CHANGED_NODE_PROPERTY);
       }
     }
diff --git a/source/blender/compositor/intern/COM_NodeOperationBuilder.cc b/source/blender/compositor/intern/COM_NodeOperationBuilder.cc
index 8212be5ec26..1647b5fb55b 100644
--- a/source/blender/compositor/intern/COM_NodeOperationBuilder.cc
+++ b/source/blender/compositor/intern/COM_NodeOperationBuilder.cc
@@ -5,6 +5,8 @@
 
 #include "BLI_multi_value_map.hh"
 
+#include "BKE_node_runtime.hh"
+
 #include "COM_Converter.h"
 #include "COM_Debug.h"
 
@@ -222,10 +224,11 @@ PreviewOperation *NodeOperationBuilder::make_preview_operation() const
   bNodeInstanceHash *previews = context_->get_preview_hash();
   if (previews) {
     Scene *scene = context_->get_scene();
-    PreviewOperation *operation = new PreviewOperation(&scene->view_settings,
-                                                       &scene->display_settings,
-                                                       current_node_->get_bnode()->preview_xsize,
-                           

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list