[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