diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2016-05-07 20:48:28 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2016-06-11 21:32:24 +0300 |
commit | 42aec3b355b7692f60369c0d5333f54b029bfcad (patch) | |
tree | e849e60af432a102280f9192204ffa9092582430 /intern/cycles/render/osl.cpp | |
parent | 4df6474f01ce6c0db57538f737baead2936e2496 (diff) |
Cycles: nodify shader nodes
Differential Revision: https://developer.blender.org/D2038
Diffstat (limited to 'intern/cycles/render/osl.cpp')
-rw-r--r-- | intern/cycles/render/osl.cpp | 203 |
1 files changed, 186 insertions, 17 deletions
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp index 1cfe3fb38e2..cf94df5f98f 100644 --- a/intern/cycles/render/osl.cpp +++ b/intern/cycles/render/osl.cpp @@ -477,8 +477,10 @@ OSLNode *OSLShaderManager::osl_node(const std::string& filepath, continue; if(!param->isoutput && param->validdefault) { - node->add_input(param->name.c_str(), socket_type, make_float3(param->fdefault[0], param->fdefault[1], param->fdefault[2])); - continue; + float3 *default_value = (float3*)node->input_default_value(); + default_value->x = param->fdefault[0]; + default_value->y = param->fdefault[1]; + default_value->z = param->fdefault[2]; } } else if(param->type.aggregate == TypeDesc::SCALAR) { @@ -486,24 +488,21 @@ OSLNode *OSLShaderManager::osl_node(const std::string& filepath, socket_type = SocketType::INT; if(!param->isoutput && param->validdefault) { - node->add_input(param->name.c_str(), socket_type, (float)param->idefault[0]); - continue; + *(int*)node->input_default_value() = param->idefault[0]; } } else if(param->type.basetype == TypeDesc::FLOAT) { socket_type = SocketType::FLOAT; if(!param->isoutput && param->validdefault) { - node->add_input(param->name.c_str(), socket_type, param->fdefault[0]); - continue; + *(float*)node->input_default_value() = param->fdefault[0]; } } else if(param->type.basetype == TypeDesc::STRING) { socket_type = SocketType::STRING; if(!param->isoutput && param->validdefault) { - node->add_input(param->name.c_str(), socket_type); - continue; + *(ustring*)node->input_default_value() = param->sdefault[0]; } } else @@ -513,10 +512,10 @@ OSLNode *OSLShaderManager::osl_node(const std::string& filepath, continue; if(param->isoutput) { - node->add_output(param->name.c_str(), socket_type); + node->add_output(param->name, socket_type); } else { - node->add_input(param->name.c_str(), socket_type); + node->add_input(param->name, socket_type); } } @@ -528,6 +527,9 @@ OSLNode *OSLShaderManager::osl_node(const std::string& filepath, node->filepath = filepath; } + /* Generate inputs and outputs */ + node->create_inputs_outputs(node->type); + return node; } @@ -643,27 +645,28 @@ void OSLCompiler::add(ShaderNode *node, const char *name, bool isfilepath) continue; string param_name = compatible_name(node, input); + const SocketType& socket = input->socket_type; switch(input->type()) { case SocketType::COLOR: - parameter_color(param_name.c_str(), input->value()); + parameter_color(param_name.c_str(), node->get_float3(socket)); break; case SocketType::POINT: - parameter_point(param_name.c_str(), input->value()); + parameter_point(param_name.c_str(), node->get_float3(socket)); break; case SocketType::VECTOR: - parameter_vector(param_name.c_str(), input->value()); + parameter_vector(param_name.c_str(), node->get_float3(socket)); break; case SocketType::NORMAL: - parameter_normal(param_name.c_str(), input->value()); + parameter_normal(param_name.c_str(), node->get_float3(socket)); break; case SocketType::FLOAT: - parameter(param_name.c_str(), input->value_float()); + parameter(param_name.c_str(), node->get_float(socket)); break; case SocketType::INT: - parameter(param_name.c_str(), (int)input->value_float()); + parameter(param_name.c_str(), node->get_int(socket)); break; case SocketType::STRING: - parameter(param_name.c_str(), input->value_string()); + parameter(param_name.c_str(), node->get_string(socket)); break; case SocketType::CLOSURE: case SocketType::UNDEFINED: @@ -733,6 +736,168 @@ void OSLCompiler::add(ShaderNode *node, const char *name, bool isfilepath) } } +static TypeDesc array_typedesc(TypeDesc typedesc, int arraylength) +{ + return TypeDesc((TypeDesc::BASETYPE)typedesc.basetype, + (TypeDesc::AGGREGATE)typedesc.aggregate, + (TypeDesc::VECSEMANTICS)typedesc.vecsemantics, + arraylength); +} + +void OSLCompiler::parameter(ShaderNode* node, const char *name) +{ + OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys; + ustring uname = ustring(name); + const SocketType& socket = *(node->type->find_input(uname)); + + switch(socket.type) + { + case SocketType::BOOLEAN: + { + int value = node->get_bool(socket); + ss->Parameter(name, TypeDesc::TypeInt, &value); + break; + } + case SocketType::FLOAT: + { + float value = node->get_float(socket); + ss->Parameter(uname, TypeDesc::TypeFloat, &value); + break; + } + case SocketType::INT: + { + int value = node->get_int(socket); + ss->Parameter(uname, TypeDesc::TypeInt, &value); + break; + } + case SocketType::COLOR: + { + float3 value = node->get_float3(socket); + ss->Parameter(uname, TypeDesc::TypeColor, &value); + break; + } + case SocketType::VECTOR: + { + float3 value = node->get_float3(socket); + ss->Parameter(uname, TypeDesc::TypeVector, &value); + break; + } + case SocketType::POINT: + { + float3 value = node->get_float3(socket); + ss->Parameter(uname, TypeDesc::TypePoint, &value); + break; + } + case SocketType::NORMAL: + { + float3 value = node->get_float3(socket); + ss->Parameter(uname, TypeDesc::TypeNormal, &value); + break; + } + case SocketType::POINT2: + { + float2 value = node->get_float2(socket); + ss->Parameter(uname, TypeDesc(TypeDesc::FLOAT, TypeDesc::VEC2, TypeDesc::POINT), &value); + break; + } + case SocketType::STRING: + { + ustring value = node->get_string(socket); + ss->Parameter(uname, TypeDesc::TypeString, &value); + break; + } + case SocketType::ENUM: + { + ustring value = node->get_string(socket); + ss->Parameter(uname, TypeDesc::TypeString, &value); + break; + } + case SocketType::TRANSFORM: + { + Transform value = node->get_transform(socket); + ss->Parameter(uname, TypeDesc::TypeMatrix, &value); + break; + } + case SocketType::BOOLEAN_ARRAY: + { + // OSL does not support booleans, so convert to int + const array<bool>& value = node->get_bool_array(socket); + array<int> intvalue(value.size()); + for (size_t i = 0; i < value.size(); i++) + intvalue[i] = value[i]; + ss->Parameter(uname, array_typedesc(TypeDesc::TypeInt, value.size()), intvalue.data()); + break; + } + case SocketType::FLOAT_ARRAY: + { + const array<float>& value = node->get_float_array(socket); + ss->Parameter(uname, array_typedesc(TypeDesc::TypeFloat, value.size()), value.data()); + break; + } + case SocketType::INT_ARRAY: + { + const array<int>& value = node->get_int_array(socket); + ss->Parameter(uname, array_typedesc(TypeDesc::TypeInt, value.size()), value.data()); + break; + } + case SocketType::COLOR_ARRAY: + case SocketType::VECTOR_ARRAY: + case SocketType::POINT_ARRAY: + case SocketType::NORMAL_ARRAY: + { + TypeDesc typedesc; + + switch(socket.type) + { + case SocketType::COLOR_ARRAY: typedesc = TypeDesc::TypeColor; break; + case SocketType::VECTOR_ARRAY: typedesc = TypeDesc::TypeVector; break; + case SocketType::POINT_ARRAY: typedesc = TypeDesc::TypePoint; break; + case SocketType::NORMAL_ARRAY: typedesc = TypeDesc::TypeNormal; break; + default: assert(0); break; + } + + // convert to tightly packed array since float3 has padding + const array<float3>& value = node->get_float3_array(socket); + array<float> fvalue(value.size() * 3); + for (size_t i = 0, j = 0; i < value.size(); i++) + { + fvalue[j++] = value[i].x; + fvalue[j++] = value[i].y; + fvalue[j++] = value[i].z; + } + + ss->Parameter(uname, array_typedesc(typedesc, value.size()), fvalue.data()); + break; + } + case SocketType::POINT2_ARRAY: + { + const array<float2>& value = node->get_float2_array(socket); + ss->Parameter(uname, array_typedesc(TypeDesc(TypeDesc::FLOAT, TypeDesc::VEC2, TypeDesc::POINT), value.size()), value.data()); + break; + } + case SocketType::STRING_ARRAY: + { + const array<ustring>& value = node->get_string_array(socket); + ss->Parameter(uname, array_typedesc(TypeDesc::TypeString, value.size()), value.data()); + break; + } + case SocketType::TRANSFORM_ARRAY: + { + const array<Transform>& value = node->get_transform_array(socket); + ss->Parameter(uname, array_typedesc(TypeDesc::TypeMatrix, value.size()), value.data()); + break; + } + case SocketType::CLOSURE: + case SocketType::NODE: + case SocketType::NODE_ARRAY: + case SocketType::UNDEFINED: + { + assert(0); + break; + } + } +} + void OSLCompiler::parameter(const char *name, float f) { OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys; @@ -996,6 +1161,10 @@ void OSLCompiler::add(ShaderNode * /*node*/, const char * /*name*/, bool /*isfil { } +void OSLCompiler::parameter(ShaderNode * /*node*/, const char * /*name*/) +{ +} + void OSLCompiler::parameter(const char * /*name*/, float /*f*/) { } |