[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40960] branches/cycles: Cycles: make node with multiple input sockets with the same name work.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Oct 12 17:45:52 CEST 2011


Revision: 40960
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40960
Author:   blendix
Date:     2011-10-12 15:45:52 +0000 (Wed, 12 Oct 2011)
Log Message:
-----------
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.

Modified Paths:
--------------
    branches/cycles/intern/cycles/blender/blender_shader.cpp
    branches/cycles/source/blender/blenloader/intern/readfile.c
    branches/cycles/source/blender/nodes/shader/nodes/node_shader_add_shader.c
    branches/cycles/source/blender/nodes/shader/nodes/node_shader_math.c
    branches/cycles/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
    branches/cycles/source/blender/nodes/shader/nodes/node_shader_mix_shader.c
    branches/cycles/source/blender/nodes/shader/nodes/node_shader_vectMath.c

Modified: branches/cycles/intern/cycles/blender/blender_shader.cpp
===================================================================
--- branches/cycles/intern/cycles/blender/blender_shader.cpp	2011-10-12 15:42:35 UTC (rev 40959)
+++ branches/cycles/intern/cycles/blender/blender_shader.cpp	2011-10-12 15:45:52 UTC (rev 40960)
@@ -50,36 +50,26 @@
 
 /* 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 @@
 	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 @@
 				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 @@
 		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);
+		}
 	}
 }
 

Modified: branches/cycles/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/cycles/source/blender/blenloader/intern/readfile.c	2011-10-12 15:42:35 UTC (rev 40959)
+++ branches/cycles/source/blender/blenloader/intern/readfile.c	2011-10-12 15:45:52 UTC (rev 40960)
@@ -2082,10 +2082,29 @@
 			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");
 

Modified: branches/cycles/source/blender/nodes/shader/nodes/node_shader_add_shader.c
===================================================================
--- branches/cycles/source/blender/nodes/shader/nodes/node_shader_add_shader.c	2011-10-12 15:42:35 UTC (rev 40959)
+++ branches/cycles/source/blender/nodes/shader/nodes/node_shader_add_shader.c	2011-10-12 15:45:52 UTC (rev 40960)
@@ -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, ""	}
 };
 

Modified: branches/cycles/source/blender/nodes/shader/nodes/node_shader_math.c
===================================================================
--- branches/cycles/source/blender/nodes/shader/nodes/node_shader_math.c	2011-10-12 15:42:35 UTC (rev 40959)
+++ branches/cycles/source/blender/nodes/shader/nodes/node_shader_math.c	2011-10-12 15:45:52 UTC (rev 40960)
@@ -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, "" } 
 };
 

Modified: branches/cycles/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
===================================================================
--- branches/cycles/source/blender/nodes/shader/nodes/node_shader_mixRgb.c	2011-10-12 15:42:35 UTC (rev 40959)
+++ branches/cycles/source/blender/nodes/shader/nodes/node_shader_mixRgb.c	2011-10-12 15:45:52 UTC (rev 40960)
@@ -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[]= {

Modified: branches/cycles/source/blender/nodes/shader/nodes/node_shader_mix_shader.c
===================================================================
--- branches/cycles/source/blender/nodes/shader/nodes/node_shader_mix_shader.c	2011-10-12 15:42:35 UTC (rev 40959)
+++ branches/cycles/source/blender/nodes/shader/nodes/node_shader_mix_shader.c	2011-10-12 15:45:52 UTC (rev 40960)
@@ -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"},

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list