[Bf-blender-cvs] [6db9c27] object_nodes: Use a simple value node for graph outputs that are only connected to pass nodes.

Lukas Tönne noreply at git.blender.org
Thu Nov 26 12:47:59 CET 2015


Commit: 6db9c275f37665502aae62c7c51c11a9baa1a20a
Author: Lukas Tönne
Date:   Thu Nov 26 12:47:12 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB6db9c275f37665502aae62c7c51c11a9baa1a20a

Use a simple value node for graph outputs that are only connected to pass nodes.

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

M	source/blender/blenvm/compile/bvm_codegen.cc
M	source/blender/blenvm/compile/bvm_nodegraph.cc
M	source/blender/blenvm/compile/bvm_nodegraph.h

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

diff --git a/source/blender/blenvm/compile/bvm_codegen.cc b/source/blender/blenvm/compile/bvm_codegen.cc
index faaf275..0ddc061 100644
--- a/source/blender/blenvm/compile/bvm_codegen.cc
+++ b/source/blender/blenvm/compile/bvm_codegen.cc
@@ -478,7 +478,7 @@ Function *BVMCompiler::codegen_function(const NodeGraph &graph)
 	     ++it) {
 		const NodeGraph::Output &output = *it;
 		
-		const NodeSocket *socket = output.key.node->type->find_input(output.key.socket);
+		const NodeSocket *socket = output.key.node->type->find_output(output.key.socket);
 		ReturnValue &rval = fn->add_return_value(socket->typedesc, output.name);
 		
 		rval.stack_offset = input_index[output.key.node->input(0)];
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index b270ac7..9b7b63b 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -665,6 +665,23 @@ SocketPair NodeGraph::add_proxy(const TypeDesc &typedesc, Value *default_value)
 	return SocketPair(node, "value");
 }
 
+SocketPair NodeGraph::add_value_node(Value *value)
+{
+	NodeInstance *node = NULL;
+	switch (value->typedesc().base_type) {
+		case BVM_FLOAT: node = add_node("VALUE_FLOAT"); break;
+		case BVM_FLOAT3: node = add_node("VALUE_FLOAT3"); break;
+		case BVM_FLOAT4: node = add_node("VALUE_FLOAT4"); break;
+		case BVM_INT: node = add_node("VALUE_INT"); break;
+		case BVM_MATRIX44: node = add_node("VALUE_MATRIX44"); break;
+		case BVM_MESH: node = add_node("VALUE_MESH"); break;
+		case BVM_POINTER: node = add_node("VALUE_POINTER"); break;
+	}
+	if (node)
+		node->set_input_value("value", value);
+	return SocketPair(node, "value");
+}
+
 /* ------------------------------------------------------------------------- */
 /* Optimization */
 
@@ -676,6 +693,17 @@ void NodeGraph::remove_all_nodes()
 	nodes.clear();
 }
 
+SocketPair NodeGraph::find_root(const SocketPair &key)
+{
+	SocketPair root = key;
+	while (root.node && root.node->type->is_pass_node()) {
+		NodeInstance *link_node = root.node->find_input_link_node(0);
+		const NodeSocket *link_socket = root.node->find_input_link_socket(0);
+		root = SocketPair(link_node, link_socket ? link_socket->name : "");
+	}
+	return root;
+}
+
 void NodeGraph::skip_pass_nodes()
 {
 	/* redirect links to skip over 'pass'-type nodes */
@@ -690,31 +718,30 @@ void NodeGraph::skip_pass_nodes()
 		     ++it_input) {
 			NodeInstance::InputInstance &input = it_input->second;
 			
-			NodeInstance *link_node = input.link_node;
-			const NodeSocket *link_socket = input.link_socket;
-			while (link_node && link_node->type->is_pass_node()) {
-				/* note: order of assignment is important here! */
-				link_socket = link_node->find_input_link_socket(0);
-				link_node = link_node->find_input_link_node(0);
+			if (input.link_node && input.link_socket) {
+				SocketPair root_key = find_root(SocketPair(input.link_node, input.link_socket->name));
+				input.link_node = root_key.node;
+				input.link_socket = root_key.node->type->find_output(root_key.socket);
 			}
-			input.link_node = link_node;
-			input.link_socket = link_socket;
 		}
 	}
 	
 	/* move output references upstream as well */
 	for (OutputList::iterator it_output = outputs.begin(); it_output != outputs.end(); ++it_output) {
 		Output &output = *it_output;
+		assert(output.key.node);
+		
+		SocketPair root_key = find_root(output.key);
 		
-		NodeInstance *link_node = output.key.node;
-		const NodeSocket *link_socket = link_node->type->find_output(output.key.socket);
-		while (link_node && link_node->type->is_pass_node()) {
-			/* note: order of assignment is important here! */
-			link_socket = link_node->find_input_link_socket(0);
-			link_node = link_node->find_input_link_node(0);
+		/* if the output only has NOOP inputs,
+		 * create a value node as valid root
+		 */
+		if (!root_key.node) {
+			Value *value = output.key.node->find_input_value(output.key.socket);
+			root_key = add_value_node(value);
 		}
-		assert(link_node && link_socket);
-		output.key = SocketPair(link_node, link_socket->name);
+		
+		output.key = root_key;
 	}
 }
 
@@ -1066,6 +1093,14 @@ OpCode get_opcode_from_node_type(const string &node)
 	if (node == STRINGIFY(name)) \
 		return OP_##name
 	
+	NODETYPE(VALUE_FLOAT);
+	NODETYPE(VALUE_FLOAT3);
+	NODETYPE(VALUE_FLOAT4);
+	NODETYPE(VALUE_INT);
+	NODETYPE(VALUE_MATRIX44);
+	NODETYPE(VALUE_POINTER);
+	NODETYPE(VALUE_MESH);
+	
 	NODETYPE(FLOAT_TO_INT);
 	NODETYPE(INT_TO_FLOAT);
 	NODETYPE(SET_FLOAT3);
@@ -1170,6 +1205,34 @@ static void register_opcode_node_types()
 	nt->add_input("value", BVM_MESH, __empty_mesh__);
 	nt->add_output("value", BVM_MESH, __empty_mesh__);
 	
+	nt = NodeGraph::add_pass_node_type("VALUE_FLOAT");
+	nt->add_input("value", BVM_FLOAT, 0.0f, VALUE_CONSTANT);
+	nt->add_output("value", BVM_FLOAT, 0.0f);
+	
+	nt = NodeGraph::add_pass_node_type("VALUE_FLOAT3");
+	nt->add_input("value", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f), VALUE_CONSTANT);
+	nt->add_output("value", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+	
+	nt = NodeGraph::add_pass_node_type("VALUE_FLOAT4");
+	nt->add_input("value", BVM_FLOAT4, float4(0.0f, 0.0f, 0.0f, 0.0f), VALUE_CONSTANT);
+	nt->add_output("value", BVM_FLOAT4, float4(0.0f, 0.0f, 0.0f, 0.0f));
+	
+	nt = NodeGraph::add_pass_node_type("VALUE_INT");
+	nt->add_input("value", BVM_INT, 0, VALUE_CONSTANT);
+	nt->add_output("value", BVM_INT, 0);
+	
+	nt = NodeGraph::add_pass_node_type("VALUE_MATRIX44");
+	nt->add_input("value", BVM_MATRIX44, matrix44::identity(), VALUE_CONSTANT);
+	nt->add_output("value", BVM_MATRIX44, matrix44::identity());
+	
+	nt = NodeGraph::add_pass_node_type("VALUE_POINTER");
+	nt->add_input("value", BVM_POINTER, PointerRNA_NULL, VALUE_CONSTANT);
+	nt->add_output("value", BVM_POINTER, PointerRNA_NULL);
+	
+	nt = NodeGraph::add_pass_node_type("VALUE_MESH");
+	nt->add_input("value", BVM_MESH, __empty_mesh__, VALUE_CONSTANT);
+	nt->add_output("value", BVM_MESH, __empty_mesh__);
+	
 	nt = NodeGraph::add_function_node_type("GET_ELEM_FLOAT3");
 	nt->add_input("index", BVM_INT, 0, VALUE_CONSTANT);
 	nt->add_input("value", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.h b/source/blender/blenvm/compile/bvm_nodegraph.h
index 927f760..b49ce98 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.h
+++ b/source/blender/blenvm/compile/bvm_nodegraph.h
@@ -367,8 +367,10 @@ protected:
 	SocketPair add_type_converter(const SocketPair &from, const TypeDesc &to_typedesc);
 	
 	SocketPair add_proxy(const TypeDesc &typedesc, Value *default_value = NULL);
+	SocketPair add_value_node(Value *value);
 	
 	void remove_all_nodes();
+	SocketPair find_root(const SocketPair &key);
 	void skip_pass_nodes();
 	void remove_unused_nodes();




More information about the Bf-blender-cvs mailing list