diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-10-13 03:03:12 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-10-13 03:03:12 +0400 |
commit | 9ebfcea8f392a0ac91247973d2e9ee06f689799c (patch) | |
tree | 48ee1910bbe7156e262fd2329dc8346c1e314bfa /intern/cycles/render/osl.cpp | |
parent | 310b25c388aeaf43eeb4b0e4895cc5a24e44cd8e (diff) |
Cycles: revert commit that joined surface/volume socket into a single shader socket,
on second thought this makes it a bit too difficult to understand what's going on.
Diffstat (limited to 'intern/cycles/render/osl.cpp')
-rw-r--r-- | intern/cycles/render/osl.cpp | 62 |
1 files changed, 44 insertions, 18 deletions
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp index 492529c30a2..b0173334c76 100644 --- a/intern/cycles/render/osl.cpp +++ b/intern/cycles/render/osl.cpp @@ -102,7 +102,7 @@ void OSLShaderManager::device_update(Device *device, DeviceScene *dscene, Scene /* setup shader engine */ og->ss = ss; int background_id = scene->shader_manager->get_shader_id(scene->default_background); - og->background_state = og->state[background_id]; + og->background_state = og->surface_state[background_id]; og->use = true; tls_create(OSLGlobals::ThreadData, og->thread_data); @@ -128,7 +128,8 @@ void OSLShaderManager::device_free(Device *device, DeviceScene *dscene) tls_delete(OSLGlobals::ThreadData, og->thread_data); - og->state.clear(); + og->surface_state.clear(); + og->volume_state.clear(); og->displacement_state.clear(); og->background_state.reset(); } @@ -138,7 +139,7 @@ void OSLShaderManager::device_free(Device *device, DeviceScene *dscene) OSLCompiler::OSLCompiler(void *shadingsys_) { shadingsys = shadingsys_; - current_type = SHADER_TYPE_CLOSURE; + current_type = SHADER_TYPE_SURFACE; current_shader = NULL; background = false; } @@ -169,7 +170,9 @@ bool OSLCompiler::node_skip_input(ShaderNode *node, ShaderInput *input) depending on the current shader type */ if(node->name == ustring("output")) { - if(strcmp(input->name, "Closure") == 0 && current_type != SHADER_TYPE_CLOSURE) + if(strcmp(input->name, "Surface") == 0 && current_type != SHADER_TYPE_SURFACE) + return true; + if(strcmp(input->name, "Volume") == 0 && current_type != SHADER_TYPE_VOLUME) return true; if(strcmp(input->name, "Displacement") == 0 && current_type != SHADER_TYPE_DISPLACEMENT) return true; @@ -220,7 +223,9 @@ void OSLCompiler::add(ShaderNode *node, const char *name) * because "volume" and "displacement" don't work yet in OSL. the shaders * work fine, but presumably these values would be used for more strict * checking, so when that is fixed, we should update the code here too. */ - if(current_type == SHADER_TYPE_CLOSURE) + if(current_type == SHADER_TYPE_SURFACE) + ss->Shader("surface", name, id(node).c_str()); + else if(current_type == SHADER_TYPE_VOLUME) ss->Shader("surface", name, id(node).c_str()); else if(current_type == SHADER_TYPE_DISPLACEMENT) ss->Shader("surface", name, id(node).c_str()); @@ -341,8 +346,6 @@ void OSLCompiler::generate_nodes(const set<ShaderNode*>& nodes) current_shader->has_surface_emission = true; if(node->name == ustring("transparent")) current_shader->has_surface_transparent = true; - if(node->name == ustring("volume")) - current_shader->has_volume = true; } else nodes_done = false; @@ -362,9 +365,15 @@ void OSLCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty ShaderNode *output = graph->output(); set<ShaderNode*> dependencies; - if(type == SHADER_TYPE_CLOSURE) { + if(type == SHADER_TYPE_SURFACE) { /* generate surface shader */ - find_dependencies(dependencies, output->input("Closure")); + find_dependencies(dependencies, output->input("Surface")); + generate_nodes(dependencies); + output->compile(*this); + } + else if(type == SHADER_TYPE_VOLUME) { + /* generate volume shader */ + find_dependencies(dependencies, output->input("Volume")); generate_nodes(dependencies); output->compile(*this); } @@ -387,7 +396,7 @@ void OSLCompiler::compile(OSLGlobals *og, Shader *shader) ShaderNode *output = (graph)? graph->output(): NULL; /* copy graph for shader with bump mapping */ - if(output->input("Closure")->link && output->input("Displacement")->link) + if(output->input("Surface")->link && output->input("Displacement")->link) if(!shader->graph_bump) shader->graph_bump = shader->graph->copy(); @@ -398,29 +407,46 @@ void OSLCompiler::compile(OSLGlobals *og, Shader *shader) current_shader = shader; + shader->has_surface = false; shader->has_surface_emission = false; shader->has_surface_transparent = false; shader->has_volume = false; shader->has_displacement = false; /* generate surface shader */ - if(graph && output->input("Closure")->link) { - compile_type(shader, shader->graph, SHADER_TYPE_CLOSURE); - og->state.push_back(ss->state()); + if(graph && output->input("Surface")->link) { + compile_type(shader, shader->graph, SHADER_TYPE_SURFACE); + og->surface_state.push_back(ss->state()); if(shader->graph_bump) { ss->clear_state(); - compile_type(shader, shader->graph_bump, SHADER_TYPE_CLOSURE); - og->state.push_back(ss->state()); + compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE); + og->surface_state.push_back(ss->state()); } else - og->state.push_back(ss->state()); + og->surface_state.push_back(ss->state()); + + ss->clear_state(); + + shader->has_surface = true; + } + else { + og->surface_state.push_back(OSL::ShadingAttribStateRef()); + og->surface_state.push_back(OSL::ShadingAttribStateRef()); + } + + /* generate volume shader */ + if(graph && output->input("Volume")->link) { + compile_type(shader, shader->graph, SHADER_TYPE_VOLUME); + shader->has_volume = true; + og->volume_state.push_back(ss->state()); + og->volume_state.push_back(ss->state()); ss->clear_state(); } else { - og->state.push_back(OSL::ShadingAttribStateRef()); - og->state.push_back(OSL::ShadingAttribStateRef()); + og->volume_state.push_back(OSL::ShadingAttribStateRef()); + og->volume_state.push_back(OSL::ShadingAttribStateRef()); } /* generate displacement shader */ |