[Bf-blender-cvs] [c6e4c29988f] functions: implement concept of implicit conversions

Jacques Lucke noreply at git.blender.org
Thu Mar 21 12:18:13 CET 2019


Commit: c6e4c29988fd495b6b6bb1102c5dce5798b88a96
Author: Jacques Lucke
Date:   Thu Mar 21 12:17:35 2019 +0100
Branches: functions
https://developer.blender.org/rBc6e4c29988fd495b6b6bb1102c5dce5798b88a96

implement concept of implicit conversions

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

M	release/scripts/startup/function_nodes/types.py
M	release/scripts/startup/function_nodes/types_base.py
M	release/scripts/startup/function_nodes/update.py
M	source/blender/functions/CMakeLists.txt
M	source/blender/functions/FN_functions.hpp
M	source/blender/functions/frontends/data_flow_nodes/builder.cpp
M	source/blender/functions/frontends/data_flow_nodes/builder.hpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M	source/blender/functions/frontends/data_flow_nodes/inserters.cpp
M	source/blender/functions/frontends/data_flow_nodes/inserters.hpp
M	source/blender/functions/frontends/data_flow_nodes/registry.hpp
A	source/blender/functions/frontends/data_flow_nodes/test_conversions.cpp
A	source/blender/functions/functions/simple_conversions.cpp
A	source/blender/functions/functions/simple_conversions.hpp

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

diff --git a/release/scripts/startup/function_nodes/types.py b/release/scripts/startup/function_nodes/types.py
index 525c7daedec..b0402c911a0 100644
--- a/release/scripts/startup/function_nodes/types.py
+++ b/release/scripts/startup/function_nodes/types.py
@@ -22,4 +22,6 @@ type_infos.insert_data_type("Integer List", ColoredSocketBuilder((0.3, 0.7, 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")
\ No newline at end of file
+type_infos.insert_list_relation("Integer", "Integer List")
+
+type_infos.insert_implicitly_convertable_types({"Float", "Integer"})
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/types_base.py b/release/scripts/startup/function_nodes/types_base.py
index afb35cadbfe..962d7575953 100644
--- a/release/scripts/startup/function_nodes/types_base.py
+++ b/release/scripts/startup/function_nodes/types_base.py
@@ -1,12 +1,23 @@
+import itertools
+from collections import namedtuple
+
+
 # Type Info Container
 #####################################
 
+ImplicitConversion = namedtuple("ImplicitConversion", ("from_type", "to_type"))
+
 class DataTypesInfo:
     def __init__(self):
         self.data_types = set()
         self.builder_by_data_type = dict()
         self.list_by_base = dict()
         self.base_by_list = dict()
+        self.implicit_conversions = set()
+
+
+    # Insert New Information
+    #############################
 
     def insert_data_type(self, data_type, builder):
         assert data_type not in self.data_types
@@ -24,6 +35,23 @@ class DataTypesInfo:
         self.list_by_base[base_type] = list_type
         self.base_by_list[list_type] = base_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)
+
+    def insert_implicit_conversion(self, from_type, to_type):
+        assert self.is_data_type(from_type)
+        assert self.is_data_type(to_type)
+
+        conversion = ImplicitConversion(from_type, to_type)
+        assert conversion not in self.implicit_conversions
+        self.implicit_conversions.add(conversion)
+
+
+    # Query Information
+    ##########################
+
     def is_data_type(self, data_type):
         return data_type in self.data_types
 
@@ -72,6 +100,18 @@ class DataTypesInfo:
         builder = self.to_builder(data_type)
         return builder.get_color()
 
+    def is_link_allowed(self, from_type, to_type):
+        assert self.is_data_type(from_type)
+        assert self.is_data_type(to_type)
+
+        if from_type == to_type:
+            return True
+        else:
+            return self.is_implicitly_convertable(from_type, to_type)
+
+    def is_implicitly_convertable(self, from_type, to_type):
+        return ImplicitConversion(from_type, to_type) in self.implicit_conversions
+
 
 # Data Socket Builders
 ##################################3
@@ -105,7 +145,6 @@ class ColoredSocketBuilder(DataSocketBuilder):
             "fn_CustomColoredSocket",
             name,
             identifier=identifier)
-        socket.color = self.color
         return socket
 
     def get_color(self):
diff --git a/release/scripts/startup/function_nodes/update.py b/release/scripts/startup/function_nodes/update.py
index 3699ded7487..9252cf26f19 100644
--- a/release/scripts/startup/function_nodes/update.py
+++ b/release/scripts/startup/function_nodes/update.py
@@ -237,6 +237,8 @@ def is_link_valid(link):
         return False
 
     if is_data_src and is_data_dst:
-        return link.from_socket.data_type == link.to_socket.data_type
+        from_type = link.from_socket.data_type
+        to_type = link.to_socket.data_type
+        return type_infos.is_link_allowed(from_type, to_type)
 
     return True
diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index fc5339aca51..7ea38d9d11a 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -82,6 +82,8 @@ set(SRC
 	functions/vectors.cpp
 	functions/lists.hpp
 	functions/lists.cpp
+	functions/simple_conversions.hpp
+	functions/simple_conversions.cpp
 
 	frontends/data_flow_nodes/builder.hpp
 	frontends/data_flow_nodes/builder.cpp
@@ -94,6 +96,7 @@ set(SRC
 	frontends/data_flow_nodes/registry.hpp
 	frontends/data_flow_nodes/test_nodes.cpp
 	frontends/data_flow_nodes/test_sockets.cpp
+	frontends/data_flow_nodes/test_conversions.cpp
 	frontends/data_flow_nodes/util_wrappers.hpp
 )
 
diff --git a/source/blender/functions/FN_functions.hpp b/source/blender/functions/FN_functions.hpp
index 0491d778c55..03b4ad977d0 100644
--- a/source/blender/functions/FN_functions.hpp
+++ b/source/blender/functions/FN_functions.hpp
@@ -1,7 +1,8 @@
 #pragma once
 
-#include "./functions/object_input.hpp"
-#include "./functions/random.hpp"
-#include "./functions/scalar_math.hpp"
-#include "./functions/vectors.hpp"
-#include "./functions/lists.hpp"
\ No newline at end of file
+#include "functions/object_input.hpp"
+#include "functions/random.hpp"
+#include "functions/scalar_math.hpp"
+#include "functions/vectors.hpp"
+#include "functions/lists.hpp"
+#include "functions/simple_conversions.hpp"
\ No newline at end of file
diff --git a/source/blender/functions/frontends/data_flow_nodes/builder.cpp b/source/blender/functions/frontends/data_flow_nodes/builder.cpp
index 03651d0ca31..d7c8c60f600 100644
--- a/source/blender/functions/frontends/data_flow_nodes/builder.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/builder.cpp
@@ -71,6 +71,12 @@ namespace FN { namespace DataFlowNodes {
 		this->map_socket(socket, bsocket);
 	}
 
+	Socket Builder::lookup_socket(struct bNodeSocket *bsocket)
+	{
+		BLI_assert(m_socket_map.contains(bsocket));
+		return m_socket_map.lookup(bsocket);
+	}
+
 
 	struct bNodeTree *BuilderContext::btree() const
 	{
@@ -117,13 +123,8 @@ namespace FN { namespace DataFlowNodes {
 
 	SharedType &BuilderContext::type_of_socket(bNodeSocket *bsocket) const
 	{
-		PointerRNA ptr;
-		this->get_rna(bsocket, &ptr);
-
-		char data_type[64];
-		RNA_string_get(&ptr, "data_type", data_type);
-
-		return this->type_by_name(data_type);
+		std::string data_type = this->socket_type_string(bsocket);
+		return this->type_by_name(data_type.c_str());
 	}
 
 	void BuilderContext::get_rna(bNode *bnode, PointerRNA *ptr) const
@@ -149,4 +150,14 @@ namespace FN { namespace DataFlowNodes {
 		return this->type_by_name(type_name);
 	}
 
+	std::string BuilderContext::socket_type_string(bNodeSocket *bsocket) const
+	{
+		BLI_assert(this->is_data_socket(bsocket));
+		PointerRNA ptr;
+		this->get_rna(bsocket, &ptr);
+		char type_name[64];
+		RNA_string_get(&ptr, "data_type", type_name);
+		return type_name;
+	}
+
 } } /* namespace FN::DataFlowNodes */
\ No newline at end of file
diff --git a/source/blender/functions/frontends/data_flow_nodes/builder.hpp b/source/blender/functions/frontends/data_flow_nodes/builder.hpp
index 52436e269e2..4e7db7a493d 100644
--- a/source/blender/functions/frontends/data_flow_nodes/builder.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/builder.hpp
@@ -34,6 +34,8 @@ namespace FN { namespace DataFlowNodes {
 		void map_data_sockets(Node *node, struct bNode *bnode, const BuilderContext &ctx);
 		void map_input(Socket socket, struct bNode *bnode, uint index);
 		void map_output(Socket socket, struct bNode *bnode, uint index);
+
+		Socket lookup_socket(struct bNodeSocket *bsocket);
 	};
 
 	class BuilderContext {
@@ -54,6 +56,7 @@ namespace FN { namespace DataFlowNodes {
 		void get_rna(bNode *bnode, PointerRNA *ptr) const;
 		void get_rna(bNodeSocket *bsocket, PointerRNA *ptr) const;
 		SharedType &type_from_rna(bNode *bnode, const char *prop_name) const;
+		std::string socket_type_string(bNodeSocket *bsocket) const;
 	};
 
 } }
\ No newline at end of file
diff --git a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
index a19a315ebec..ecf2754e111 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -111,12 +111,9 @@ namespace FN { namespace DataFlowNodes {
 		}
 
 		for (bNodeLink *blink : bLinkList(&btree->links)) {
-			Socket from = socket_map.lookup(blink->fromsock);
-			Socket to = socket_map.lookup(blink->tosock);
-			if (from.type() != to.type()) {
+			if (!inserters.insert_link(builder, ctx, blink)) {
 				return {};
 			}
-			builder.insert_link(from, to);
 		}
 
 		BSockets unlinked_inputs;
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
index fb6eff037c4..8820fb419bb 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
@@ -12,6 +12,7 @@ namespace FN { namespace DataFlowNodes {
 	{
 		register_node_inserters(inserters);
 		initialize_socket_inserters(inserters);
+		register_conversion_inserters(inserters);
 	}
 
 	LAZY_INIT_REF__NO_ARG(GraphInserters, get_standard_inserters)
@@ -48,6 +49,35 @@ namespace FN { namespace DataFlowNodes {
 		m_socket_loaders.add(idname, loader);
 	}
 
+	void GraphInserters::reg_conversion_inserter(
+		std::string from_type,
+		std::string to_type,
+		ConversionInserter inserter)
+	{
+		auto key = std::pair<std::string, std::string>(from_type, to_type);
+		BLI_assert(!m_conversion_inserters.contains(key));
+		m_conversion_inserters.add(key, inserter);
+	}
+
+	void GraphInserters::reg_conversion_function(
+		std::string from_type,
+		std::string to_type,
+		FunctionGetter getter)
+	{
+		auto inserter = [getter](
+				Builder &builder,
+				const BuilderContext &UNUSED(ctx),
+				Socket from,
+				Socket to)
+			{
+				auto fn = getter();
+				Node *node = builder.insert_function(fn);
+				builder.insert_link(from, node->input(0));
+				builder.insert_link(node->output

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list