[Bf-blender-cvs] [acbfda0c6bc] functions: Implicit conversion from individual elements to lists

Jacques Lucke noreply at git.blender.org
Sat Apr 6 18:47:17 CEST 2019


Commit: acbfda0c6bc686dd736ba16cb598f3aa1f61c724
Author: Jacques Lucke
Date:   Sat Apr 6 15:23:17 2019 +0200
Branches: functions
https://developer.blender.org/rBacbfda0c6bc686dd736ba16cb598f3aa1f61c724

Implicit conversion from individual elements to lists

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

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

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

diff --git a/release/scripts/startup/function_nodes/types_base.py b/release/scripts/startup/function_nodes/types_base.py
index b5e990593e0..6f1bd2c9c4e 100644
--- a/release/scripts/startup/function_nodes/types_base.py
+++ b/release/scripts/startup/function_nodes/types_base.py
@@ -35,6 +35,8 @@ class DataTypesInfo:
         self.list_by_base[base_type] = list_type
         self.base_by_list[list_type] = base_type
 
+        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)
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 ef8443447bb..e897abd017b 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters/conversions.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters/conversions.cpp
@@ -4,10 +4,29 @@
 
 namespace FN { namespace DataFlowNodes {
 
+	static void insert_base_to_list_conversion(
+		Builder &builder,
+		const BuilderContext &UNUSED(ctx),
+		Socket from,
+		Socket to,
+		struct bNodeLink *UNUSED(source_link))
+	{
+		SharedType &base_type = from.type();
+		auto fn = Functions::list_from_element(base_type);
+		Node *node = builder.insert_function(fn);
+		builder.insert_link(from, node->input(0));
+		builder.insert_link(node->output(0), to);
+	}
+
+
 	void register_conversion_inserters(GraphInserters &inserters)
 	{
 		inserters.reg_conversion_function("Integer", "Float", Functions::int32_to_float);
 		inserters.reg_conversion_function("Float", "Integer", Functions::float_to_int32);
+
+		inserters.reg_conversion_inserter("Float", "Float List", insert_base_to_list_conversion);
+		inserters.reg_conversion_inserter("Vector", "Vector List", insert_base_to_list_conversion);
+		inserters.reg_conversion_inserter("Integer", "Integer List", insert_base_to_list_conversion);
 	}
 
 } } /* namespace FN::DataFlowNodes */
\ No newline at end of file
diff --git a/source/blender/functions/functions/lists.cpp b/source/blender/functions/functions/lists.cpp
index 05bf31eb6e2..44f72ee8fdf 100644
--- a/source/blender/functions/functions/lists.cpp
+++ b/source/blender/functions/functions/lists.cpp
@@ -31,6 +31,33 @@ namespace FN { namespace Functions {
 	}
 
 
+	template<typename T>
+	class CreateSingleElementList : public TupleCallBody {
+		void call(Tuple &fn_in, Tuple &fn_out, ExecutionContext &UNUSED(ctx)) const override
+		{
+			auto list = SharedList<T>::New();
+			T value = fn_in.relocate_out<T>(0);
+			list->append(value);
+			fn_out.move_in(0, list);
+		}
+	};
+
+	template<typename T>
+	SharedFunction build_create_single_element_list_function(
+		SharedType &base_type,
+		SharedType &list_type)
+	{
+		std::string name = "Create " + base_type->name() + " List from Value";
+		auto fn = SharedFunction::New(name, Signature({
+			InputParameter("Value", base_type),
+		}, {
+			OutputParameter("List", list_type),
+		}));
+		fn->add_body(new CreateSingleElementList<T>());
+		return fn;
+	}
+
+
 	template<typename T>
 	class AppendToList : public TupleCallBody {
 		void call(Tuple &fn_in, Tuple &fn_out, ExecutionContext &UNUSED(ctx)) const override
@@ -161,6 +188,7 @@ namespace FN { namespace Functions {
 
 	struct ListFunctions {
 		FunctionPerType m_create_empty;
+		FunctionPerType m_from_element;
 		FunctionPerType m_append;
 		FunctionPerType m_get_element;
 		FunctionPerType m_combine;
@@ -176,6 +204,9 @@ namespace FN { namespace Functions {
 		functions.m_create_empty.add(
 			base_type,
 			build_create_empty_list_function<T>(base_type, list_type));
+		functions.m_from_element.add(
+			base_type,
+			build_create_single_element_list_function<T>(base_type, list_type));
 		functions.m_append.add(
 			base_type,
 			build_append_function<T>(base_type, list_type));
@@ -213,6 +244,13 @@ namespace FN { namespace Functions {
 		return functions.lookup_ref(base_type);
 	}
 
+	SharedFunction &list_from_element(SharedType &base_type)
+	{
+		FunctionPerType &functions = get_list_functions().m_from_element;
+		BLI_assert(functions.contains(base_type));
+		return functions.lookup_ref(base_type);
+	}
+
 	SharedFunction &append_to_list(SharedType &base_type)
 	{
 		FunctionPerType &functions = get_list_functions().m_append;
@@ -241,4 +279,10 @@ namespace FN { namespace Functions {
 		return functions.lookup_ref(base_type);
 	}
 
+	SharedType &get_list_type(SharedType &base_type)
+	{
+		SharedFunction &fn = append_to_list(base_type);
+		return fn->signature().inputs()[0].type();
+	}
+
 } } /* namespace FN::Functions */
\ No newline at end of file
diff --git a/source/blender/functions/functions/lists.hpp b/source/blender/functions/functions/lists.hpp
index 1035d963356..2da8e3c61e7 100644
--- a/source/blender/functions/functions/lists.hpp
+++ b/source/blender/functions/functions/lists.hpp
@@ -4,7 +4,10 @@
 
 namespace FN { namespace Functions {
 
+	SharedType &get_list_type(SharedType &base_type);
+
 	SharedFunction &empty_list(SharedType &base_type);
+	SharedFunction &list_from_element(SharedType &base_type);
 	SharedFunction &append_to_list(SharedType &base_type);
 	SharedFunction &get_list_element(SharedType &base_type);
 	SharedFunction &combine_lists(SharedType &base_type);



More information about the Bf-blender-cvs mailing list