Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/render/osl.cpp
| Show First 20 Lines • Show All 692 Lines • ▼ Show 20 Lines | |||||
| void OSLCompiler::parameter_array(const char *name, const Transform tfm[], int arraylen) | void OSLCompiler::parameter_array(const char *name, const Transform tfm[], int arraylen) | ||||
| { | { | ||||
| OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys; | OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys; | ||||
| TypeDesc type = TypeDesc::TypeMatrix; | TypeDesc type = TypeDesc::TypeMatrix; | ||||
| type.arraylen = arraylen; | type.arraylen = arraylen; | ||||
| ss->Parameter(name, type, (const float *)tfm); | ss->Parameter(name, type, (const float *)tfm); | ||||
| } | } | ||||
| void OSLCompiler::find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input) | void OSLCompiler::find_dependencies(ShaderNodeSet& dependencies, ShaderInput *input) | ||||
| { | { | ||||
| ShaderNode *node = (input->link)? input->link->parent: NULL; | ShaderNode *node = (input->link)? input->link->parent: NULL; | ||||
| if(node) { | if(node) { | ||||
| foreach(ShaderInput *in, node->inputs) | foreach(ShaderInput *in, node->inputs) | ||||
| if(!node_skip_input(node, in)) | if(!node_skip_input(node, in)) | ||||
| find_dependencies(dependencies, in); | find_dependencies(dependencies, in); | ||||
| dependencies.insert(node); | dependencies.insert(node); | ||||
| } | } | ||||
| } | } | ||||
| void OSLCompiler::generate_nodes(const set<ShaderNode*>& nodes) | void OSLCompiler::generate_nodes(const ShaderNodeSet& nodes) | ||||
| { | { | ||||
| set<ShaderNode*> done; | ShaderNodeSet done; | ||||
| bool nodes_done; | bool nodes_done; | ||||
| do { | do { | ||||
| nodes_done = true; | nodes_done = true; | ||||
| foreach(ShaderNode *node, nodes) { | foreach(ShaderNode *node, nodes) { | ||||
| if(done.find(node) == done.end()) { | if(done.find(node) == done.end()) { | ||||
| bool inputs_done = true; | bool inputs_done = true; | ||||
| Show All 34 Lines | |||||
| { | { | ||||
| OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys; | OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys; | ||||
| current_type = type; | current_type = type; | ||||
| OSL::ShadingAttribStateRef group = ss->ShaderGroupBegin(shader->name.c_str()); | OSL::ShadingAttribStateRef group = ss->ShaderGroupBegin(shader->name.c_str()); | ||||
| ShaderNode *output = graph->output(); | ShaderNode *output = graph->output(); | ||||
| set<ShaderNode*> dependencies; | ShaderNodeSet dependencies; | ||||
| if(type == SHADER_TYPE_SURFACE) { | if(type == SHADER_TYPE_SURFACE) { | ||||
| /* generate surface shader */ | /* generate surface shader */ | ||||
| find_dependencies(dependencies, output->input("Surface")); | find_dependencies(dependencies, output->input("Surface")); | ||||
| generate_nodes(dependencies); | generate_nodes(dependencies); | ||||
| output->compile(*this); | output->compile(*this); | ||||
| } | } | ||||
| else if(type == SHADER_TYPE_VOLUME) { | else if(type == SHADER_TYPE_VOLUME) { | ||||
| ▲ Show 20 Lines • Show All 177 Lines • Show Last 20 Lines | |||||