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
path: root/intern
diff options
context:
space:
mode:
authorThomas Dinges <blender@dingto.org>2013-05-23 21:45:20 +0400
committerThomas Dinges <blender@dingto.org>2013-05-23 21:45:20 +0400
commit99b325cebf41054f046d98a7dcf9aea74e165f56 (patch)
tree208b201551a5a3e79d59f7e4a2585ae866025ec1 /intern
parent3b0cc9cfd74de9594b1388694ee13a94ba36b91b (diff)
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
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/blender/blender_shader.cpp13
-rw-r--r--intern/cycles/kernel/closure/bsdf.h27
-rw-r--r--intern/cycles/kernel/closure/bsdf_toon.h14
-rw-r--r--intern/cycles/kernel/osl/CMakeLists.txt1
-rw-r--r--intern/cycles/kernel/osl/bsdf_toon.cpp179
-rw-r--r--intern/cycles/kernel/osl/osl_closures.cpp21
-rw-r--r--intern/cycles/kernel/osl/osl_closures.h4
-rw-r--r--intern/cycles/kernel/shaders/CMakeLists.txt1
-rw-r--r--intern/cycles/kernel/shaders/node_toon_bsdf.osl34
-rw-r--r--intern/cycles/kernel/shaders/stdosl.h2
-rw-r--r--intern/cycles/kernel/svm/svm_closure.h17
-rw-r--r--intern/cycles/kernel/svm/svm_types.h2
-rw-r--r--intern/cycles/render/nodes.cpp35
-rw-r--r--intern/cycles/render/nodes.h8
14 files changed, 161 insertions, 197 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)