[Bf-blender-cvs] [a1947b3f41b] simulation-tree: initial socket init/copy/free interface

Jacques Lucke noreply at git.blender.org
Thu Feb 20 13:19:59 CET 2020


Commit: a1947b3f41b8d0fa55a770aaca62417d496ca238
Author: Jacques Lucke
Date:   Thu Feb 20 12:12:26 2020 +0100
Branches: simulation-tree
https://developer.blender.org/rBa1947b3f41b8d0fa55a770aaca62417d496ca238

initial socket init/copy/free interface

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/simulations/nodes/my_test_node.cc

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index ffc2150516e..6a2122ec8d7 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -139,6 +139,13 @@ typedef struct bNodeSocketType {
                                 struct bNode *node,
                                 struct bNodeSocket *sock);
 
+  void (*init_fn)(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *socket);
+  void (*copy_fn)(struct bNodeTree *dst_ntree,
+                  struct bNode *dst_node,
+                  struct bNodeSocket *dst_socket,
+                  const struct bNodeSocket *src_socket);
+  void (*free_fn)(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *socket);
+
   /* RNA integration */
   ExtensionRNA ext_socket;
   ExtensionRNA ext_interface;
diff --git a/source/blender/simulations/nodes/my_test_node.cc b/source/blender/simulations/nodes/my_test_node.cc
index c5340cf7054..7bd3414adf3 100644
--- a/source/blender/simulations/nodes/my_test_node.cc
+++ b/source/blender/simulations/nodes/my_test_node.cc
@@ -336,17 +336,26 @@ class SocketTypeDefinition {
                                           struct PointerRNA *ptr,
                                           struct PointerRNA *node_ptr,
                                           const char *text)>;
+  using InitStorageFn = std::function<void *()>;
+  using CopyStorageFn = std::function<void *(void *)>;
+  using FreeStorageFn = std::function<void(void *)>;
+  template<typename T> using TypedInitStorageFn = std::function<void(T *)>;
 
  private:
   bNodeSocketType m_stype;
   DrawInNodeFn m_draw_in_node_fn;
   rgba_f m_color = {0.0f, 0.0f, 0.0f, 1.0f};
+  std::string m_storage_struct_name;
+  InitStorageFn m_init_storage_fn;
+  CopyStorageFn m_copy_storage_fn;
+  FreeStorageFn m_free_storage_fn;
 
  public:
   SocketTypeDefinition(StringRef idname)
   {
+    memset(&m_stype, 0, sizeof(bNodeSocketType));
     idname.copy(m_stype.idname);
-
+    m_stype.type = SOCK_CUSTOM;
     m_stype.draw = SocketTypeDefinition::draw_in_node;
     m_draw_in_node_fn = [](struct bContext *UNUSED(C),
                            struct uiLayout *layout,
@@ -357,6 +366,30 @@ class SocketTypeDefinition {
     m_stype.draw_color = SocketTypeDefinition::get_draw_color;
     m_stype.free_self = [](bNodeSocketType *UNUSED(stype)) {};
 
+    m_init_storage_fn = []() { return nullptr; };
+    m_copy_storage_fn = [](void *storage) {
+      BLI_assert(storage == nullptr);
+      UNUSED_VARS_NDEBUG(storage);
+      return nullptr;
+    };
+    m_free_storage_fn = [](void *storage) {
+      BLI_assert(storage == nullptr);
+      UNUSED_VARS_NDEBUG(storage);
+    };
+
+    m_stype.init_fn = [](bNodeTree *UNUSED(ntree), bNode *UNUSED(node), bNodeSocket *socket) {
+      std::cout << "Init: " << socket->name << '\n';
+    };
+    m_stype.copy_fn = [](bNodeTree *UNUSED(dst_ntree),
+                         bNode *UNUSED(dst_node),
+                         bNodeSocket *dst_socket,
+                         const bNodeSocket *src_socket) {
+      std::cout << "Copy: " << src_socket->name << " -> " << dst_socket->name << '\n';
+    };
+    m_stype.free_fn = [](bNodeTree *UNUSED(ntree), bNode *UNUSED(node), bNodeSocket *socket) {
+      std::cout << "Free: " << socket->name << '\n';
+    };
+
     m_stype.userdata = (void *)this;
   }
 
@@ -365,6 +398,35 @@ class SocketTypeDefinition {
     m_color = color;
   }
 
+  void add_dna_storage(StringRef struct_name,
+                       InitStorageFn init_storage_fn,
+                       CopyStorageFn copy_storage_fn,
+                       FreeStorageFn free_storage_fn)
+  {
+    m_storage_struct_name = struct_name;
+    m_init_storage_fn = init_storage_fn;
+    m_copy_storage_fn = copy_storage_fn;
+    m_free_storage_fn = free_storage_fn;
+  }
+
+  template<typename T>
+  void add_dna_storage(StringRef struct_name, TypedInitStorageFn<T> init_storage_fn)
+  {
+    this->add_dna_storage(
+        struct_name,
+        [init_storage_fn]() {
+          void *buffer = MEM_callocN(sizeof(T), __func__);
+          init_storage_fn((T *)buffer);
+          return buffer;
+        },
+        [](void *buffer) {
+          void *new_buffer = MEM_callocN(sizeof(T), __func__);
+          memcpy(new_buffer, buffer, sizeof(T));
+          return new_buffer;
+        },
+        [](void *buffer) { MEM_freeN(buffer); });
+  }
+
   void register_type()
   {
     nodeRegisterSocketType(&m_stype);
@@ -659,6 +721,8 @@ void init_socket_data_types()
   {
     static SocketTypeDefinition stype("MyFloatSocket");
     stype.set_color({1, 1, 1, 1});
+    stype.add_dna_storage<bNodeSocketValueFloat>(
+        "bNodeSocketValueFloat", [](bNodeSocketValueFloat *storage) { storage->value = 11.5f; });
     stype.register_type();
   }



More information about the Bf-blender-cvs mailing list