diff options
26 files changed, 268 insertions, 209 deletions
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 <OpenImageIO/fmath.h> - -#include <OSL/genclosure.h> - -#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) diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index b07fc53f517..e3e4da41941 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -156,6 +156,7 @@ shader_node_categories = [ NodeItem("ShaderNodeBsdfTranslucent"), NodeItem("ShaderNodeBsdfAnisotropic"), NodeItem("ShaderNodeBsdfVelvet"), + NodeItem("ShaderNodeBsdfToon"), NodeItem("ShaderNodeSubsurfaceScattering"), NodeItem("ShaderNodeEmission"), NodeItem("ShaderNodeBackground"), diff --git a/release/scripts/templates_osl/toon_closure.osl b/release/scripts/templates_osl/toon_closure.osl deleted file mode 100644 index ccc381288d2..00000000000 --- a/release/scripts/templates_osl/toon_closure.osl +++ /dev/null @@ -1,12 +0,0 @@ - -shader node_toon_bsdf( - color Color = 0.8, - float Size = 0.5, - float Smooth = 0.0, - normal Normal = N, - output closure color Diffuse = 0, - output closure color Specular = 0) -{ - Diffuse = Color * diffuse_toon(Normal, Size, Smooth); - Specular = Color * specular_toon(Normal, Size, Smooth); -}
\ No newline at end of file diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index d399a4fbacd..ef51abc419e 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -740,6 +740,7 @@ struct ShadeResult; #define SH_NODE_HAIR_INFO 176 #define SH_NODE_SUBSURFACE_SCATTERING 177 #define SH_NODE_WIREFRAME 178 +#define SH_NODE_BSDF_TOON 179 /* custom defines options for Material node */ #define SH_NODE_MAT_DIFF 1 diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index f3892a5bf50..fadf81966f9 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -3435,6 +3435,7 @@ static void registerShaderNodes(void) register_node_type_sh_bsdf_translucent(); register_node_type_sh_bsdf_transparent(); register_node_type_sh_bsdf_velvet(); + register_node_type_sh_bsdf_toon(); register_node_type_sh_emission(); register_node_type_sh_holdout(); //register_node_type_sh_volume_transparent(); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index e26fe5f6f3e..e6b4f3cbefb 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -894,6 +894,11 @@ static void node_shader_buts_glossy(uiLayout *layout, bContext *UNUSED(C), Point uiItemR(layout, ptr, "distribution", 0, "", ICON_NONE); } +static void node_shader_buts_toon(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "component", 0, "", ICON_NONE); +} + static void node_shader_buts_script(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { uiLayout *row; @@ -1017,6 +1022,9 @@ static void node_shader_set_butfunc(bNodeType *ntype) case SH_NODE_BSDF_REFRACTION: ntype->uifunc = node_shader_buts_glossy; break; + case SH_NODE_BSDF_TOON: + ntype->uifunc = node_shader_buts_toon; + break; case SH_NODE_SCRIPT: ntype->uifunc = node_shader_buts_script; ntype->uifuncbut = node_shader_buts_script_details; diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index 3a68b79d154..f5b142fa5b9 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -2063,6 +2063,11 @@ void node_bsdf_glass(vec4 color, float roughness, float ior, vec3 N, out vec4 re node_bsdf_diffuse(color, 0.0, N, result); } +void node_bsdf_toon(vec4 color, float size, float smooth, vec3 N, out vec4 result) +{ + node_bsdf_diffuse(color, 0.0, N, result); +} + void node_bsdf_translucent(vec4 color, vec3 N, out vec4 result) { node_bsdf_diffuse(color, 0.0, N, result); diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 25412f1937b..e3606f57e48 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -869,6 +869,10 @@ typedef struct NodeShaderNormalMap { #define SHD_GLOSSY_SHARP 1 #define SHD_GLOSSY_GGX 2 +/* toon modes */ +#define SHD_TOON_DIFFUSE 0 +#define SHD_TOON_GLOSSY 1 + /* blend texture */ #define SHD_BLEND_LINEAR 0 #define SHD_BLEND_QUADRATIC 1 diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 308fab7e610..e57256efd87 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -2815,6 +2815,12 @@ static EnumPropertyItem node_glossy_items[] = { {0, NULL, 0, NULL, NULL} }; +static EnumPropertyItem node_toon_items[] = { + {SHD_TOON_DIFFUSE, "DIFFUSE", 0, "Diffuse", ""}, + {SHD_TOON_GLOSSY, "GLOSSY", 0, "Glossy", ""}, + {0, NULL, 0, NULL, NULL} +}; + static EnumPropertyItem node_script_mode_items[] = { {NODE_SCRIPT_INTERNAL, "INTERNAL", 0, "Internal", "Use internal text datablock"}, {NODE_SCRIPT_EXTERNAL, "EXTERNAL", 0, "External", "Use external .osl or .oso file"}, @@ -3427,6 +3433,17 @@ static void def_glossy(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } +static void def_toon(StructRNA *srna) +{ + PropertyRNA *prop; + + prop = RNA_def_property(srna, "component", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom1"); + RNA_def_property_enum_items(prop, node_toon_items); + RNA_def_property_ui_text(prop, "Component", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); +} + static void def_sh_bump(StructRNA *srna) { PropertyRNA *prop; diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index 3e0c57f4960..5615dfc682b 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -155,6 +155,7 @@ set(SRC shader/nodes/node_shader_bsdf_diffuse.c shader/nodes/node_shader_bsdf_glass.c shader/nodes/node_shader_bsdf_glossy.c + shader/nodes/node_shader_bsdf_toon.c shader/nodes/node_shader_bsdf_refraction.c shader/nodes/node_shader_bsdf_translucent.c shader/nodes/node_shader_bsdf_transparent.c diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h index 334f8f48ca0..993a48495ad 100644 --- a/source/blender/nodes/NOD_shader.h +++ b/source/blender/nodes/NOD_shader.h @@ -97,6 +97,7 @@ void register_node_type_sh_bsdf_refraction(void); void register_node_type_sh_bsdf_translucent(void); void register_node_type_sh_bsdf_transparent(void); void register_node_type_sh_bsdf_velvet(void); +void register_node_type_sh_bsdf_toon(void); void register_node_type_sh_bsdf_anisotropic(void); void register_node_type_sh_emission(void); void register_node_type_sh_holdout(void); diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 2754fb1b886..bc6d5d598d2 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -84,6 +84,7 @@ DefNode( ShaderNode, SH_NODE_BSDF_REFRACTION, def_glossy, "BS DefNode( ShaderNode, SH_NODE_BSDF_TRANSLUCENT, 0, "BSDF_TRANSLUCENT", BsdfTranslucent, "Translucent BSDF", "" ) DefNode( ShaderNode, SH_NODE_BSDF_TRANSPARENT, 0, "BSDF_TRANSPARENT", BsdfTransparent, "Transparent BSDF", "" ) DefNode( ShaderNode, SH_NODE_BSDF_VELVET, 0, "BSDF_VELVET", BsdfVelvet, "Velvet BSDF", "" ) +DefNode( ShaderNode, SH_NODE_BSDF_TOON, def_toon, "BSDF_TOON", BsdfToon, "Toon BSDF", "" ) DefNode( ShaderNode, SH_NODE_SUBSURFACE_SCATTERING, 0, "SUBSURFACE_SCATTERING",SubsurfaceScattering,"Subsurface Scattering","") DefNode( ShaderNode, SH_NODE_VOLUME_TRANSPARENT, 0, "VOLUME_TRANSPARENT", VolumeTransparent,"Transparent Volume","" ) DefNode( ShaderNode, SH_NODE_VOLUME_ISOTROPIC, 0, "VOLUME_ISOTROPIC", VolumeIsotropic, "Isotropic Volume", "" ) diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_toon.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_toon.c new file mode 100644 index 00000000000..42f9bdefad5 --- /dev/null +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_toon.c @@ -0,0 +1,67 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "../node_shader_util.h" + +/* **************** OUTPUT ******************** */ + +static bNodeSocketTemplate sh_node_bsdf_toon_in[] = { + { SOCK_RGBA, 1, N_("Color"), 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, N_("Size"), 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, N_("Smooth"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE}, + { -1, 0, "" } +}; + +static bNodeSocketTemplate sh_node_bsdf_toon_out[] = { + { SOCK_SHADER, 0, N_("BSDF")}, + { -1, 0, "" } +}; + +static int node_shader_gpu_bsdf_toon(GPUMaterial *mat, bNode *UNUSED(node), bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out) +{ + if (!in[3].link) + in[3].link = GPU_builtin(GPU_VIEW_NORMAL); + + return GPU_stack_link(mat, "node_bsdf_toon", in, out); +} + +/* node type definition */ +void register_node_type_sh_bsdf_toon(void) +{ + static bNodeType ntype; + + sh_node_type_base(&ntype, SH_NODE_BSDF_TOON, "Toon BSDF", NODE_CLASS_SHADER, NODE_OPTIONS); + node_type_compatibility(&ntype, NODE_NEW_SHADING); + node_type_socket_templates(&ntype, sh_node_bsdf_toon_in, sh_node_bsdf_toon_out); + node_type_size_preset(&ntype, NODE_SIZE_MIDDLE); + node_type_init(&ntype, NULL); + node_type_storage(&ntype, "", NULL, NULL); + node_type_gpu(&ntype, node_shader_gpu_bsdf_toon); + + nodeRegisterType(&ntype); +} |