[Bf-blender-cvs] [7178267f200] functions: start using a better defined type system

Jacques Lucke noreply at git.blender.org
Thu Apr 18 11:25:43 CEST 2019


Commit: 7178267f200693add0afa68aeab40cf1de0d50c5
Author: Jacques Lucke
Date:   Thu Apr 18 10:19:30 2019 +0200
Branches: functions
https://developer.blender.org/rB7178267f200693add0afa68aeab40cf1de0d50c5

start using a better defined type system

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

M	release/scripts/startup/function_nodes/types.py
M	release/scripts/startup/function_nodes/types_base.py
M	source/blender/functions/frontends/data_flow_nodes/inserters/conversions.cpp
M	source/blender/functions/frontends/data_flow_nodes/inserters/sockets.cpp
M	source/blender/functions/functions/lists.cpp
M	source/blender/functions/types/numeric_lists.cpp
M	source/blender/functions/types/numeric_lists.hpp

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

diff --git a/release/scripts/startup/function_nodes/types.py b/release/scripts/startup/function_nodes/types.py
index 57023833847..1da4c1f6f46 100644
--- a/release/scripts/startup/function_nodes/types.py
+++ b/release/scripts/startup/function_nodes/types.py
@@ -14,17 +14,22 @@ from . sockets import (
 
 type_infos = DataTypesInfo()
 
-type_infos.insert_data_type("Float", UniqueSocketBuilder(FloatSocket))
-type_infos.insert_data_type("Vector", UniqueSocketBuilder(VectorSocket))
-type_infos.insert_data_type("Integer", UniqueSocketBuilder(IntegerSocket))
-type_infos.insert_data_type("Boolean", UniqueSocketBuilder(BooleanSocket))
-type_infos.insert_data_type("Float List", ColoredSocketBuilder((0, 0.3, 0.5, 0.5)))
-type_infos.insert_data_type("Vector List", ColoredSocketBuilder((0, 0, 0.5, 0.5)))
-type_infos.insert_data_type("Integer List", ColoredSocketBuilder((0.3, 0.7, 0.5, 0.5)))
+type_infos.insert_data_type(
+    "Float",
+    UniqueSocketBuilder(FloatSocket),
+    ColoredSocketBuilder((0, 0.3, 0.5, 0.5)))
+type_infos.insert_data_type(
+    "Vector",
+    UniqueSocketBuilder(VectorSocket),
+    ColoredSocketBuilder((0, 0, 0.5, 0.5)))
+type_infos.insert_data_type(
+    "Integer",
+    UniqueSocketBuilder(IntegerSocket),
+    ColoredSocketBuilder((0.3, 0.7, 0.5, 0.5)))
+type_infos.insert_data_type(
+    "Boolean",
+    UniqueSocketBuilder(BooleanSocket),
+    ColoredSocketBuilder((0.3, 0.3, 0.3, 0.5)))
 
-type_infos.insert_list_relation("Float", "Float List")
-type_infos.insert_list_relation("Vector", "Vector List")
-type_infos.insert_list_relation("Integer", "Integer List")
-
-type_infos.insert_implicitly_convertable_types({"Float", "Integer"})
-type_infos.insert_implicitly_convertable_types({"Float List", "Integer List"})
+type_infos.insert_implicit_conversion("Float", "Integer")
+type_infos.insert_implicit_conversion("Integer", "Float")
diff --git a/release/scripts/startup/function_nodes/types_base.py b/release/scripts/startup/function_nodes/types_base.py
index f8c697b90fa..da4886b3bda 100644
--- a/release/scripts/startup/function_nodes/types_base.py
+++ b/release/scripts/startup/function_nodes/types_base.py
@@ -1,6 +1,27 @@
 import itertools
 from collections import namedtuple
 
+'''
+Type Rules
+==========
+
+A -> B means, Type A can be converted to type B implicitely.
+A -!> B means, Type A cannot be converted to type B implicitely.
+A_List is the type that contains a list of elements of type A
+
+Iff T1 -> T2, then T1_List -> T2_List.
+T -> T_List.
+T_List -!> T.
+
+Types always come in pairs: T and T_List.
+There are no lists of lists.
+
+<
+Every group of implicitely convertable types, must define an order.
+This order specifies which type should be worked with, when multiple types come together.
+E.g. when adding a Float and an Integer, a float addition is performed.
+> not yet
+'''
 
 # Type Info Container
 #####################################
@@ -19,36 +40,39 @@ class DataTypesInfo:
     # Insert New Information
     #############################
 
-    def insert_data_type(self, data_type, builder):
-        assert data_type not in self.data_types
-        assert isinstance(builder, DataSocketBuilder)
+    def insert_data_type(self, base_type_name, base_builder, list_builder):
+        base_type = base_type_name
+        list_type = base_type_name + " List"
 
-        self.data_types.add(data_type)
-        self.builder_by_data_type[data_type] = builder
-
-    def insert_list_relation(self, base_type, list_type):
-        assert self.is_data_type(base_type)
-        assert self.is_data_type(list_type)
-        assert base_type not in self.list_by_base
-        assert list_type not in self.base_by_list
+        assert base_type not in self.data_types
+        assert list_type not in self.data_types
+        assert isinstance(base_builder, DataSocketBuilder)
+        assert isinstance(list_builder, DataSocketBuilder)
 
+        self.data_types.add(base_type)
+        self.data_types.add(list_type)
         self.list_by_base[base_type] = list_type
         self.base_by_list[list_type] = base_type
+        self.builder_by_data_type[base_type] = base_builder
+        self.builder_by_data_type[list_type] = list_builder
 
-        self.insert_implicit_conversion(base_type, list_type)
-
-    def insert_implicitly_convertable_types(self, types):
-        for type_1, type_2 in itertools.combinations(types, 2):
-            self.insert_implicit_conversion(type_1, type_2)
-            self.insert_implicit_conversion(type_2, type_1)
+        list_conversion = ImplicitConversion(base_type, list_type)
+        self.implicit_conversions.add(list_conversion)
 
     def insert_implicit_conversion(self, from_type, to_type):
         assert self.is_data_type(from_type)
         assert self.is_data_type(to_type)
+        assert self.is_base(from_type)
+        assert self.is_base(to_type)
+
+        base_conversion = ImplicitConversion(from_type, to_type)
+        assert base_conversion not in self.implicit_conversions
+        self.implicit_conversions.add(base_conversion)
 
-        conversion = ImplicitConversion(from_type, to_type)
-        assert conversion not in self.implicit_conversions
-        self.implicit_conversions.add(conversion)
+        list_conversion = ImplicitConversion(
+            self.to_list(from_type), self.to_list(to_type))
+        assert list_conversion not in self.implicit_conversions
+        self.implicit_conversions.add(list_conversion)
 
 
     # Query Information
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters/conversions.cpp b/source/blender/functions/frontends/data_flow_nodes/inserters/conversions.cpp
index 50a06290f52..20082d1e416 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters/conversions.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters/conversions.cpp
@@ -25,6 +25,7 @@ void register_conversion_inserters(GraphInserters &inserters)
   inserters.reg_conversion_inserter("Float", "Float List", INSERT_base_to_list);
   inserters.reg_conversion_inserter("Vector", "Vector List", INSERT_base_to_list);
   inserters.reg_conversion_inserter("Integer", "Integer List", INSERT_base_to_list);
+  inserters.reg_conversion_inserter("Boolean", "Boolean List", INSERT_base_to_list);
 
   inserters.reg_conversion_function(
       "Float List", "Integer List", Functions::GET_FN_float_list_to_int32_list);
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters/sockets.cpp b/source/blender/functions/frontends/data_flow_nodes/inserters/sockets.cpp
index ea9571a9c83..cb1e75d6d1f 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters/sockets.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters/sockets.cpp
@@ -48,6 +48,7 @@ void initialize_socket_inserters(GraphInserters &inserters)
   inserters.reg_socket_loader("Float List", LOAD_empty_list<float>);
   inserters.reg_socket_loader("Vector List", LOAD_empty_list<Types::Vector>);
   inserters.reg_socket_loader("Integer List", LOAD_empty_list<int32_t>);
+  inserters.reg_socket_loader("Boolean List", LOAD_empty_list<bool>);
 }
 
 }  // namespace DataFlowNodes
diff --git a/source/blender/functions/functions/lists.cpp b/source/blender/functions/functions/lists.cpp
index 8a6559c0e8a..e194740b04a 100644
--- a/source/blender/functions/functions/lists.cpp
+++ b/source/blender/functions/functions/lists.cpp
@@ -211,6 +211,7 @@ LAZY_INIT_REF_STATIC__NO_ARG(ListFunctions, get_list_functions)
   insert_list_functions_for_type<float>(functions, GET_TYPE_float(), GET_TYPE_float_list());
   insert_list_functions_for_type<Vector>(functions, GET_TYPE_fvec3(), GET_TYPE_fvec3_list());
   insert_list_functions_for_type<int32_t>(functions, GET_TYPE_int32(), GET_TYPE_int32_list());
+  insert_list_functions_for_type<bool>(functions, GET_TYPE_bool(), GET_TYPE_bool_list());
   return functions;
 }
 
diff --git a/source/blender/functions/types/numeric_lists.cpp b/source/blender/functions/types/numeric_lists.cpp
index 809bc82b0c9..3b50d554246 100644
--- a/source/blender/functions/types/numeric_lists.cpp
+++ b/source/blender/functions/types/numeric_lists.cpp
@@ -59,5 +59,10 @@ LAZY_INIT_REF__NO_ARG(SharedType, GET_TYPE_int32_list)
   return create_list_type<int32_t>("Int32 List");
 }
 
+LAZY_INIT_REF__NO_ARG(SharedType, GET_TYPE_bool_list)
+{
+  return create_list_type<bool>("Bool List");
+}
+
 }  // namespace Types
 }  // namespace FN
diff --git a/source/blender/functions/types/numeric_lists.hpp b/source/blender/functions/types/numeric_lists.hpp
index b3d1b3d600f..0c0b0163e93 100644
--- a/source/blender/functions/types/numeric_lists.hpp
+++ b/source/blender/functions/types/numeric_lists.hpp
@@ -10,10 +10,12 @@ namespace Types {
 using SharedFloatList = SharedList<float>;
 using SharedFVec3List = SharedList<Vector>;
 using SharedInt32List = SharedList<int32_t>;
+using SharedBoolList = SharedList<bool>;
 
 SharedType &GET_TYPE_float_list();
 SharedType &GET_TYPE_fvec3_list();
 SharedType &GET_TYPE_int32_list();
+SharedType &GET_TYPE_bool_list();
 
 }  // namespace Types
 }  // namespace FN



More information about the Bf-blender-cvs mailing list