[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50638] trunk/blender/intern/cycles/render : Generate compatible OSL shader parameter names in cases where the node has and input and output with the same name .

Lukas Toenne lukas.toenne at googlemail.com
Sat Sep 15 18:31:08 CEST 2012


Revision: 50638
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50638
Author:   lukastoenne
Date:     2012-09-15 16:31:07 +0000 (Sat, 15 Sep 2012)
Log Message:
-----------
Generate compatible OSL shader parameter names in cases where the node has and input and output with the same name. In that case the convention is to add suffixes "In" and "Out" respectively.
Example:

Blender node has one input "Color" and one output "Color"

-> OSL parameter names should be "ColorIn" and "ColorOut"

Modified Paths:
--------------
    trunk/blender/intern/cycles/render/osl.cpp
    trunk/blender/intern/cycles/render/osl.h

Modified: trunk/blender/intern/cycles/render/osl.cpp
===================================================================
--- trunk/blender/intern/cycles/render/osl.cpp	2012-09-15 15:41:37 UTC (rev 50637)
+++ trunk/blender/intern/cycles/render/osl.cpp	2012-09-15 16:31:07 UTC (rev 50638)
@@ -154,17 +154,46 @@
 	return stream.str();
 }
 
-string OSLCompiler::compatible_name(const char *name)
+string OSLCompiler::compatible_name(ShaderNode *node, ShaderInput *input)
 {
-	string sname = name;
+	string sname(input->name);
 	size_t i;
 
+	/* strip whitespace */
 	while((i = sname.find(" ")) != string::npos)
 		sname.replace(i, 1, "");
 	
+	/* if output exists with the same name, add "In" suffix */
+	foreach(ShaderOutput *output, node->outputs) {
+		if (strcmp(input->name, output->name)==0) {
+			sname += "In";
+			break;
+		}
+	}
+	
 	return sname;
 }
 
+string OSLCompiler::compatible_name(ShaderNode *node, ShaderOutput *output)
+{
+	string sname(output->name);
+	size_t i;
+
+	/* strip whitespace */
+	while((i = sname.find(" ")) != string::npos)
+		sname.replace(i, 1, "");
+	
+	/* if output exists with the same name, add "In" suffix */
+	foreach(ShaderInput *input, node->inputs) {
+		if (strcmp(input->name, output->name)==0) {
+			sname += "Out";
+			break;
+		}
+	}
+	
+	return sname;
+}
+
 bool OSLCompiler::node_skip_input(ShaderNode *node, ShaderInput *input)
 {
 	/* exception for output node, only one input is actually used
@@ -198,21 +227,22 @@
 			else if(input->default_value != ShaderInput::NONE)
 				continue;
 
+			string param_name = compatible_name(node, input);
 			switch(input->type) {
 				case SHADER_SOCKET_COLOR:
-					parameter_color(compatible_name(input->name).c_str(), input->value);
+					parameter_color(param_name.c_str(), input->value);
 					break;
 				case SHADER_SOCKET_POINT:
-					parameter_point(compatible_name(input->name).c_str(), input->value);
+					parameter_point(param_name.c_str(), input->value);
 					break;
 				case SHADER_SOCKET_VECTOR:
-					parameter_vector(compatible_name(input->name).c_str(), input->value);
+					parameter_vector(param_name.c_str(), input->value);
 					break;
 				case SHADER_SOCKET_NORMAL:
-					parameter_normal(compatible_name(input->name).c_str(), input->value);
+					parameter_normal(param_name.c_str(), input->value);
 					break;
 				case SHADER_SOCKET_FLOAT:
-					parameter(compatible_name(input->name).c_str(), input->value.x);
+					parameter(param_name.c_str(), input->value.x);
 					break;
 				case SHADER_SOCKET_CLOSURE:
 					break;
@@ -242,13 +272,9 @@
 			/* connect shaders */
 			string id_from = id(input->link->parent);
 			string id_to = id(node);
-			string param_from = compatible_name(input->link->name);
-			string param_to = compatible_name(input->name);
+			string param_from = compatible_name(input->link->parent, input->link);
+			string param_to = compatible_name(node, input);
 
-			/* avoid name conflict with same input/output socket name */
-			if(input->link->parent->input(input->link->name))
-				param_from += "_";
-
 			ss->ConnectShaders(id_from.c_str(), param_from.c_str(), id_to.c_str(), param_to.c_str());
 		}
 	}

Modified: trunk/blender/intern/cycles/render/osl.h
===================================================================
--- trunk/blender/intern/cycles/render/osl.h	2012-09-15 15:41:37 UTC (rev 50637)
+++ trunk/blender/intern/cycles/render/osl.h	2012-09-15 16:31:07 UTC (rev 50638)
@@ -37,6 +37,7 @@
 class Scene;
 class ShaderGraph;
 class ShaderNode;
+class ShaderInput;
 class ShaderOutput;
 
 #ifdef WITH_OSL
@@ -96,7 +97,8 @@
 	string id(ShaderNode *node);
 	void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);
 	bool node_skip_input(ShaderNode *node, ShaderInput *input);
-	string compatible_name(const char *name);
+	string compatible_name(ShaderNode *node, ShaderInput *input);
+	string compatible_name(ShaderNode *node, ShaderOutput *output);
 
 	void find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input);
 	void generate_nodes(const set<ShaderNode*>& nodes);




More information about the Bf-blender-cvs mailing list