Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2011-10-13 03:03:12 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-10-13 03:03:12 +0400
commit9ebfcea8f392a0ac91247973d2e9ee06f689799c (patch)
tree48ee1910bbe7156e262fd2329dc8346c1e314bfa /intern/cycles/render/osl.cpp
parent310b25c388aeaf43eeb4b0e4895cc5a24e44cd8e (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.cpp62
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 */