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.
This commit is contained in:
Brecht Van Lommel
2011-10-12 23:03:12 +00:00
parent 310b25c388
commit 9ebfcea8f3
20 changed files with 1606 additions and 1494 deletions

View File

@@ -2028,7 +2028,8 @@ void BlendWeightNode::compile(OSLCompiler& compiler)
OutputNode::OutputNode()
: ShaderNode("output")
{
add_input("Closure", SHADER_SOCKET_CLOSURE);
add_input("Surface", SHADER_SOCKET_CLOSURE);
add_input("Volume", SHADER_SOCKET_CLOSURE);
add_input("Displacement", SHADER_SOCKET_FLOAT);
}
@@ -2046,8 +2047,10 @@ void OutputNode::compile(SVMCompiler& compiler)
void OutputNode::compile(OSLCompiler& compiler)
{
if(compiler.output_type() == SHADER_TYPE_CLOSURE)
compiler.add(this, "node_output_closure");
if(compiler.output_type() == SHADER_TYPE_SURFACE)
compiler.add(this, "node_output_surface");
else if(compiler.output_type() == SHADER_TYPE_VOLUME)
compiler.add(this, "node_output_volume");
else if(compiler.output_type() == SHADER_TYPE_DISPLACEMENT)
compiler.add(this, "node_output_displacement");
}

View File

@@ -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 */

View File

@@ -42,6 +42,7 @@ Shader::Shader()
sample_as_light = true;
homogeneous_volume = false;
has_surface = false;
has_surface_transparent = false;
has_surface_emission = false;
has_volume = false;
@@ -209,7 +210,7 @@ void ShaderManager::add_default(Scene *scene)
closure->input("Color")->value = make_float3(0.8f, 0.8f, 0.8f);
out = graph->output();
graph->connect(closure->output("BSDF"), out->input("Closure"));
graph->connect(closure->output("BSDF"), out->input("Surface"));
shader = new Shader();
shader->name = "default_surface";
@@ -227,7 +228,7 @@ void ShaderManager::add_default(Scene *scene)
closure->input("Strength")->value.x = 0.0f;
out = graph->output();
graph->connect(closure->output("Emission"), out->input("Closure"));
graph->connect(closure->output("Emission"), out->input("Surface"));
shader = new Shader();
shader->name = "default_light";
@@ -244,7 +245,7 @@ void ShaderManager::add_default(Scene *scene)
closure->input("Color")->value = make_float3(0.8f, 0.8f, 0.8f);
out = graph->output();
graph->connect(closure->output("Background"), out->input("Closure"));
graph->connect(closure->output("Background"), out->input("Surface"));
shader = new Shader();
shader->name = "default_background";

View File

@@ -39,8 +39,8 @@ struct float3;
/* Shader describing the appearance of a Mesh, Light or Background.
*
* While there is only a single shader graph, it has two outputs: shader,
* displacement, that the shader manager will compile and execute
* While there is only a single shader graph, it has three outputs: surface,
* volume and displacement, that the shader manager will compile and execute
* separately. */
class Shader {
@@ -65,10 +65,11 @@ public:
bool need_update_attributes;
/* information about shader after compiling */
bool has_surface;
bool has_surface_emission;
bool has_surface_transparent;
bool has_displacement;
bool has_volume;
bool has_displacement;
/* requested mesh attributes */
AttributeRequestSet attributes;

View File

@@ -107,7 +107,7 @@ SVMCompiler::SVMCompiler(ShaderManager *shader_manager_, ImageManager *image_man
image_manager = image_manager_;
sunsky = NULL;
max_stack_use = 0;
current_type = SHADER_TYPE_CLOSURE;
current_type = SHADER_TYPE_SURFACE;
current_shader = NULL;
background = false;
mix_weight_offset = SVM_STACK_INVALID;
@@ -467,8 +467,6 @@ void SVMCompiler::generate_closure(ShaderNode *node, set<ShaderNode*>& done)
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;
/* end node is added outside of this */
}
@@ -579,8 +577,10 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty
ShaderNode *node = graph->output();
ShaderInput *clin = NULL;
if(type == SHADER_TYPE_CLOSURE)
clin = node->input("Closure");
if(type == SHADER_TYPE_SURFACE)
clin = node->input("Surface");
else if(type == SHADER_TYPE_VOLUME)
clin = node->input("Volume");
else if(type == SHADER_TYPE_DISPLACEMENT)
clin = node->input("Displacement");
else
@@ -599,9 +599,15 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty
if(clin->link) {
bool generate = false;
if(type == SHADER_TYPE_CLOSURE) {
if(type == SHADER_TYPE_SURFACE) {
/* generate surface shader */
generate = true;
shader->has_surface = true;
}
else if(type == SHADER_TYPE_VOLUME) {
/* generate volume shader */
generate = true;
shader->has_volume = true;
}
else if(type == SHADER_TYPE_DISPLACEMENT) {
/* generate displacement shader */
@@ -630,7 +636,7 @@ void SVMCompiler::compile(Shader *shader, vector<int4>& global_svm_nodes, int in
/* copy graph for shader with bump mapping */
ShaderNode *node = shader->graph->output();
if(node->input("Closure")->link && node->input("Displacement")->link)
if(node->input("Surface")->link && node->input("Displacement")->link)
if(!shader->graph_bump)
shader->graph_bump = shader->graph->copy();
@@ -641,23 +647,30 @@ void SVMCompiler::compile(Shader *shader, vector<int4>& global_svm_nodes, int in
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 */
compile_type(shader, shader->graph, SHADER_TYPE_CLOSURE);
compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
global_svm_nodes[index*2 + 0].y = global_svm_nodes.size();
global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
if(shader->graph_bump) {
compile_type(shader, shader->graph_bump, SHADER_TYPE_CLOSURE);
compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE);
global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
}
/* generate volume shader */
compile_type(shader, shader->graph, SHADER_TYPE_VOLUME);
global_svm_nodes[index*2 + 0].z = global_svm_nodes.size();
global_svm_nodes[index*2 + 1].z = global_svm_nodes.size();
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
/* generate displacement shader */
compile_type(shader, shader->graph, SHADER_TYPE_DISPLACEMENT);
global_svm_nodes[index*2 + 0].w = global_svm_nodes.size();