[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