[Bf-blender-cvs] [d11651fff91] master: Refactor: move bNodeTree .blend I/O to IDTypeInfo callbacks

Jacques Lucke noreply at git.blender.org
Thu Sep 10 13:35:05 CEST 2020


Commit: d11651fff918f27a865e3e6aee5519aa60d2a076
Author: Jacques Lucke
Date:   Thu Sep 10 13:33:29 2020 +0200
Branches: master
https://developer.blender.org/rBd11651fff918f27a865e3e6aee5519aa60d2a076

Refactor: move bNodeTree .blend I/O to IDTypeInfo callbacks

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 3829000a045..5e8b371e604 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -72,6 +72,10 @@ struct bNodeTree;
 struct bNodeTreeExec;
 struct bNodeTreeType;
 struct uiLayout;
+struct BlendWriter;
+struct BlendDataReader;
+struct BlendLibReader;
+struct BlendExpander;
 
 /* -------------------------------------------------------------------- */
 /** \name Node Type Definitions
@@ -453,6 +457,11 @@ struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
 void ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
 void ntreeLocalMerge(struct Main *bmain, struct bNodeTree *localtree, struct bNodeTree *ntree);
 
+void ntreeBlendWrite(struct BlendWriter *writer, struct bNodeTree *ntree);
+void ntreeBlendReadData(struct BlendDataReader *reader, struct bNodeTree *ntree);
+void ntreeBlendReadLib(struct BlendLibReader *reader, struct bNodeTree *ntree);
+void ntreeBlendReadExpand(struct BlendExpander *expander, struct bNodeTree *ntree);
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 900817a0513..1c7060541db 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -30,6 +30,9 @@
 #include <stdlib.h>
 #include <string.h>
 
+/* Allow using deprecated functionality for .blend file I/O. */
+#define DNA_DEPRECATED_ALLOW
+
 #include "DNA_action_types.h"
 #include "DNA_anim_types.h"
 #include "DNA_gpencil_types.h"
@@ -54,6 +57,7 @@
 
 #include "BKE_anim_data.h"
 #include "BKE_animsys.h"
+#include "BKE_colortools.h"
 #include "BKE_global.h"
 #include "BKE_idprop.h"
 #include "BKE_idtype.h"
@@ -79,6 +83,8 @@
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_build.h"
 
+#include "BLO_read_write.h"
+
 #define NODE_DEFAULT_MAX_WIDTH 700
 
 /* Fallback types for undefined tree, nodes, sockets */
@@ -337,6 +343,511 @@ static void node_foreach_cache(ID *id,
   }
 }
 
+static void write_node_socket_default_value(BlendWriter *writer, bNodeSocket *sock)
+{
+  if (sock->default_value == NULL) {
+    return;
+  }
+
+  switch ((eNodeSocketDatatype)sock->type) {
+    case SOCK_FLOAT:
+      BLO_write_struct(writer, bNodeSocketValueFloat, sock->default_value);
+      break;
+    case SOCK_VECTOR:
+      BLO_write_struct(writer, bNodeSocketValueVector, sock->default_value);
+      break;
+    case SOCK_RGBA:
+      BLO_write_struct(writer, bNodeSocketValueRGBA, sock->default_value);
+      break;
+    case SOCK_BOOLEAN:
+      BLO_write_struct(writer, bNodeSocketValueBoolean, sock->default_value);
+      break;
+    case SOCK_INT:
+      BLO_write_struct(writer, bNodeSocketValueInt, sock->default_value);
+      break;
+    case SOCK_STRING:
+      BLO_write_struct(writer, bNodeSocketValueString, sock->default_value);
+      break;
+    case SOCK_OBJECT:
+      BLO_write_struct(writer, bNodeSocketValueObject, sock->default_value);
+      break;
+    case SOCK_IMAGE:
+      BLO_write_struct(writer, bNodeSocketValueImage, sock->default_value);
+      break;
+    case __SOCK_MESH:
+    case SOCK_CUSTOM:
+    case SOCK_SHADER:
+    case SOCK_EMITTERS:
+    case SOCK_EVENTS:
+    case SOCK_FORCES:
+    case SOCK_CONTROL_FLOW:
+      BLI_assert(false);
+      break;
+  }
+}
+
+static void write_node_socket(BlendWriter *writer, bNodeSocket *sock)
+{
+  /* actual socket writing */
+  BLO_write_struct(writer, bNodeSocket, sock);
+
+  if (sock->prop) {
+    IDP_BlendWrite(writer, sock->prop);
+  }
+
+  write_node_socket_default_value(writer, sock);
+}
+static void write_node_socket_interface(BlendWriter *writer, bNodeSocket *sock)
+{
+  /* actual socket writing */
+  BLO_write_struct(writer, bNodeSocket, sock);
+
+  if (sock->prop) {
+    IDP_BlendWrite(writer, sock->prop);
+  }
+
+  write_node_socket_default_value(writer, sock);
+}
+
+/* this is only direct data, tree itself should have been written */
+void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
+{
+  /* for link_list() speed, we write per list */
+
+  if (ntree->adt) {
+    BKE_animdata_blend_write(writer, ntree->adt);
+  }
+
+  LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+    BLO_write_struct(writer, bNode, node);
+
+    if (node->prop) {
+      IDP_BlendWrite(writer, node->prop);
+    }
+
+    LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
+      write_node_socket(writer, sock);
+    }
+    LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
+      write_node_socket(writer, sock);
+    }
+
+    LISTBASE_FOREACH (bNodeLink *, link, &node->internal_links) {
+      BLO_write_struct(writer, bNodeLink, link);
+    }
+
+    if (node->storage) {
+      /* could be handlerized at some point, now only 1 exception still */
+      if ((ntree->type == NTREE_SHADER) &&
+          ELEM(node->type, SH_NODE_CURVE_VEC, SH_NODE_CURVE_RGB)) {
+        BKE_curvemapping_blend_write(writer, node->storage);
+      }
+      else if (ntree->type == NTREE_SHADER && (node->type == SH_NODE_SCRIPT)) {
+        NodeShaderScript *nss = (NodeShaderScript *)node->storage;
+        if (nss->bytecode) {
+          BLO_write_string(writer, nss->bytecode);
+        }
+        BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage);
+      }
+      else if ((ntree->type == NTREE_COMPOSIT) && ELEM(node->type,
+                                                       CMP_NODE_TIME,
+                                                       CMP_NODE_CURVE_VEC,
+                                                       CMP_NODE_CURVE_RGB,
+                                                       CMP_NODE_HUECORRECT)) {
+        BKE_curvemapping_blend_write(writer, node->storage);
+      }
+      else if ((ntree->type == NTREE_TEXTURE) &&
+               (node->type == TEX_NODE_CURVE_RGB || node->type == TEX_NODE_CURVE_TIME)) {
+        BKE_curvemapping_blend_write(writer, node->storage);
+      }
+      else if ((ntree->type == NTREE_COMPOSIT) && (node->type == CMP_NODE_MOVIEDISTORTION)) {
+        /* pass */
+      }
+      else if ((ntree->type == NTREE_COMPOSIT) && (node->type == CMP_NODE_GLARE)) {
+        /* Simple forward compatibility for fix for T50736.
+         * Not ideal (there is no ideal solution here), but should do for now. */
+        NodeGlare *ndg = node->storage;
+        /* Not in undo case. */
+        if (!BLO_write_is_undo(writer)) {
+          switch (ndg->type) {
+            case 2: /* Grrrr! magic numbers :( */
+              ndg->angle = ndg->streaks;
+              break;
+            case 0:
+              ndg->angle = ndg->star_45;
+              break;
+            default:
+              break;
+          }
+        }
+        BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage);
+      }
+      else if ((ntree->type == NTREE_COMPOSIT) && (node->type == CMP_NODE_CRYPTOMATTE)) {
+        NodeCryptomatte *nc = (NodeCryptomatte *)node->storage;
+        if (nc->matte_id) {
+          BLO_write_string(writer, nc->matte_id);
+        }
+        BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage);
+      }
+      else if (node->typeinfo != &NodeTypeUndefined) {
+        BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage);
+      }
+    }
+
+    if (node->type == CMP_NODE_OUTPUT_FILE) {
+      /* inputs have own storage data */
+      LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
+        BLO_write_struct(writer, NodeImageMultiFileSocket, sock->storage);
+      }
+    }
+    if (ELEM(node->type, CMP_NODE_IMAGE, CMP_NODE_R_LAYERS)) {
+      /* write extra socket info */
+      LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
+        BLO_write_struct(writer, NodeImageLayer, sock->storage);
+      }
+    }
+  }
+
+  LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) {
+    BLO_write_struct(writer, bNodeLink, link);
+  }
+
+  LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->inputs) {
+    write_node_socket_interface(writer, sock);
+  }
+  LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->outputs) {
+    write_node_socket_interface(writer, sock);
+  }
+}
+
+static void ntree_blend_write(BlendWriter *writer, ID *id, const void *id_address)
+{
+  bNodeTree *ntree = (bNodeTree *)id;
+  if (ntree->id.us > 0 || BLO_write_is_undo(writer)) {
+    /* Clean up, important in undo case to reduce false detection of changed datablocks. */
+    ntree->init = 0; /* to set callbacks and force setting types */
+    ntree->is_updating = false;
+    ntree->typeinfo = NULL;
+    ntree->interface_type = NULL;
+    ntree->progress = NULL;
+    ntree->execdata = NULL;
+
+    BLO_write_id_struct(writer, bNodeTree, id_address, &ntree->id);
+    /* Note that trees directly used by other IDs (materials etc.) are not 'real' ID, they cannot
+     * be linked, etc., so we write actual id data here only, for 'real' ID trees. */
+    BKE_id_blend_write(writer, &ntree->id);
+
+    ntreeBlendWrite(writer, ntree);
+  }
+}
+
+static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock)
+{
+  BLO_read_data_address(reader, &sock->prop);
+  IDP_BlendDataRead(reader, &sock->prop);
+
+  BLO_read_data_address(reader, &sock->link);
+  sock->typeinfo = NULL;
+  BLO_read_data_address(reader, &sock->storage);
+  BLO_read_data_address(reader, &sock->default_value);
+  sock->cache = NULL;
+}
+
+/* ntree itself has been read! */
+void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
+{
+  /* note: writing and reading goes in sync, for speed */
+  ntree->init = 0; /* to set callbacks and force setting types */
+  ntree->is_updating = false;
+  ntree->typeinfo = NULL;
+  ntree->interface_type = NULL;
+
+  ntree->progress = NULL;
+  ntree->execdata = NULL;
+
+  BLO_read_data_address(reader, &ntree->adt);
+  BKE_animdata_blend_read_data(reader, ntree->adt);
+
+  BLO_read_list(reader, &ntree->nodes);
+  LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+    node->typeinfo = NULL;
+
+    BLO_read_list(reader, &node->inputs);
+    BLO_read_list(reader, &node->outputs);
+
+    BLO_read_data_address(read

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list