[Bf-blender-cvs] [efb5108faaf] simulation-tree: more work on socket data types

Jacques Lucke noreply at git.blender.org
Mon Feb 17 18:16:12 CET 2020


Commit: efb5108faaf67c77ef43790b8d5bcffe11c4f7ba
Author: Jacques Lucke
Date:   Mon Feb 17 13:23:29 2020 +0100
Branches: simulation-tree
https://developer.blender.org/rBefb5108faaf67c77ef43790b8d5bcffe11c4f7ba

more work on socket data types

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

M	source/blender/simulations/nodes/SIM_node_tree.h
M	source/blender/simulations/nodes/my_test_node.cc
M	source/blender/simulations/nodes/simulation_node_tree.cc

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

diff --git a/source/blender/simulations/nodes/SIM_node_tree.h b/source/blender/simulations/nodes/SIM_node_tree.h
index c89934c9345..f55c40aa256 100644
--- a/source/blender/simulations/nodes/SIM_node_tree.h
+++ b/source/blender/simulations/nodes/SIM_node_tree.h
@@ -9,6 +9,8 @@ extern struct bNodeTreeType *ntreeType_Simulation;
 
 void register_node_tree_type_sim(void);
 void register_node_type_my_test_node(void);
+void init_socket_data_types(void);
+void free_socket_data_types(void);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/simulations/nodes/my_test_node.cc b/source/blender/simulations/nodes/my_test_node.cc
index 00c561d55c9..5c3b4e17b39 100644
--- a/source/blender/simulations/nodes/my_test_node.cc
+++ b/source/blender/simulations/nodes/my_test_node.cc
@@ -7,6 +7,7 @@
 #include "BLI_string_ref.h"
 #include "BLI_set.h"
 
+using BLI::Set;
 using BLI::StringRef;
 using BLI::StringRefNull;
 using BLI::Vector;
@@ -22,16 +23,23 @@ enum class SocketTypeCategory {
 
 class SocketDataType {
  public:
-  using BuildFunc = std::function<bNodeSocket *(
-      bNode *node, StringRef name, StringRef identifer, eNodeSocketInOut in_out)>;
-
   std::string m_ui_name;
-  BuildFunc m_build_fn;
+  bNodeSocketType *m_socket_type;
   SocketTypeCategory m_category;
 
-  SocketDataType(StringRef ui_name, BuildFunc build_fn, SocketTypeCategory category)
-      : m_ui_name(ui_name), m_build_fn(std::move(build_fn)), m_category(category)
+  SocketDataType(StringRef ui_name, bNodeSocketType *socket_type, SocketTypeCategory category)
+      : m_ui_name(ui_name), m_socket_type(socket_type), m_category(category)
+  {
+  }
+
+  bNodeSocket *build(bNodeTree &ntree,
+                     bNode &node,
+                     eNodeSocketInOut in_out,
+                     StringRef identifier,
+                     StringRef ui_name) const
   {
+    return nodeAddSocket(
+        &ntree, &node, in_out, m_socket_type->idname, identifier.data(), ui_name.data());
   }
 };
 
@@ -39,8 +47,8 @@ class BaseSocketDataType : public SocketDataType {
  public:
   ListSocketDataType *m_list_type;
 
-  BaseSocketDataType(StringRef ui_name, BuildFunc build_fn)
-      : SocketDataType(ui_name, std::move(build_fn), SocketTypeCategory::Base)
+  BaseSocketDataType(StringRef ui_name, bNodeSocketType *socket_type)
+      : SocketDataType(ui_name, socket_type, SocketTypeCategory::Base)
   {
   }
 };
@@ -49,35 +57,71 @@ class ListSocketDataType : public SocketDataType {
  public:
   BaseSocketDataType *m_base_type;
 
-  ListSocketDataType(StringRef ui_name, BuildFunc build_fn)
-      : SocketDataType(ui_name, std::move(build_fn), SocketTypeCategory::List)
+  ListSocketDataType(StringRef ui_name, bNodeSocketType *socket_type)
+      : SocketDataType(ui_name, socket_type, SocketTypeCategory::List)
   {
   }
 };
 
-class SocketDataTypes {
+class DataTypesInfo {
+ private:
+  Set<SocketDataType *> m_data_types;
+  Set<std::pair<SocketDataType *, SocketDataType *>> m_implicit_conversions;
+
  public:
+  void add_data_type(SocketDataType *data_type)
+  {
+    m_data_types.add_new(data_type);
+  }
+
+  void add_implicit_conversion(SocketDataType *from, SocketDataType *to)
+  {
+    m_implicit_conversions.add_new({from, to});
+  }
 };
 
+static DataTypesInfo *socket_data_types;
+
+static BaseSocketDataType *float_socket_type;
+static BaseSocketDataType *int_socket_type;
+
 class SocketDecl {
+ protected:
+  bNodeTree &m_ntree;
+  bNode &m_node;
+
  public:
-  bNodeTree *m_ntree;
-  bNode *m_node;
+  SocketDecl(bNodeTree &ntree, bNode &node) : m_ntree(ntree), m_node(node)
+  {
+  }
 
   virtual void build() const = 0;
 };
 
-class MockupSocketDecl : public SocketDecl {
- public:
+class FixedTypeSocketDecl : public SocketDecl {
   eNodeSocketInOut m_in_out;
+  SocketDataType &m_type;
   StringRefNull m_ui_name;
   StringRefNull m_identifier;
-  StringRefNull m_idname;
+
+ public:
+  FixedTypeSocketDecl(bNodeTree &ntree,
+                      bNode &node,
+                      eNodeSocketInOut in_out,
+                      SocketDataType &type,
+                      StringRefNull ui_name,
+                      StringRefNull identifier)
+      : SocketDecl(ntree, node),
+        m_in_out(in_out),
+        m_type(type),
+        m_ui_name(ui_name),
+        m_identifier(identifier)
+  {
+  }
 
   void build() const override
   {
-    nodeAddSocket(
-        m_ntree, m_node, m_in_out, m_idname.data(), m_identifier.data(), m_ui_name.data());
+    m_type.build(m_ntree, m_node, m_in_out, m_identifier, m_ui_name);
   }
 };
 
@@ -89,14 +133,11 @@ class NodeDecl {
 
 static void init_node(bNodeTree *ntree, bNode *node)
 {
-  MockupSocketDecl decl;
-  decl.m_in_out = SOCK_IN;
-  decl.m_ntree = ntree;
-  decl.m_node = node;
-  decl.m_ui_name = "Hello World";
-  decl.m_identifier = "myid";
-  decl.m_idname = "NodeSocketFloat";
-  decl.build();
+  FixedTypeSocketDecl decl1{*ntree, *node, SOCK_IN, *float_socket_type, "Hello 1", "hey"};
+  FixedTypeSocketDecl decl2{*ntree, *node, SOCK_IN, *int_socket_type, "Hello 2", "qwe"};
+
+  decl1.build();
+  decl2.build();
 }
 
 void register_node_type_my_test_node()
@@ -119,3 +160,22 @@ void register_node_type_my_test_node()
 
   nodeRegisterType(&ntype);
 }
+
+void init_socket_data_types()
+{
+  float_socket_type = new BaseSocketDataType("Float", nodeSocketTypeFind("NodeSocketFloat"));
+  int_socket_type = new BaseSocketDataType("Integer", nodeSocketTypeFind("NodeSocketInt"));
+
+  socket_data_types = new DataTypesInfo();
+  socket_data_types->add_data_type(float_socket_type);
+  socket_data_types->add_data_type(int_socket_type);
+  socket_data_types->add_implicit_conversion(float_socket_type, int_socket_type);
+  socket_data_types->add_implicit_conversion(int_socket_type, float_socket_type);
+}
+
+void free_socket_data_types()
+{
+  delete socket_data_types;
+  delete float_socket_type;
+  delete int_socket_type;
+}
diff --git a/source/blender/simulations/nodes/simulation_node_tree.cc b/source/blender/simulations/nodes/simulation_node_tree.cc
index 574e9fc9616..919ccfa7b5c 100644
--- a/source/blender/simulations/nodes/simulation_node_tree.cc
+++ b/source/blender/simulations/nodes/simulation_node_tree.cc
@@ -21,5 +21,6 @@ void register_node_tree_type_sim()
 
   ntreeTypeAdd(tt);
 
+  init_socket_data_types();
   register_node_type_my_test_node();
 }



More information about the Bf-blender-cvs mailing list