[Bf-blender-cvs] [ba0a6ae075a] simulation-tree: add copy behavior to nodes

Jacques Lucke noreply at git.blender.org
Wed Feb 19 16:12:28 CET 2020


Commit: ba0a6ae075ac2dd00bb2518a3fbb3a9f5d687ccf
Author: Jacques Lucke
Date:   Wed Feb 19 13:47:37 2020 +0100
Branches: simulation-tree
https://developer.blender.org/rBba0a6ae075ac2dd00bb2518a3fbb3a9f5d687ccf

add copy behavior to nodes

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

M	source/blender/simulations/nodes/my_test_node.cc

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

diff --git a/source/blender/simulations/nodes/my_test_node.cc b/source/blender/simulations/nodes/my_test_node.cc
index 0fd1d2fb787..6a33ba8c2c2 100644
--- a/source/blender/simulations/nodes/my_test_node.cc
+++ b/source/blender/simulations/nodes/my_test_node.cc
@@ -233,6 +233,26 @@ class NodeDecl {
   }
 };
 
+template<typename T> static T *get_node_storage(bNode *node)
+{
+#ifdef DEBUG
+  const char *type_name = typeid(T).name();
+  const char *expected_name = node->typeinfo->storagename;
+  BLI_assert(strstr(type_name, expected_name));
+#endif
+  return (T *)node->storage;
+}
+
+template<typename T> static const T *get_node_storage(const bNode *node)
+{
+#ifdef DEBUG
+  const char *type_name = typeid(T).name();
+  const char *expected_name = node->typeinfo->storagename;
+  BLI_assert(strstr(type_name, expected_name));
+#endif
+  return (const T *)node->storage;
+}
+
 class NodeBuilder {
  private:
   LinearAllocator<> &m_allocator;
@@ -246,12 +266,7 @@ class NodeBuilder {
 
   template<typename T> T *node_storage()
   {
-#ifdef DEBUG
-    const char *type_name = typeid(T).name();
-    const char *expected_name = m_node_decl.m_node.typeinfo->storagename;
-    BLI_assert(strstr(type_name, expected_name));
-#endif
-    return (T *)m_node_decl.m_node.storage;
+    return get_node_storage<T>(&m_node_decl.m_node);
   }
 
   void fixed_input(StringRef identifier, StringRef ui_name, SocketDataType &type)
@@ -301,12 +316,14 @@ using FreeStorageFunc = std::function<void(void *)>;
 using DrawFunc =
     std::function<void(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr)>;
 template<typename T> using TypedInitStorageFunc = std::function<void(T *)>;
+using CopyNodeFunc = std::function<void(bNode *dst_node, const bNode *src_node)>;
 
 struct NodeTypeCallbacks {
   DeclareNodeFunc m_declare_node;
   InitStorageFunc m_init_storage;
   CopyStorageFunc m_copy_storage;
   FreeStorageFunc m_free_storage;
+  CopyNodeFunc m_copy_node;
   DrawFunc m_draw;
 };
 
@@ -328,6 +345,7 @@ static void copy_node(bNodeTree *UNUSED(dst_ntree), bNode *dst_node, const bNode
   NodeTypeCallbacks &callbacks = *(NodeTypeCallbacks *)dst_node->typeinfo->userdata;
 
   dst_node->storage = callbacks.m_copy_storage(src_node->storage);
+  callbacks.m_copy_node(dst_node, src_node);
 }
 
 static void free_node(bNode *node)
@@ -373,6 +391,7 @@ static void setup_node_base(bNodeType *ntype,
   callbacks->m_draw = [](struct uiLayout *UNUSED(layout),
                          struct bContext *UNUSED(C),
                          struct PointerRNA *UNUSED(ptr)) {};
+  callbacks->m_copy_node = [](bNode *UNUSED(dst_node), const bNode *UNUSED(src_node)) {};
 
   ntype->poll = [](bNodeType *UNUSED(ntype), bNodeTree *UNUSED(ntree)) { return true; };
   ntype->initfunc = init_node;
@@ -433,6 +452,23 @@ static void setup_node_draw(bNodeType *ntype, DrawFunc draw_fn)
   callbacks->m_draw = draw_fn;
 }
 
+static void setup_node_copy(bNodeType *ntype, CopyNodeFunc copy_fn)
+{
+  NodeTypeCallbacks *callbacks = (NodeTypeCallbacks *)ntype->userdata;
+  callbacks->m_copy_node = copy_fn;
+}
+
+template<typename T>
+void setup_node_copy(bNodeType *ntype,
+                     std::function<void(T *dst_storage, const T *src_storage)> copy_fn)
+{
+  setup_node_copy(ntype, [copy_fn](bNode *dst_node, const bNode *src_node) {
+    T *dst_storage = get_node_storage<T>(dst_node);
+    const T *src_storage = get_node_storage<T>(src_node);
+    copy_fn(dst_storage, src_storage);
+  });
+}
+
 void register_node_type_my_test_node()
 {
   {
@@ -440,6 +476,10 @@ void register_node_type_my_test_node()
     setup_node_base(&ntype, "MyTestNode", "My Test Node", "My Description", declare_test_node);
     setup_node_storage<MyTestNodeStorage>(
         &ntype, "MyTestNodeStorage", [](MyTestNodeStorage *storage) { storage->x = 3; });
+    setup_node_copy<MyTestNodeStorage>(
+        &ntype, [](MyTestNodeStorage *dst_storage, const MyTestNodeStorage *UNUSED(src_storage)) {
+          dst_storage->x += 1;
+        });
     setup_node_draw(&ntype,
                     [](uiLayout *layout, struct bContext *UNUSED(C), struct PointerRNA *ptr) {
                       bNode *node = (bNode *)ptr->data;



More information about the Bf-blender-cvs mailing list