[Bf-blender-cvs] [bcb6fa6e510] functions: use better socket names in conversion to functions

Jacques Lucke noreply at git.blender.org
Wed Apr 3 11:56:23 CEST 2019


Commit: bcb6fa6e510b7b8b2420eb1a7bc10d4a024b5581
Author: Jacques Lucke
Date:   Wed Apr 3 11:13:52 2019 +0200
Branches: functions
https://developer.blender.org/rBbcb6fa6e510b7b8b2420eb1a7bc10d4a024b5581

use better socket names in conversion to functions

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

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/util_wrappers.hpp

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

diff --git a/source/blender/functions/frontends/data_flow_nodes/builder.cpp b/source/blender/functions/frontends/data_flow_nodes/builder.cpp
index 0b8412cf325..d32f93d18c6 100644
--- a/source/blender/functions/frontends/data_flow_nodes/builder.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/builder.cpp
@@ -16,6 +16,25 @@
 	}
 #endif
 
+#ifdef WITH_PYTHON
+static PyObject *get_py_bnode(bNodeTree *btree, bNode *bnode)
+{
+	PointerRNA ptr;
+	RNA_pointer_create(
+		&btree->id, &RNA_Node,
+		bnode, &ptr);
+	return pyrna_struct_CreatePyObject(&ptr);
+}
+static PyObject *get_py_bsocket(bNodeTree *btree, bNodeSocket *bsocket)
+{
+	PointerRNA ptr;
+	RNA_pointer_create(
+		&btree->id, &RNA_NodeSocket,
+		bsocket, &ptr);
+	return pyrna_struct_CreatePyObject(&ptr);
+}
+#endif
+
 namespace FN { namespace DataFlowNodes {
 
 	class NodeSource : public SourceInfo {
@@ -45,15 +64,9 @@ namespace FN { namespace DataFlowNodes {
 			PyObject *globals = PyModule_GetDict(module);
 			PyObject *function = PyDict_GetItemString(globals, "report_warning");
 
-			PointerRNA ptr;
-			RNA_pointer_create(
-				&m_btree->id, &RNA_Node,
-				m_bnode, &ptr);
-
-			PyObject *py_bnode = pyrna_struct_CreatePyObject(&ptr);
-
-			PyObject *args = Py_BuildValue("(Os)", py_bnode, msg.c_str());
-			PyObject_CallObject(function, args);
+			PyObject *py_bnode = get_py_bnode(m_btree, m_bnode);
+			PyObject *ret = PyObject_CallFunction(function, "Os", py_bnode, msg.c_str());
+			Py_DECREF(ret);
 
 			PyGILState_Release(gilstate);
 #endif
@@ -253,6 +266,26 @@ namespace FN { namespace DataFlowNodes {
 		return this->type_by_name(data_type.c_str());
 	}
 
+	std::string BuilderContext::name_of_socket(bNode *bnode, bNodeSocket *bsocket) const
+	{
+#ifdef WITH_PYTHON
+		PyGILState_STATE gilstate;
+		gilstate = PyGILState_Ensure();
+
+		PyObject *py_bnode = get_py_bnode(m_btree, bnode);
+		PyObject *py_bsocket = get_py_bsocket(m_btree, bsocket);
+		PyObject *ret = PyObject_CallMethod(py_bsocket, "get_name", "O", py_bnode);
+		BLI_assert(PyUnicode_Check(ret));
+		const char *name_ = PyUnicode_AsUTF8(ret);
+		std::string name(name_);
+		Py_DECREF(ret);
+
+		PyGILState_Release(gilstate);
+		return name;
+#endif
+		return bsocket->name;
+	}
+
 	void BuilderContext::get_rna(bNode *bnode, PointerRNA *ptr) const
 	{
 		RNA_pointer_create(
diff --git a/source/blender/functions/frontends/data_flow_nodes/builder.hpp b/source/blender/functions/frontends/data_flow_nodes/builder.hpp
index 255cb3268e5..2ee90ae80d4 100644
--- a/source/blender/functions/frontends/data_flow_nodes/builder.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/builder.hpp
@@ -63,6 +63,7 @@ namespace FN { namespace DataFlowNodes {
 		bool is_data_socket(bNodeSocket *bsocket) const;
 		SharedType &type_by_name(const char *data_type) const;
 		SharedType &type_of_socket(bNodeSocket *bsocket) const;
+		std::string name_of_socket(bNode *bnode, bNodeSocket *bsocket) const;
 
 		void get_rna(bNode *bnode, PointerRNA *ptr) const;
 		void get_rna(bNodeSocket *bsocket, PointerRNA *ptr) const;
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 35e12a23117..3cae92cf08e 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -47,7 +47,7 @@ namespace FN { namespace DataFlowNodes {
 		for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
 			if (ctx.is_data_socket(bsocket)) {
 				SharedType &type = ctx.type_of_socket(bsocket);
-				outputs.append(OutputParameter(bsocket->name, type));
+				outputs.append(OutputParameter(ctx.name_of_socket(bnode, bsocket), type));
 			}
 		}
 
@@ -63,7 +63,7 @@ namespace FN { namespace DataFlowNodes {
 		for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
 			if (ctx.is_data_socket(bsocket)) {
 				SharedType &type = ctx.type_of_socket(bsocket);
-				inputs.append(InputParameter(bsocket->name, type));
+				inputs.append(InputParameter(ctx.name_of_socket(bnode, bsocket), type));
 			}
 		}
 
@@ -203,6 +203,7 @@ namespace FN { namespace DataFlowNodes {
 		}
 
 		BSockets unlinked_inputs;
+		BNodes unlinked_inputs_nodes;
 		SmallSocketVector node_inputs;
 		for (bNode *bnode : bNodeList(&btree->nodes)) {
 			for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
@@ -210,13 +211,15 @@ namespace FN { namespace DataFlowNodes {
 					Socket socket = socket_map.lookup(bsocket);
 					if (!socket.is_linked()) {
 						unlinked_inputs.append(bsocket);
+						unlinked_inputs_nodes.append(bnode);
 						node_inputs.append(socket);
 					}
 				}
 			}
 		}
 
-		SmallSocketVector new_origins = inserters.insert_sockets(builder, ctx, unlinked_inputs);
+		SmallSocketVector new_origins = inserters.insert_sockets(
+			builder, ctx, unlinked_inputs, unlinked_inputs_nodes);
 		BLI_assert(unlinked_inputs.size() == new_origins.size());
 
 		for (uint i = 0; i < unlinked_inputs.size(); i++) {
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
index 93e719f34a9..655ed7e2fe1 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
@@ -130,11 +130,17 @@ namespace FN { namespace DataFlowNodes {
 	SmallSocketVector GraphInserters::insert_sockets(
 		Builder &builder,
 		const BuilderContext &ctx,
-		BSockets &bsockets)
+		BSockets &bsockets,
+		BNodes &bnodes)
 	{
+		BLI_assert(bsockets.size() == bnodes.size());
+
 		SmallVector<SocketLoader> loaders;
 		OutputParameters outputs;
-		for (auto *bsocket : bsockets) {
+		for (uint i = 0; i < bsockets.size(); i++) {
+			bNode *bnode = bnodes[i];
+			bNodeSocket *bsocket = bsockets[i];
+
 			PointerRNA ptr;
 			RNA_pointer_create(
 				ctx.btree_id(), &RNA_NodeSocket,
@@ -145,7 +151,9 @@ namespace FN { namespace DataFlowNodes {
 
 			SocketLoader loader = m_socket_loaders.lookup(data_type);
 			loaders.append(loader);
-			outputs.append(OutputParameter(bsocket->name, ctx.type_of_socket(bsocket)));
+			outputs.append(OutputParameter(
+				ctx.name_of_socket(bnode, bsocket),
+				ctx.type_of_socket(bsocket)));
 		}
 
 		auto fn = SharedFunction::New("Input Sockets", Signature({}, outputs));
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.hpp b/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
index 7da9fdf79ee..a90c279ad64 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
@@ -59,7 +59,8 @@ namespace FN { namespace DataFlowNodes {
 		SmallSocketVector insert_sockets(
 			Builder &builder,
 			const BuilderContext &ctx,
-			BSockets &bsockets);
+			BSockets &bsockets,
+			BNodes &bnodes);
 
 		bool insert_link(
 			Builder &builder,
diff --git a/source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp b/source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp
index 2fb2e853ed9..8287102c753 100644
--- a/source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp
@@ -13,5 +13,6 @@ namespace FN { namespace DataFlowNodes {
 	using bLinkList = ListBaseWrapper<struct bNodeLink, true>;
 	using bSocketList = ListBaseWrapper<struct bNodeSocket, true>;
 	using BSockets = SmallVector<struct bNodeSocket *>;
+	using BNodes = SmallVector<struct bNode *>;
 
 } } /* namespace FN::DataFlowNodes */
\ No newline at end of file



More information about the Bf-blender-cvs mailing list