[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