From 99b325cebf41054f046d98a7dcf9aea74e165f56 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Thu, 23 May 2013 17:45:20 +0000 Subject: Cycles / Toon BSDF: * Added a toon bsdf node to Cycles. This was already available as OSL only closure, but is now available inside the SVM backed as well, for CPU and GPU rendering. * There are 2 variations available, diffuse and glossy toon, selectable via a menu inside the node. Documentation: http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Nodes/Shaders#Toon Example render & blend file: http://www.pasteall.org/pic/show.php?id=51970 http://www.pasteall.org/blend/21579 --- intern/cycles/blender/blender_shader.cpp | 13 ++ intern/cycles/kernel/closure/bsdf.h | 27 ++++ intern/cycles/kernel/closure/bsdf_toon.h | 14 +- intern/cycles/kernel/osl/CMakeLists.txt | 1 - intern/cycles/kernel/osl/bsdf_toon.cpp | 179 ------------------------ intern/cycles/kernel/osl/osl_closures.cpp | 21 ++- intern/cycles/kernel/osl/osl_closures.h | 4 - intern/cycles/kernel/shaders/CMakeLists.txt | 1 + intern/cycles/kernel/shaders/node_toon_bsdf.osl | 34 +++++ intern/cycles/kernel/shaders/stdosl.h | 2 +- intern/cycles/kernel/svm/svm_closure.h | 17 +++ intern/cycles/kernel/svm/svm_types.h | 2 +- intern/cycles/render/nodes.cpp | 35 +++++ intern/cycles/render/nodes.h | 8 ++ 14 files changed, 161 insertions(+), 197 deletions(-) delete mode 100644 intern/cycles/kernel/osl/bsdf_toon.cpp create mode 100644 intern/cycles/kernel/shaders/node_toon_bsdf.osl (limited to 'intern') diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index 8331f3a5790..4fcba2f9021 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -354,6 +354,19 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen } node = refraction; } + else if (b_node.is_a(&RNA_ShaderNodeBsdfToon)) { + BL::ShaderNodeBsdfToon b_toon_node(b_node); + ToonBsdfNode *toon = new ToonBsdfNode(); + switch(b_toon_node.component()) { + case BL::ShaderNodeBsdfToon::component_DIFFUSE: + toon->component = ustring("Diffuse"); + break; + case BL::ShaderNodeBsdfToon::component_GLOSSY: + toon->component = ustring("Glossy"); + break; + } + node = toon; + } else if (b_node.is_a(&RNA_ShaderNodeBsdfTranslucent)) { node = new TranslucentBsdfNode(); } diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h index 6403606c2df..b2884953a22 100644 --- a/intern/cycles/kernel/closure/bsdf.h +++ b/intern/cycles/kernel/closure/bsdf.h @@ -29,6 +29,7 @@ #include "../closure/bsdf_ward.h" #endif #include "../closure/bsdf_westin.h" +#include "../closure/bsdf_toon.h" #include "../closure/bssrdf.h" CCL_NAMESPACE_BEGIN @@ -96,6 +97,14 @@ __device int bsdf_sample(KernelGlobals *kg, const ShaderData *sd, const ShaderCl label = bsdf_ashikhmin_velvet_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf); break; + case CLOSURE_BSDF_DIFFUSE_TOON_ID: + label = bsdf_diffuse_toon_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv, + eval, omega_in, &domega_in->dx, &domega_in->dy, pdf); + break; + case CLOSURE_BSDF_GLOSSY_TOON_ID: + label = bsdf_glossy_toon_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv, + eval, omega_in, &domega_in->dx, &domega_in->dy, pdf); + break; case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: label = bsdf_westin_backscatter_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf); @@ -165,6 +174,12 @@ __device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const ShaderC case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: eval = bsdf_ashikhmin_velvet_eval_reflect(sc, sd->I, omega_in, pdf); break; + case CLOSURE_BSDF_DIFFUSE_TOON_ID: + eval = bsdf_diffuse_toon_eval_reflect(sc, sd->I, omega_in, pdf); + break; + case CLOSURE_BSDF_GLOSSY_TOON_ID: + eval = bsdf_glossy_toon_eval_reflect(sc, sd->I, omega_in, pdf); + break; case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: eval = bsdf_westin_backscatter_eval_reflect(sc, sd->I, omega_in, pdf); break; @@ -214,6 +229,12 @@ __device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const ShaderC case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: eval = bsdf_ashikhmin_velvet_eval_transmit(sc, sd->I, omega_in, pdf); break; + case CLOSURE_BSDF_DIFFUSE_TOON_ID: + eval = bsdf_diffuse_toon_eval_transmit(sc, sd->I, omega_in, pdf); + break; + case CLOSURE_BSDF_GLOSSY_TOON_ID: + eval = bsdf_glossy_toon_eval_transmit(sc, sd->I, omega_in, pdf); + break; case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: eval = bsdf_westin_backscatter_eval_transmit(sc, sd->I, omega_in, pdf); break; @@ -281,6 +302,12 @@ __device void bsdf_blur(KernelGlobals *kg, ShaderClosure *sc, float roughness) case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: bsdf_ashikhmin_velvet_blur(sc, roughness); break; + case CLOSURE_BSDF_DIFFUSE_TOON_ID: + bsdf_diffuse_toon_blur(sc, roughness); + break; + case CLOSURE_BSDF_GLOSSY_TOON_ID: + bsdf_glossy_toon_blur(sc, roughness); + break; case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: bsdf_westin_backscatter_blur(sc, roughness); break; diff --git a/intern/cycles/kernel/closure/bsdf_toon.h b/intern/cycles/kernel/closure/bsdf_toon.h index 40001bf7531..e69981dba77 100644 --- a/intern/cycles/kernel/closure/bsdf_toon.h +++ b/intern/cycles/kernel/closure/bsdf_toon.h @@ -119,22 +119,22 @@ __device int bsdf_diffuse_toon_sample(const ShaderClosure *sc, float3 Ng, float3 } -/* SPECULAR TOON */ +/* GLOSSY TOON */ -__device int bsdf_specular_toon_setup(ShaderClosure *sc) +__device int bsdf_glossy_toon_setup(ShaderClosure *sc) { - sc->type = CLOSURE_BSDF_SPECULAR_TOON_ID; + sc->type = CLOSURE_BSDF_GLOSSY_TOON_ID; sc->data0 = clamp(sc->data0, 0.0f, 1.0f); sc->data1 = clamp(sc->data1, 0.0f, 1.0f); return SD_BSDF|SD_BSDF_HAS_EVAL; } -__device void bsdf_specular_toon_blur(ShaderClosure *sc, float roughness) +__device void bsdf_glossy_toon_blur(ShaderClosure *sc, float roughness) { } -__device float3 bsdf_specular_toon_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) +__device float3 bsdf_glossy_toon_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) { float max_angle = sc->data0*M_PI_2_F; float smooth = sc->data1*M_PI_2_F; @@ -158,12 +158,12 @@ __device float3 bsdf_specular_toon_eval_reflect(const ShaderClosure *sc, const f return make_float3(0.0f, 0.0f, 0.0f); } -__device float3 bsdf_specular_toon_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) +__device float3 bsdf_glossy_toon_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) { return make_float3(0.0f, 0.0f, 0.0f); } -__device int bsdf_specular_toon_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf) +__device int bsdf_glossy_toon_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf) { float max_angle = sc->data0*M_PI_2_F; float smooth = sc->data1*M_PI_2_F; diff --git a/intern/cycles/kernel/osl/CMakeLists.txt b/intern/cycles/kernel/osl/CMakeLists.txt index 0ce40eda4df..b10ec588757 100644 --- a/intern/cycles/kernel/osl/CMakeLists.txt +++ b/intern/cycles/kernel/osl/CMakeLists.txt @@ -16,7 +16,6 @@ set(SRC background.cpp bsdf_diffuse_ramp.cpp bsdf_phong_ramp.cpp - bsdf_toon.cpp emissive.cpp osl_bssrdf.cpp osl_closures.cpp diff --git a/intern/cycles/kernel/osl/bsdf_toon.cpp b/intern/cycles/kernel/osl/bsdf_toon.cpp deleted file mode 100644 index d409b2cedaf..00000000000 --- a/intern/cycles/kernel/osl/bsdf_toon.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Adapted from Open Shading Language with this license: - * - * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al. - * All Rights Reserved. - * - * Modifications Copyright 2011, Blender Foundation. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of Sony Pictures Imageworks nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include - -#include - -#include "osl_closures.h" - -#include "kernel_types.h" -#include "kernel_montecarlo.h" -#include "closure/bsdf_toon.h" - -CCL_NAMESPACE_BEGIN - -using namespace OSL; - -/* DIFFUSE TOON */ - -class DiffuseToonClosure : public CBSDFClosure { -public: - DiffuseToonClosure() : CBSDFClosure(LABEL_DIFFUSE) {} - - size_t memsize() const { return sizeof(*this); } - const char *name() const { return "diffuse_toon"; } - - void setup() - { - sc.prim = this; - m_shaderdata_flag = bsdf_diffuse_toon_setup(&sc); - } - - bool mergeable(const ClosurePrimitive *other) const - { - return false; - } - - void blur(float roughness) - { - bsdf_diffuse_toon_blur(&sc, roughness); - } - - void print_on(std::ostream &out) const - { - out << name() << " ((" << sc.N[0] << ", " << sc.N[1] << ", " << sc.N[2] << "))"; - } - - float3 eval_reflect(const float3 &omega_out, const float3 &omega_in, float& pdf) const - { - return bsdf_diffuse_toon_eval_reflect(&sc, omega_out, omega_in, &pdf); - } - - float3 eval_transmit(const float3 &omega_out, const float3 &omega_in, float& pdf) const - { - return bsdf_diffuse_toon_eval_transmit(&sc, omega_out, omega_in, &pdf); - } - - int sample(const float3 &Ng, - const float3 &omega_out, const float3 &domega_out_dx, const float3 &domega_out_dy, - float randu, float randv, - float3 &omega_in, float3 &domega_in_dx, float3 &domega_in_dy, - float &pdf, float3 &eval) const - { - return bsdf_diffuse_toon_sample(&sc, Ng, omega_out, domega_out_dx, domega_out_dy, - randu, randv, &eval, &omega_in, &domega_in_dx, &domega_in_dy, &pdf); - } -}; - -ClosureParam *closure_bsdf_diffuse_toon_params() -{ - static ClosureParam params[] = { - CLOSURE_FLOAT3_PARAM(DiffuseToonClosure, sc.N), - CLOSURE_FLOAT_PARAM(DiffuseToonClosure, sc.data0), - CLOSURE_FLOAT_PARAM(DiffuseToonClosure, sc.data1), - CLOSURE_STRING_KEYPARAM("label"), - CLOSURE_FINISH_PARAM(DiffuseToonClosure) - }; - return params; -} - -CLOSURE_PREPARE(closure_bsdf_diffuse_toon_prepare, DiffuseToonClosure) - -/* SPECULAR TOON */ - -class SpecularToonClosure : public CBSDFClosure { -public: - SpecularToonClosure() : CBSDFClosure(LABEL_GLOSSY) {} - - size_t memsize() const { return sizeof(*this); } - const char *name() const { return "specular_toon"; } - - void setup() - { - sc.prim = this; - m_shaderdata_flag = bsdf_specular_toon_setup(&sc); - } - - bool mergeable(const ClosurePrimitive *other) const - { - return false; - } - - void blur(float roughness) - { - bsdf_specular_toon_blur(&sc, roughness); - } - - void print_on(std::ostream &out) const - { - out << name() << " ((" << sc.N[0] << ", " << sc.N[1] << ", " << sc.N[2] << "))"; - } - - float3 eval_reflect(const float3 &omega_out, const float3 &omega_in, float& pdf) const - { - return bsdf_specular_toon_eval_reflect(&sc, omega_out, omega_in, &pdf); - } - - float3 eval_transmit(const float3 &omega_out, const float3 &omega_in, float& pdf) const - { - return bsdf_specular_toon_eval_transmit(&sc, omega_out, omega_in, &pdf); - } - - int sample(const float3 &Ng, - const float3 &omega_out, const float3 &domega_out_dx, const float3 &domega_out_dy, - float randu, float randv, - float3 &omega_in, float3 &domega_in_dx, float3 &domega_in_dy, - float &pdf, float3 &eval) const - { - return bsdf_specular_toon_sample(&sc, Ng, omega_out, domega_out_dx, domega_out_dy, - randu, randv, &eval, &omega_in, &domega_in_dx, &domega_in_dy, &pdf); - } -}; - -ClosureParam *closure_bsdf_specular_toon_params() -{ - static ClosureParam params[] = { - CLOSURE_FLOAT3_PARAM(SpecularToonClosure, sc.N), - CLOSURE_FLOAT_PARAM(SpecularToonClosure, sc.data0), - CLOSURE_FLOAT_PARAM(SpecularToonClosure, sc.data1), - CLOSURE_STRING_KEYPARAM("label"), - CLOSURE_FINISH_PARAM(SpecularToonClosure) - }; - return params; -} - -CLOSURE_PREPARE(closure_bsdf_specular_toon_prepare, SpecularToonClosure) - - -CCL_NAMESPACE_END - diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp index 51a7a03342e..8473f800d39 100644 --- a/intern/cycles/kernel/osl/osl_closures.cpp +++ b/intern/cycles/kernel/osl/osl_closures.cpp @@ -53,6 +53,7 @@ #include "closure/bsdf_transparent.h" #include "closure/bsdf_ward.h" #include "closure/bsdf_westin.h" +#include "closure/bsdf_toon.h" CCL_NAMESPACE_BEGIN @@ -107,6 +108,18 @@ BSDF_CLOSURE_CLASS_BEGIN(Ward, ward, ward, LABEL_GLOSSY) CLOSURE_FLOAT_PARAM(WardClosure, sc.data1), BSDF_CLOSURE_CLASS_END(Ward, ward) +BSDF_CLOSURE_CLASS_BEGIN(DiffuseToon, diffuse_toon, diffuse_toon, LABEL_DIFFUSE) + CLOSURE_FLOAT3_PARAM(DiffuseToonClosure, sc.N), + CLOSURE_FLOAT_PARAM(DiffuseToonClosure, sc.data0), + CLOSURE_FLOAT_PARAM(DiffuseToonClosure, sc.data1), +BSDF_CLOSURE_CLASS_END(DiffuseToon, diffuse_toon) + +BSDF_CLOSURE_CLASS_BEGIN(GlossyToon, glossy_toon, glossy_toon, LABEL_GLOSSY) + CLOSURE_FLOAT3_PARAM(GlossyToonClosure, sc.N), + CLOSURE_FLOAT_PARAM(GlossyToonClosure, sc.data0), + CLOSURE_FLOAT_PARAM(GlossyToonClosure, sc.data1), +BSDF_CLOSURE_CLASS_END(GlossyToon, glossy_toon) + BSDF_CLOSURE_CLASS_BEGIN(MicrofacetGGX, microfacet_ggx, microfacet_ggx, LABEL_GLOSSY) CLOSURE_FLOAT3_PARAM(MicrofacetGGXClosure, sc.N), CLOSURE_FLOAT_PARAM(MicrofacetGGXClosure, sc.data0), @@ -181,6 +194,10 @@ void OSLShader::register_closures(OSLShadingSystem *ss_) bsdf_ward_params(), bsdf_ward_prepare); register_closure(ss, "ashikhmin_velvet", id++, bsdf_ashikhmin_velvet_params(), bsdf_ashikhmin_velvet_prepare); + register_closure(ss, "diffuse_toon", id++, + bsdf_diffuse_toon_params(), bsdf_diffuse_toon_prepare); + register_closure(ss, "glossy_toon", id++, + bsdf_glossy_toon_params(), bsdf_glossy_toon_prepare); register_closure(ss, "westin_backscatter", id++, bsdf_westin_backscatter_params(), bsdf_westin_backscatter_prepare); register_closure(ss, "westin_sheen", id++, @@ -198,10 +215,6 @@ void OSLShader::register_closures(OSLShadingSystem *ss_) closure_bsdf_diffuse_ramp_params(), closure_bsdf_diffuse_ramp_prepare); register_closure(ss, "phong_ramp", id++, closure_bsdf_phong_ramp_params(), closure_bsdf_phong_ramp_prepare); - register_closure(ss, "diffuse_toon", id++, - closure_bsdf_diffuse_toon_params(), closure_bsdf_diffuse_toon_prepare); - register_closure(ss, "specular_toon", id++, - closure_bsdf_specular_toon_params(), closure_bsdf_specular_toon_prepare); register_closure(ss, "bssrdf_cubic", id++, closure_bssrdf_params(), closure_bssrdf_prepare); } diff --git a/intern/cycles/kernel/osl/osl_closures.h b/intern/cycles/kernel/osl/osl_closures.h index 79b9b378d12..17d7260c191 100644 --- a/intern/cycles/kernel/osl/osl_closures.h +++ b/intern/cycles/kernel/osl/osl_closures.h @@ -49,8 +49,6 @@ OSL::ClosureParam *closure_holdout_params(); OSL::ClosureParam *closure_ambient_occlusion_params(); OSL::ClosureParam *closure_bsdf_diffuse_ramp_params(); OSL::ClosureParam *closure_bsdf_phong_ramp_params(); -OSL::ClosureParam *closure_bsdf_diffuse_toon_params(); -OSL::ClosureParam *closure_bsdf_specular_toon_params(); OSL::ClosureParam *closure_westin_backscatter_params(); OSL::ClosureParam *closure_westin_sheen_params(); OSL::ClosureParam *closure_bssrdf_params(); @@ -61,8 +59,6 @@ void closure_holdout_prepare(OSL::RendererServices *, int id, void *data); void closure_ambient_occlusion_prepare(OSL::RendererServices *, int id, void *data); void closure_bsdf_diffuse_ramp_prepare(OSL::RendererServices *, int id, void *data); void closure_bsdf_phong_ramp_prepare(OSL::RendererServices *, int id, void *data); -void closure_bsdf_diffuse_toon_prepare(OSL::RendererServices *, int id, void *data); -void closure_bsdf_specular_toon_prepare(OSL::RendererServices *, int id, void *data); void closure_westin_backscatter_prepare(OSL::RendererServices *, int id, void *data); void closure_westin_sheen_prepare(OSL::RendererServices *, int id, void *data); void closure_bssrdf_prepare(OSL::RendererServices *, int id, void *data); diff --git a/intern/cycles/kernel/shaders/CMakeLists.txt b/intern/cycles/kernel/shaders/CMakeLists.txt index ae8ff88efd2..4f0b5b25cb3 100644 --- a/intern/cycles/kernel/shaders/CMakeLists.txt +++ b/intern/cycles/kernel/shaders/CMakeLists.txt @@ -58,6 +58,7 @@ set(SRC_OSL node_subsurface_scattering.osl node_tangent.osl node_texture_coordinate.osl + node_toon_bsdf.osl node_translucent_bsdf.osl node_transparent_bsdf.osl node_value.osl diff --git a/intern/cycles/kernel/shaders/node_toon_bsdf.osl b/intern/cycles/kernel/shaders/node_toon_bsdf.osl new file mode 100644 index 00000000000..6533e15db37 --- /dev/null +++ b/intern/cycles/kernel/shaders/node_toon_bsdf.osl @@ -0,0 +1,34 @@ +/* + * Copyright 2013, 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" + +shader node_toon_bsdf( + color Color = 0.8, + string component = "Diffuse", + float Size = 0.5, + float Smooth = 0.0, + normal Normal = N, + output closure color BSDF = 0) +{ + if (component == "Diffuse") + BSDF = Color * diffuse_toon(Normal, Size, Smooth); + else if (component == "Glossy") + BSDF = Color * glossy_toon(Normal, Size, Smooth); +} + diff --git a/intern/cycles/kernel/shaders/stdosl.h b/intern/cycles/kernel/shaders/stdosl.h index 9c9e04ab721..e98d0c9a9ad 100644 --- a/intern/cycles/kernel/shaders/stdosl.h +++ b/intern/cycles/kernel/shaders/stdosl.h @@ -446,7 +446,7 @@ closure color oren_nayar(normal N, float sigma) BUILTIN; closure color diffuse_ramp(normal N, color colors[8]) BUILTIN; closure color phong_ramp(normal N, float exponent, color colors[8]) BUILTIN; closure color diffuse_toon(normal N, float size, float smooth) BUILTIN; -closure color specular_toon(normal N, float size, float smooth) BUILTIN; +closure color glossy_toon(normal N, float size, float smooth) BUILTIN; closure color westin_backscatter(normal N, float roughness) BUILTIN; closure color westin_sheen(normal N, float edginess) BUILTIN; closure color translucent(normal N) BUILTIN; diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index d97e165c66d..0621133a316 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -322,6 +322,23 @@ __device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *st } break; } + case CLOSURE_BSDF_DIFFUSE_TOON_ID: + case CLOSURE_BSDF_GLOSSY_TOON_ID: { + ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); + + if(sc) { + /* Normal, Size and Smooth */ + sc->N = N; + sc->data0 = param1; + sc->data1 = param2; + + if (type == CLOSURE_BSDF_DIFFUSE_TOON_ID) + sd->flag |= bsdf_diffuse_toon_setup(sc); + else + sd->flag |= bsdf_glossy_toon_setup(sc); + } + break; + } #ifdef __SUBSURFACE__ case CLOSURE_BSSRDF_ID: { ShaderClosure *sc = &sd->closure[sd->num_closure]; diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index de52844194c..681c0c73575 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -336,7 +336,7 @@ typedef enum ClosureType { CLOSURE_BSDF_ASHIKHMIN_VELVET_ID, CLOSURE_BSDF_WESTIN_SHEEN_ID, CLOSURE_BSDF_PHONG_RAMP_ID, - CLOSURE_BSDF_SPECULAR_TOON_ID, + CLOSURE_BSDF_GLOSSY_TOON_ID, CLOSURE_BSDF_TRANSMISSION_ID, CLOSURE_BSDF_TRANSLUCENT_ID, diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 4d9fc356d80..84038f13270 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1482,6 +1482,41 @@ void RefractionBsdfNode::compile(OSLCompiler& compiler) compiler.add(this, "node_refraction_bsdf"); } +/* Toon BSDF Closure */ + +static ShaderEnum toon_component_init() +{ + ShaderEnum enm; + + enm.insert("Diffuse", CLOSURE_BSDF_DIFFUSE_TOON_ID); + enm.insert("Glossy", CLOSURE_BSDF_GLOSSY_TOON_ID); + + return enm; +} + +ShaderEnum ToonBsdfNode::component_enum = toon_component_init(); + +ToonBsdfNode::ToonBsdfNode() +{ + component = ustring("Diffuse"); + + add_input("Size", SHADER_SOCKET_FLOAT, 0.5f); + add_input("Smooth", SHADER_SOCKET_FLOAT, 0.0f); +} + +void ToonBsdfNode::compile(SVMCompiler& compiler) +{ + closure = (ClosureType)component_enum[component]; + + BsdfNode::compile(compiler, input("Size"), input("Smooth")); +} + +void ToonBsdfNode::compile(OSLCompiler& compiler) +{ + compiler.parameter("component", component); + compiler.add(this, "node_toon_bsdf"); +} + /* Velvet BSDF Closure */ VelvetBsdfNode::VelvetBsdfNode() diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 8a34e4e0c40..2c5d9b7177a 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -259,6 +259,14 @@ public: static ShaderEnum distribution_enum; }; +class ToonBsdfNode : public BsdfNode { +public: + SHADER_NODE_CLASS(ToonBsdfNode) + + ustring component; + static ShaderEnum component_enum; +}; + class SubsurfaceScatteringNode : public BsdfNode { public: SHADER_NODE_CLASS(SubsurfaceScatteringNode) -- cgit v1.2.3