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"
This commit is contained in:
@@ -154,14 +154,43 @@ string OSLCompiler::id(ShaderNode *node)
|
|||||||
return stream.str();
|
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;
|
size_t i;
|
||||||
|
|
||||||
|
/* strip whitespace */
|
||||||
while((i = sname.find(" ")) != string::npos)
|
while((i = sname.find(" ")) != string::npos)
|
||||||
sname.replace(i, 1, "");
|
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;
|
return sname;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,21 +227,22 @@ void OSLCompiler::add(ShaderNode *node, const char *name)
|
|||||||
else if(input->default_value != ShaderInput::NONE)
|
else if(input->default_value != ShaderInput::NONE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
string param_name = compatible_name(node, input);
|
||||||
switch(input->type) {
|
switch(input->type) {
|
||||||
case SHADER_SOCKET_COLOR:
|
case SHADER_SOCKET_COLOR:
|
||||||
parameter_color(compatible_name(input->name).c_str(), input->value);
|
parameter_color(param_name.c_str(), input->value);
|
||||||
break;
|
break;
|
||||||
case SHADER_SOCKET_POINT:
|
case SHADER_SOCKET_POINT:
|
||||||
parameter_point(compatible_name(input->name).c_str(), input->value);
|
parameter_point(param_name.c_str(), input->value);
|
||||||
break;
|
break;
|
||||||
case SHADER_SOCKET_VECTOR:
|
case SHADER_SOCKET_VECTOR:
|
||||||
parameter_vector(compatible_name(input->name).c_str(), input->value);
|
parameter_vector(param_name.c_str(), input->value);
|
||||||
break;
|
break;
|
||||||
case SHADER_SOCKET_NORMAL:
|
case SHADER_SOCKET_NORMAL:
|
||||||
parameter_normal(compatible_name(input->name).c_str(), input->value);
|
parameter_normal(param_name.c_str(), input->value);
|
||||||
break;
|
break;
|
||||||
case SHADER_SOCKET_FLOAT:
|
case SHADER_SOCKET_FLOAT:
|
||||||
parameter(compatible_name(input->name).c_str(), input->value.x);
|
parameter(param_name.c_str(), input->value.x);
|
||||||
break;
|
break;
|
||||||
case SHADER_SOCKET_CLOSURE:
|
case SHADER_SOCKET_CLOSURE:
|
||||||
break;
|
break;
|
||||||
@@ -242,12 +272,8 @@ void OSLCompiler::add(ShaderNode *node, const char *name)
|
|||||||
/* connect shaders */
|
/* connect shaders */
|
||||||
string id_from = id(input->link->parent);
|
string id_from = id(input->link->parent);
|
||||||
string id_to = id(node);
|
string id_to = id(node);
|
||||||
string param_from = compatible_name(input->link->name);
|
string param_from = compatible_name(input->link->parent, input->link);
|
||||||
string param_to = compatible_name(input->name);
|
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());
|
ss->ConnectShaders(id_from.c_str(), param_from.c_str(), id_to.c_str(), param_to.c_str());
|
||||||
}
|
}
|
||||||
|
@@ -37,6 +37,7 @@ class OSLGlobals;
|
|||||||
class Scene;
|
class Scene;
|
||||||
class ShaderGraph;
|
class ShaderGraph;
|
||||||
class ShaderNode;
|
class ShaderNode;
|
||||||
|
class ShaderInput;
|
||||||
class ShaderOutput;
|
class ShaderOutput;
|
||||||
|
|
||||||
#ifdef WITH_OSL
|
#ifdef WITH_OSL
|
||||||
@@ -96,7 +97,8 @@ private:
|
|||||||
string id(ShaderNode *node);
|
string id(ShaderNode *node);
|
||||||
void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);
|
void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);
|
||||||
bool node_skip_input(ShaderNode *node, ShaderInput *input);
|
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 find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input);
|
||||||
void generate_nodes(const set<ShaderNode*>& nodes);
|
void generate_nodes(const set<ShaderNode*>& nodes);
|
||||||
|
Reference in New Issue
Block a user