From 7503a7edfba9496521baefd70fe6cbcbfce5127b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 12 Oct 2011 15:42:35 +0000 Subject: Cycles: replace surface/volume sockets in output nodes with a single shader socket, decided it's better to render objects as either surface or volume. This may break the volume rendering patch, but shaders with volume closures still get tagged as having volume closures, so it should be fixable without too many changes. --- intern/cycles/blender/addon/ui.py | 54 ++++--------------- intern/cycles/blender/blender_shader.cpp | 6 +-- intern/cycles/kernel/kernel_shader.h | 6 +-- intern/cycles/kernel/osl/nodes/CMakeLists.txt | 3 +- .../kernel/osl/nodes/node_output_closure.osl | 25 +++++++++ .../kernel/osl/nodes/node_output_surface.osl | 25 --------- .../cycles/kernel/osl/nodes/node_output_volume.osl | 25 --------- intern/cycles/kernel/osl/osl_shader.cpp | 8 +-- intern/cycles/kernel/svm/svm.h | 3 +- intern/cycles/kernel/svm/svm_types.h | 3 +- intern/cycles/render/nodes.cpp | 9 ++-- intern/cycles/render/osl.cpp | 62 +++++++--------------- intern/cycles/render/shader.cpp | 7 ++- intern/cycles/render/shader.h | 7 ++- intern/cycles/render/svm.cpp | 31 ++++------- 15 files changed, 84 insertions(+), 190 deletions(-) create mode 100644 intern/cycles/kernel/osl/nodes/node_output_closure.osl delete mode 100644 intern/cycles/kernel/osl/nodes/node_output_surface.osl delete mode 100644 intern/cycles/kernel/osl/nodes/node_output_volume.osl (limited to 'intern') diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index b8c3753800f..581d7a961bd 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -228,7 +228,7 @@ class CyclesCamera_PT_dof(CyclesButtonsPanel, Panel): sub.prop(ccam, "aperture_rotation", text="Rotation") class Cycles_PT_context_material(CyclesButtonsPanel, Panel): - bl_label = "Surface" + bl_label = "" bl_context = "material" bl_options = {'HIDE_HEADER'} @@ -400,8 +400,8 @@ class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel): elif lamp.type == 'HEMI': layout.label(text="Not supported, interpreted as sun lamp.") -class CyclesLamp_PT_nodes(CyclesButtonsPanel, Panel): - bl_label = "Nodes" +class CyclesLamp_PT_shader(CyclesButtonsPanel, Panel): + bl_label = "Shader" bl_context = "data" @classmethod @@ -412,10 +412,10 @@ class CyclesLamp_PT_nodes(CyclesButtonsPanel, Panel): layout = self.layout mat = context.lamp - panel_node_draw(layout, mat, 'OUTPUT_LAMP', 'Surface') + panel_node_draw(layout, mat, 'OUTPUT_LAMP', 'Shader') -class CyclesWorld_PT_surface(CyclesButtonsPanel, Panel): - bl_label = "Surface" +class CyclesWorld_PT_shader(CyclesButtonsPanel, Panel): + bl_label = "Shader" bl_context = "world" @classmethod @@ -426,39 +426,10 @@ class CyclesWorld_PT_surface(CyclesButtonsPanel, Panel): layout = self.layout mat = context.world - panel_node_draw(layout, mat, 'OUTPUT_WORLD', 'Surface') - -class CyclesWorld_PT_volume(CyclesButtonsPanel, Panel): - bl_label = "Volume" - bl_context = "world" - - @classmethod - def poll(cls, context): - return context.world and CyclesButtonsPanel.poll(context) - - def draw(self, context): - layout = self.layout - layout.active = False - - world = context.world - panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Volume') - -class CyclesMaterial_PT_surface(CyclesButtonsPanel, Panel): - bl_label = "Surface" - bl_context = "material" + panel_node_draw(layout, mat, 'OUTPUT_WORLD', 'Shader') - @classmethod - def poll(cls, context): - return context.material and CyclesButtonsPanel.poll(context) - - def draw(self, context): - layout = self.layout - - mat = context.material - panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Surface') - -class CyclesMaterial_PT_volume(CyclesButtonsPanel, Panel): - bl_label = "Volume" +class CyclesMaterial_PT_shader(CyclesButtonsPanel, Panel): + bl_label = "Shader" bl_context = "material" @classmethod @@ -467,14 +438,9 @@ class CyclesMaterial_PT_volume(CyclesButtonsPanel, Panel): def draw(self, context): layout = self.layout - layout.active = False mat = context.material - cmat = mat.cycles - - panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Volume') - - layout.prop(cmat, "homogeneous_volume") + panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Shader') class CyclesMaterial_PT_displacement(CyclesButtonsPanel, Panel): bl_label = "Displacement" diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index c7eda0a0160..ad7dfb14c64 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -584,7 +584,7 @@ void BlenderSync::sync_materials() closure->input("Color")->value = get_float3(b_mat->diffuse_color()); out = graph->output(); - graph->connect(closure->output("BSDF"), out->input("Surface")); + graph->connect(closure->output("BSDF"), out->input("Closure")); } /* settings */ @@ -625,7 +625,7 @@ void BlenderSync::sync_world() closure->input("Color")->value = get_float3(b_world.horizon_color()); out = graph->output(); - graph->connect(closure->output("Background"), out->input("Surface")); + graph->connect(closure->output("Background"), out->input("Closure")); } shader->set_graph(graph); @@ -675,7 +675,7 @@ void BlenderSync::sync_lamps() closure->input("Strength")->value.x = b_lamp->energy()*10.0f; out = graph->output(); - graph->connect(closure->output("Emission"), out->input("Surface")); + graph->connect(closure->output("Emission"), out->input("Closure")); } shader->set_graph(graph); diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index c1bcbb067b5..7ca7f96d73b 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -482,7 +482,7 @@ __device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd, #else #ifdef __SVM__ - svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, randb, path_flag); + svm_eval_nodes(kg, sd, SHADER_TYPE_CLOSURE, randb, path_flag); #else bsdf_diffuse_setup(sd, &sd->closure); sd->closure.weight = make_float3(0.8f, 0.8f, 0.8f); @@ -500,7 +500,7 @@ __device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd, int pa #else #ifdef __SVM__ - svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, 0.0f, path_flag); + svm_eval_nodes(kg, sd, SHADER_TYPE_CLOSURE, 0.0f, path_flag); #ifdef __MULTI_CLOSURE__ float3 eval = make_float3(0.0f, 0.0f, 0.0f); @@ -562,7 +562,7 @@ __device void shader_eval_volume(KernelGlobals *kg, ShaderData *sd, #ifdef __OSL__ OSLShader::eval_volume(kg, sd, randb, path_flag); #else - svm_eval_nodes(kg, sd, SHADER_TYPE_VOLUME, randb, path_flag); + svm_eval_nodes(kg, sd, SHADER_TYPE_CLOSURE, randb, path_flag); #endif #endif } diff --git a/intern/cycles/kernel/osl/nodes/CMakeLists.txt b/intern/cycles/kernel/osl/nodes/CMakeLists.txt index 7d37bb09d71..a1e420e8ac1 100644 --- a/intern/cycles/kernel/osl/nodes/CMakeLists.txt +++ b/intern/cycles/kernel/osl/nodes/CMakeLists.txt @@ -32,9 +32,8 @@ set(osl_sources node_musgrave_texture.osl node_blend_weight_texture.osl node_noise_texture.osl + node_output_closure.osl node_output_displacement.osl - node_output_surface.osl - node_output_volume.osl node_sky_texture.osl node_stucci_texture.osl node_texture_coordinate.osl diff --git a/intern/cycles/kernel/osl/nodes/node_output_closure.osl b/intern/cycles/kernel/osl/nodes/node_output_closure.osl new file mode 100644 index 00000000000..075cf35f60b --- /dev/null +++ b/intern/cycles/kernel/osl/nodes/node_output_closure.osl @@ -0,0 +1,25 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "stdosl.h" + +surface node_output_surface(closure color Closure = background()) +{ + Ci = Closure; +} + diff --git a/intern/cycles/kernel/osl/nodes/node_output_surface.osl b/intern/cycles/kernel/osl/nodes/node_output_surface.osl deleted file mode 100644 index 6efaf91121b..00000000000 --- a/intern/cycles/kernel/osl/nodes/node_output_surface.osl +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2011, Blender Foundation. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "stdosl.h" - -surface node_output_surface(closure color Surface = background()) -{ - Ci = Surface; -} - diff --git a/intern/cycles/kernel/osl/nodes/node_output_volume.osl b/intern/cycles/kernel/osl/nodes/node_output_volume.osl deleted file mode 100644 index 18094242dc7..00000000000 --- a/intern/cycles/kernel/osl/nodes/node_output_volume.osl +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2011, Blender Foundation. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "stdosl.h" - -volume node_output_volume(closure color Volume = background()) -{ - Ci = Volume; -} - diff --git a/intern/cycles/kernel/osl/osl_shader.cpp b/intern/cycles/kernel/osl/osl_shader.cpp index 18a8e974492..42e63552063 100644 --- a/intern/cycles/kernel/osl/osl_shader.cpp +++ b/intern/cycles/kernel/osl/osl_shader.cpp @@ -218,8 +218,8 @@ void OSLShader::eval_surface(KernelGlobals *kg, ShaderData *sd, float randb, int /* execute shader for this point */ int shader = sd->shader & SHADER_MASK; - if(kg->osl.surface_state[shader]) - ctx->execute(OSL::pvt::ShadUseSurface, *(kg->osl.surface_state[shader]), *globals); + if(kg->osl.state[shader]) + ctx->execute(OSL::pvt::ShadUseSurface, *(kg->osl.state[shader]), *globals); /* flatten closure tree */ sd->num_closure = 0; @@ -355,8 +355,8 @@ void OSLShader::eval_volume(KernelGlobals *kg, ShaderData *sd, float randb, int /* execute shader */ int shader = sd->shader & SHADER_MASK; - if(kg->osl.volume_state[shader]) - ctx->execute(OSL::pvt::ShadUseSurface, *(kg->osl.volume_state[shader]), *globals); + if(kg->osl.state[shader]) + ctx->execute(OSL::pvt::ShadUseSurface, *(kg->osl.state[shader]), *globals); /* retrieve resulting closures */ sd->osl_closure.volume_sample_sum = 0.0f; diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index 62e02f1a01a..4e0ed25baea 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -166,8 +166,7 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT switch(node.x) { case NODE_SHADER_JUMP: { - if(type == SHADER_TYPE_SURFACE) offset = node.y; - else if(type == SHADER_TYPE_VOLUME) offset = node.z; + if(type == SHADER_TYPE_CLOSURE) offset = node.y; else if(type == SHADER_TYPE_DISPLACEMENT) offset = node.w; else return; break; diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index baec3d7ac6e..fb52a923b0c 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -257,8 +257,7 @@ typedef enum NodeBlendWeightType { } NodeBlendWeightType; typedef enum ShaderType { - SHADER_TYPE_SURFACE, - SHADER_TYPE_VOLUME, + SHADER_TYPE_CLOSURE, SHADER_TYPE_DISPLACEMENT } ShaderType; diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 9e7e2a8a81d..1d21e43217a 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1945,8 +1945,7 @@ void BlendWeightNode::compile(OSLCompiler& compiler) OutputNode::OutputNode() : ShaderNode("output") { - add_input("Surface", SHADER_SOCKET_CLOSURE); - add_input("Volume", SHADER_SOCKET_CLOSURE); + add_input("Closure", SHADER_SOCKET_CLOSURE); add_input("Displacement", SHADER_SOCKET_FLOAT); } @@ -1964,10 +1963,8 @@ void OutputNode::compile(SVMCompiler& compiler) void OutputNode::compile(OSLCompiler& compiler) { - 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"); + if(compiler.output_type() == SHADER_TYPE_CLOSURE) + compiler.add(this, "node_output_closure"); else if(compiler.output_type() == SHADER_TYPE_DISPLACEMENT) compiler.add(this, "node_output_displacement"); } diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp index b0173334c76..492529c30a2 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->surface_state[background_id]; + og->background_state = og->state[background_id]; og->use = true; tls_create(OSLGlobals::ThreadData, og->thread_data); @@ -128,8 +128,7 @@ void OSLShaderManager::device_free(Device *device, DeviceScene *dscene) tls_delete(OSLGlobals::ThreadData, og->thread_data); - og->surface_state.clear(); - og->volume_state.clear(); + og->state.clear(); og->displacement_state.clear(); og->background_state.reset(); } @@ -139,7 +138,7 @@ void OSLShaderManager::device_free(Device *device, DeviceScene *dscene) OSLCompiler::OSLCompiler(void *shadingsys_) { shadingsys = shadingsys_; - current_type = SHADER_TYPE_SURFACE; + current_type = SHADER_TYPE_CLOSURE; current_shader = NULL; background = false; } @@ -170,9 +169,7 @@ bool OSLCompiler::node_skip_input(ShaderNode *node, ShaderInput *input) depending on the current shader type */ if(node->name == ustring("output")) { - if(strcmp(input->name, "Surface") == 0 && current_type != SHADER_TYPE_SURFACE) - return true; - if(strcmp(input->name, "Volume") == 0 && current_type != SHADER_TYPE_VOLUME) + if(strcmp(input->name, "Closure") == 0 && current_type != SHADER_TYPE_CLOSURE) return true; if(strcmp(input->name, "Displacement") == 0 && current_type != SHADER_TYPE_DISPLACEMENT) return true; @@ -223,9 +220,7 @@ 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_SURFACE) - ss->Shader("surface", name, id(node).c_str()); - else if(current_type == SHADER_TYPE_VOLUME) + if(current_type == SHADER_TYPE_CLOSURE) ss->Shader("surface", name, id(node).c_str()); else if(current_type == SHADER_TYPE_DISPLACEMENT) ss->Shader("surface", name, id(node).c_str()); @@ -346,6 +341,8 @@ void OSLCompiler::generate_nodes(const set& 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; @@ -365,15 +362,9 @@ void OSLCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty ShaderNode *output = graph->output(); set dependencies; - if(type == SHADER_TYPE_SURFACE) { + if(type == SHADER_TYPE_CLOSURE) { /* generate surface shader */ - 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")); + find_dependencies(dependencies, output->input("Closure")); generate_nodes(dependencies); output->compile(*this); } @@ -396,7 +387,7 @@ void OSLCompiler::compile(OSLGlobals *og, Shader *shader) ShaderNode *output = (graph)? graph->output(): NULL; /* copy graph for shader with bump mapping */ - if(output->input("Surface")->link && output->input("Displacement")->link) + if(output->input("Closure")->link && output->input("Displacement")->link) if(!shader->graph_bump) shader->graph_bump = shader->graph->copy(); @@ -407,46 +398,29 @@ 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("Surface")->link) { - compile_type(shader, shader->graph, SHADER_TYPE_SURFACE); - og->surface_state.push_back(ss->state()); + if(graph && output->input("Closure")->link) { + compile_type(shader, shader->graph, SHADER_TYPE_CLOSURE); + og->state.push_back(ss->state()); if(shader->graph_bump) { ss->clear_state(); - compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE); - og->surface_state.push_back(ss->state()); + compile_type(shader, shader->graph_bump, SHADER_TYPE_CLOSURE); + og->state.push_back(ss->state()); } else - 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->state.push_back(ss->state()); - og->volume_state.push_back(ss->state()); - og->volume_state.push_back(ss->state()); ss->clear_state(); } else { - og->volume_state.push_back(OSL::ShadingAttribStateRef()); - og->volume_state.push_back(OSL::ShadingAttribStateRef()); + og->state.push_back(OSL::ShadingAttribStateRef()); + og->state.push_back(OSL::ShadingAttribStateRef()); } /* generate displacement shader */ diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 6e827ec94bb..c0d450db22b 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -42,7 +42,6 @@ Shader::Shader() sample_as_light = true; homogeneous_volume = false; - has_surface = false; has_surface_transparent = false; has_surface_emission = false; has_volume = false; @@ -210,7 +209,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("Surface")); + graph->connect(closure->output("BSDF"), out->input("Closure")); shader = new Shader(); shader->name = "default_surface"; @@ -228,7 +227,7 @@ void ShaderManager::add_default(Scene *scene) closure->input("Strength")->value.x = 0.0f; out = graph->output(); - graph->connect(closure->output("Emission"), out->input("Surface")); + graph->connect(closure->output("Emission"), out->input("Closure")); shader = new Shader(); shader->name = "default_light"; @@ -245,7 +244,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("Surface")); + graph->connect(closure->output("Background"), out->input("Closure")); shader = new Shader(); shader->name = "default_background"; diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h index 45efa123ef6..17ffc75924b 100644 --- a/intern/cycles/render/shader.h +++ b/intern/cycles/render/shader.h @@ -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 three outputs: surface, - * volume and displacement, that the shader manager will compile and execute + * While there is only a single shader graph, it has two outputs: shader, + * displacement, that the shader manager will compile and execute * separately. */ class Shader { @@ -65,11 +65,10 @@ public: bool need_update_attributes; /* information about shader after compiling */ - bool has_surface; bool has_surface_emission; bool has_surface_transparent; - bool has_volume; bool has_displacement; + bool has_volume; /* requested mesh attributes */ AttributeRequestSet attributes; diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp index a1687ae5e29..054989bbc28 100644 --- a/intern/cycles/render/svm.cpp +++ b/intern/cycles/render/svm.cpp @@ -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_SURFACE; + current_type = SHADER_TYPE_CLOSURE; current_shader = NULL; background = false; mix_weight_offset = SVM_STACK_INVALID; @@ -467,6 +467,8 @@ void SVMCompiler::generate_closure(ShaderNode *node, set& 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 */ } @@ -577,10 +579,8 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty ShaderNode *node = graph->output(); ShaderInput *clin = NULL; - if(type == SHADER_TYPE_SURFACE) - clin = node->input("Surface"); - else if(type == SHADER_TYPE_VOLUME) - clin = node->input("Volume"); + if(type == SHADER_TYPE_CLOSURE) + clin = node->input("Closure"); else if(type == SHADER_TYPE_DISPLACEMENT) clin = node->input("Displacement"); else @@ -599,15 +599,9 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty if(clin->link) { bool generate = false; - if(type == SHADER_TYPE_SURFACE) { + if(type == SHADER_TYPE_CLOSURE) { /* 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 */ @@ -636,7 +630,7 @@ void SVMCompiler::compile(Shader *shader, vector& global_svm_nodes, int in /* copy graph for shader with bump mapping */ ShaderNode *node = shader->graph->output(); - if(node->input("Surface")->link && node->input("Displacement")->link) + if(node->input("Closure")->link && node->input("Displacement")->link) if(!shader->graph_bump) shader->graph_bump = shader->graph->copy(); @@ -647,30 +641,23 @@ void SVMCompiler::compile(Shader *shader, vector& 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_SURFACE); + compile_type(shader, shader->graph, SHADER_TYPE_CLOSURE); 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_SURFACE); + compile_type(shader, shader->graph_bump, SHADER_TYPE_CLOSURE); 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(); -- cgit v1.2.3