Cycles: make node with multiple input sockets with the same name work. Previously

nodes like Mix had their sockets renamed to Color1/Color2, but doing this breaks
compatibility for the internal renderer, so restored it now.
This commit is contained in:
Brecht Van Lommel
2011-10-12 15:45:52 +00:00
parent 7503a7edfb
commit 9ec1114765
7 changed files with 100 additions and 61 deletions

View File

@@ -50,36 +50,26 @@ void BlenderSync::find_shader(BL::ID id, vector<uint>& used_shaders)
/* Graph */
static BL::NodeSocket get_node_input(BL::Node *b_group_node, BL::Node b_node, const string& name)
static BL::NodeSocket get_node_input(BL::Node *b_group_node, BL::NodeSocket b_in)
{
BL::Node::inputs_iterator b_in;
if(b_group_node) {
for(b_node.inputs.begin(b_in); b_in != b_node.inputs.end(); ++b_in) {
if(b_in->name() == name) {
if(b_group_node) {
BL::NodeTree b_ntree = BL::NodeGroup(*b_group_node).node_tree();
BL::NodeTree::links_iterator b_link;
BL::NodeTree b_ntree = BL::NodeGroup(*b_group_node).node_tree();
BL::NodeTree::links_iterator b_link;
for(b_ntree.links.begin(b_link); b_link != b_ntree.links.end(); ++b_link) {
if(b_link->to_socket().ptr.data == b_in.ptr.data) {
BL::Node::inputs_iterator b_gin;
for(b_ntree.links.begin(b_link); b_link != b_ntree.links.end(); ++b_link) {
if(b_link->to_socket().ptr.data == b_in->ptr.data) {
BL::Node::inputs_iterator b_gin;
for(b_group_node->inputs.begin(b_gin); b_gin != b_group_node->inputs.end(); ++b_gin)
if(b_gin->group_socket().ptr.data == b_link->from_socket().ptr.data)
return *b_gin;
for(b_group_node->inputs.begin(b_gin); b_gin != b_group_node->inputs.end(); ++b_gin)
if(b_gin->group_socket().ptr.data == b_link->from_socket().ptr.data)
return *b_gin;
}
}
}
return *b_in;
}
}
assert(0);
return *b_in;
return b_in;
}
static BL::NodeSocket get_node_output(BL::Node b_node, const string& name)
@@ -414,18 +404,52 @@ static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::Node *
return node;
}
static const char *node_socket_map_name(const char *name)
static SocketPair node_socket_map_pair(PtrNodeMap& node_map, BL::Node b_node, BL::NodeSocket b_socket)
{
if(strstr(name, "Shader")) {
if(strcmp(name, "Shader") == 0)
return "Closure";
if(strcmp(name, "Shader1") == 0)
return "Closure1";
if(strcmp(name, "Shader2") == 0)
return "Closure2";
BL::Node::inputs_iterator b_input;
BL::Node::outputs_iterator b_output;
string name = b_socket.name();
bool found = false;
int counter = 0, total = 0;
/* find in inputs */
for(b_node.inputs.begin(b_input); b_input != b_node.inputs.end(); ++b_input) {
if(b_input->name() == name) {
if(!found)
counter++;
total++;
}
if(b_input->ptr.data == b_socket.ptr.data)
found = true;
}
return name;
if(!found) {
/* find in outputs */
found = false;
counter = 0;
total = 0;
for(b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
if(b_output->name() == name) {
if(!found)
counter++;
total++;
}
if(b_output->ptr.data == b_socket.ptr.data)
found = true;
}
}
/* rename if needed */
if(name == "Shader")
name = "Closure";
if(total > 1)
name = string_printf("%s%d", name.c_str(), counter);
return SocketPair(node_map[b_node.ptr.data], name);
}
static void add_nodes(BL::BlendData b_data, ShaderGraph *graph, BL::ShaderNodeTree b_ntree, BL::Node *b_group_node, PtrSockMap& sockets_map)
@@ -453,8 +477,9 @@ static void add_nodes(BL::BlendData b_data, ShaderGraph *graph, BL::ShaderNodeTr
node_map[b_node->ptr.data] = node;
for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) {
ShaderInput *input = node->input(node_socket_map_name(b_input->name().c_str()));
BL::NodeSocket sock(get_node_input(b_group_node, *b_node, b_input->name()));
SocketPair pair = node_socket_map_pair(node_map, *b_node, *b_input);
ShaderInput *input = pair.first->input(pair.second.c_str());
BL::NodeSocket sock(get_node_input(b_group_node, *b_input));
assert(input);
@@ -500,55 +525,50 @@ static void add_nodes(BL::BlendData b_data, ShaderGraph *graph, BL::ShaderNodeTr
if(b_group_node) {
if(!b_from_node) {
sockets_map[b_from_sock.ptr.data] =
SocketPair(node_map[b_to_node.ptr.data], b_to_sock.name());
node_socket_map_pair(node_map, b_to_node, b_to_sock);
continue;
}
else if(!b_to_node) {
sockets_map[b_to_sock.ptr.data] =
SocketPair(node_map[b_from_node.ptr.data], b_from_sock.name());
node_socket_map_pair(node_map, b_from_node, b_from_sock);
continue;
}
}
ShaderNode *from_node, *to_node;
string from_name, to_name;
SocketPair from_pair, to_pair;
/* from sock */
if(b_from_node.is_a(&RNA_NodeGroup)) {
/* group node */
BL::NodeSocket group_sock = b_from_sock.group_socket();
SocketPair& pair = node_groups[b_from_node.ptr.data][group_sock.ptr.data];
from_node = pair.first;
from_name = pair.second;
from_pair = node_groups[b_from_node.ptr.data][group_sock.ptr.data];
}
else {
/* regular node */
from_node = node_map[b_from_node.ptr.data];
from_name = b_from_sock.name();
from_pair = node_socket_map_pair(node_map, b_from_node, b_from_sock);
}
/* to sock */
if(b_to_node.is_a(&RNA_NodeGroup)) {
/* group node */
BL::NodeSocket group_sock = b_to_sock.group_socket();
SocketPair& pair = node_groups[b_to_node.ptr.data][group_sock.ptr.data];
to_node = pair.first;
to_name = pair.second;
to_pair = node_groups[b_to_node.ptr.data][group_sock.ptr.data];
}
else {
/* regular node */
to_node = node_map[b_to_node.ptr.data];
to_name = b_to_sock.name();
to_pair = node_socket_map_pair(node_map, b_to_node, b_to_sock);
}
/* in case of groups there may not actually be a node inside the group
that the group socket connects to, so from_node or to_node may be NULL */
if(from_node && to_node)
graph->connect(from_node->output(node_socket_map_name(from_name.c_str())), to_node->input(node_socket_map_name(to_name.c_str())));
if(from_pair.first && to_pair.first) {
ShaderOutput *output = from_pair.first->output(from_pair.second.c_str());
ShaderInput *input = to_pair.first->input(to_pair.second.c_str());
graph->connect(output, input);
}
}
}

View File

@@ -2082,10 +2082,29 @@ static void ntree_tmp_cycles_version_patch(bNodeTree *ntree)
for(sock=node->inputs.first; sock; sock=sock->next) {
if(strcmp(sock->name, "Closure1") == 0)
strcpy(sock->name, "Shader1");
if(strcmp(sock->name, "Closure2") == 0)
strcpy(sock->name, "Shader2");
if(strcmp(sock->name, "Color1") == 0)
strcpy(sock->name, "Color");
if(strcmp(sock->name, "Color2") == 0)
strcpy(sock->name, "Color");
if(strcmp(sock->name, "Vector1") == 0)
strcpy(sock->name, "Vector");
if(strcmp(sock->name, "Vector2") == 0)
strcpy(sock->name, "Vector");
if(strcmp(sock->name, "Value1") == 0)
strcpy(sock->name, "Value");
if(strcmp(sock->name, "Value2") == 0)
strcpy(sock->name, "Value");
if(strcmp(sock->name, "Shader1") == 0)
strcpy(sock->name, "Shader");
if(strcmp(sock->name, "Shader2") == 0)
strcpy(sock->name, "Shader");
if(strcmp(sock->name, "Surface") == 0)
strcpy(sock->name, "Shader");

View File

@@ -32,8 +32,8 @@
/* **************** OUTPUT ******************** */
static bNodeSocketTemplate sh_node_add_shader_in[]= {
{ SOCK_SHADER, 1, "Shader1"},
{ SOCK_SHADER, 1, "Shader2"},
{ SOCK_SHADER, 1, "Shader"},
{ SOCK_SHADER, 1, "Shader"},
{ -1, 0, "" }
};

View File

@@ -37,8 +37,8 @@
/* **************** SCALAR MATH ******************** */
static bNodeSocketTemplate sh_node_math_in[]= {
{ SOCK_FLOAT, 1, "Value1", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
{ SOCK_FLOAT, 1, "Value2", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
{ SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
{ SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
{ -1, 0, "" }
};

View File

@@ -37,8 +37,8 @@
/* **************** MIX RGB ******************** */
static bNodeSocketTemplate sh_node_mix_rgb_in[]= {
{ SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f},
{ SOCK_RGBA, 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f},
{ SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f},
{ SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate sh_node_mix_rgb_out[]= {

View File

@@ -33,8 +33,8 @@
static bNodeSocketTemplate sh_node_mix_shader_in[]= {
{ SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_SHADER, 1, "Shader1"},
{ SOCK_SHADER, 1, "Shader2"},
{ SOCK_SHADER, 1, "Shader"},
{ SOCK_SHADER, 1, "Shader"},
{ -1, 0, "" }
};

View File

@@ -38,8 +38,8 @@
/* **************** VECTOR MATH ******************** */
static bNodeSocketTemplate sh_node_vect_math_in[]= {
{ SOCK_VECTOR, 1, "Vector1", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ SOCK_VECTOR, 1, "Vector2", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};