Cycles / OSL:
authorThomas Dinges <blender@dingto.org>
Sat, 18 May 2013 14:36:03 +0000 (14:36 +0000)
committerThomas Dinges <blender@dingto.org>
Sat, 18 May 2013 14:36:03 +0000 (14:36 +0000)
* Added Westin Sheen and Westin Backscatter closures for testing, useful for Cloth like effects.

Only available via OSL, added an example OSL shader to the Templates (Text Editor).

intern/cycles/kernel/closure/bsdf.h
intern/cycles/kernel/closure/bsdf_westin.h
intern/cycles/kernel/osl/CMakeLists.txt
intern/cycles/kernel/osl/bsdf_westin.cpp [new file with mode: 0644]
intern/cycles/kernel/osl/osl_closures.cpp
intern/cycles/kernel/osl/osl_closures.h
intern/cycles/kernel/shaders/stdosl.h
release/scripts/templates_osl/westin_closure.osl [new file with mode: 0644]

index 6403606c2dfd8d68efe2825e332cc469ceee3389..76b80ba9d86c1c5a70bbc235fe170b5833a28af2 100644 (file)
@@ -96,14 +96,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;
                        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_WESTIN_BACKSCATTER_ID:
+               /*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);
                        break;
                case CLOSURE_BSDF_WESTIN_SHEEN_ID:
                        label = bsdf_westin_sheen_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv,
                                eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
                        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);
                        break;
                case CLOSURE_BSDF_WESTIN_SHEEN_ID:
                        label = bsdf_westin_sheen_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;
+                       break;*/
 #endif
                default:
                        label = LABEL_NONE;
 #endif
                default:
                        label = LABEL_NONE;
@@ -165,12 +165,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_ASHIKHMIN_VELVET_ID:
                                eval = bsdf_ashikhmin_velvet_eval_reflect(sc, sd->I, omega_in, pdf);
                                break;
-                       case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID:
+                       /*case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID:
                                eval = bsdf_westin_backscatter_eval_reflect(sc, sd->I, omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_WESTIN_SHEEN_ID:
                                eval = bsdf_westin_sheen_eval_reflect(sc, sd->I, omega_in, pdf);
                                eval = bsdf_westin_backscatter_eval_reflect(sc, sd->I, omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_WESTIN_SHEEN_ID:
                                eval = bsdf_westin_sheen_eval_reflect(sc, sd->I, omega_in, pdf);
-                               break;
+                               break;*/
 #endif
                        default:
                                eval = make_float3(0.0f, 0.0f, 0.0f);
 #endif
                        default:
                                eval = make_float3(0.0f, 0.0f, 0.0f);
@@ -214,12 +214,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_ASHIKHMIN_VELVET_ID:
                                eval = bsdf_ashikhmin_velvet_eval_transmit(sc, sd->I, omega_in, pdf);
                                break;
-                       case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID:
+                       /*case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID:
                                eval = bsdf_westin_backscatter_eval_transmit(sc, sd->I, omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_WESTIN_SHEEN_ID:
                                eval = bsdf_westin_sheen_eval_transmit(sc, sd->I, omega_in, pdf);
                                eval = bsdf_westin_backscatter_eval_transmit(sc, sd->I, omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_WESTIN_SHEEN_ID:
                                eval = bsdf_westin_sheen_eval_transmit(sc, sd->I, omega_in, pdf);
-                               break;
+                               break;*/
 #endif
                        default:
                                eval = make_float3(0.0f, 0.0f, 0.0f);
 #endif
                        default:
                                eval = make_float3(0.0f, 0.0f, 0.0f);
@@ -281,12 +281,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_ASHIKHMIN_VELVET_ID:
                        bsdf_ashikhmin_velvet_blur(sc, roughness);
                        break;
-               case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID:
+               /*case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID:
                        bsdf_westin_backscatter_blur(sc, roughness);
                        break;
                case CLOSURE_BSDF_WESTIN_SHEEN_ID:
                        bsdf_westin_sheen_blur(sc, roughness);
                        bsdf_westin_backscatter_blur(sc, roughness);
                        break;
                case CLOSURE_BSDF_WESTIN_SHEEN_ID:
                        bsdf_westin_sheen_blur(sc, roughness);
-                       break;
+                       break;*/
 #endif
                default:
                        break;
 #endif
                default:
                        break;
index 9ad1c17571392cdb5696081228705a1cf8a92427..e1a6b031d5e18267b26b56e6d0dbe0f6627f258b 100644 (file)
@@ -118,9 +118,8 @@ __device int bsdf_westin_backscatter_sample(const ShaderClosure *sc, float3 Ng,
 
 __device int bsdf_westin_sheen_setup(ShaderClosure *sc)
 {
 
 __device int bsdf_westin_sheen_setup(ShaderClosure *sc)
 {
-       float edginess = sc->data0;
+       /* float edginess = sc->data0; */
        sc->type = CLOSURE_BSDF_WESTIN_SHEEN_ID;
        sc->type = CLOSURE_BSDF_WESTIN_SHEEN_ID;
-       sc->data0 = edginess;
        return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY;
 }
 
        return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY;
 }
 
index 0ce40eda4df143725b84bc39813340431251749f..be1e1c68bc9c3874205255094e64c8c74181d336 100644 (file)
@@ -17,6 +17,7 @@ set(SRC
        bsdf_diffuse_ramp.cpp
        bsdf_phong_ramp.cpp
        bsdf_toon.cpp
        bsdf_diffuse_ramp.cpp
        bsdf_phong_ramp.cpp
        bsdf_toon.cpp
+       bsdf_westin.cpp
        emissive.cpp
        osl_bssrdf.cpp
        osl_closures.cpp
        emissive.cpp
        osl_bssrdf.cpp
        osl_closures.cpp
diff --git a/intern/cycles/kernel/osl/bsdf_westin.cpp b/intern/cycles/kernel/osl/bsdf_westin.cpp
new file mode 100644 (file)
index 0000000..d8129b1
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * 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_westin.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+/* WESTIN BACKSCATTER */
+
+class WestinBackscatterClosure : public CBSDFClosure {
+public:
+       WestinBackscatterClosure() : CBSDFClosure(LABEL_GLOSSY) {}
+
+       size_t memsize() const { return sizeof(*this); }
+       const char *name() const { return "westin_backscatter"; }
+
+       void setup()
+       {
+               sc.prim = this;
+               m_shaderdata_flag = bsdf_westin_backscatter_setup(&sc);
+       }
+
+       bool mergeable(const ClosurePrimitive *other) const
+       {
+               return false;
+       }
+
+       void blur(float roughness)
+       {
+               bsdf_westin_backscatter_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_westin_backscatter_eval_reflect(&sc, omega_out, omega_in, &pdf);
+       }
+
+       float3 eval_transmit(const float3 &omega_out, const float3 &omega_in, float& pdf) const
+       {
+               return bsdf_westin_backscatter_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_westin_backscatter_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_westin_backscatter_params()
+{
+       static ClosureParam params[] = {
+               CLOSURE_FLOAT3_PARAM(WestinBackscatterClosure, sc.N),
+               CLOSURE_FLOAT_PARAM(WestinBackscatterClosure, sc.data0),
+               CLOSURE_STRING_KEYPARAM("label"),
+           CLOSURE_FINISH_PARAM(WestinBackscatterClosure)
+       };
+       return params;
+}
+
+CLOSURE_PREPARE(closure_westin_backscatter_prepare, WestinBackscatterClosure)
+
+/* WESTIN SHEEN */
+
+class WestinSheenClosure : public CBSDFClosure {
+public:
+       WestinSheenClosure() : CBSDFClosure(LABEL_DIFFUSE) {}
+
+       size_t memsize() const { return sizeof(*this); }
+       const char *name() const { return "westin_sheen"; }
+
+       void setup()
+       {
+               sc.prim = this;
+               m_shaderdata_flag = bsdf_westin_sheen_setup(&sc);
+       }
+
+       bool mergeable(const ClosurePrimitive *other) const
+       {
+               return false;
+       }
+
+       void blur(float roughness)
+       {
+               bsdf_westin_sheen_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_westin_sheen_eval_reflect(&sc, omega_out, omega_in, &pdf);
+       }
+
+       float3 eval_transmit(const float3 &omega_out, const float3 &omega_in, float& pdf) const
+       {
+               return bsdf_westin_sheen_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_westin_sheen_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_westin_sheen_params()
+{
+       static ClosureParam params[] = {
+               CLOSURE_FLOAT3_PARAM(WestinSheenClosure, sc.N),
+               CLOSURE_FLOAT_PARAM(WestinSheenClosure, sc.data0),
+               CLOSURE_STRING_KEYPARAM("label"),
+           CLOSURE_FINISH_PARAM(WestinSheenClosure)
+       };
+       return params;
+}
+
+CLOSURE_PREPARE(closure_westin_sheen_prepare, WestinSheenClosure)
+
+
+CCL_NAMESPACE_END
+
index 9ce11ca120713999e8d496f88d3931fb055ea3e6..b477b18608051414ea40761d505d0b4897bce674 100644 (file)
@@ -181,10 +181,6 @@ 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);
                bsdf_ward_params(), bsdf_ward_prepare);
        register_closure(ss, "ashikhmin_velvet", id++,
                bsdf_ashikhmin_velvet_params(), bsdf_ashikhmin_velvet_prepare);
-       register_closure(ss, "westin_backscatter", id++,
-               bsdf_westin_backscatter_params(), bsdf_westin_backscatter_prepare);
-       register_closure(ss, "westin_sheen", id++,
-               bsdf_westin_sheen_params(), bsdf_westin_sheen_prepare);
        register_closure(ss, "emission", id++,
                closure_emission_params(), closure_emission_prepare);
        register_closure(ss, "background", id++,
        register_closure(ss, "emission", id++,
                closure_emission_params(), closure_emission_prepare);
        register_closure(ss, "background", id++,
@@ -201,6 +197,10 @@ void OSLShader::register_closures(OSLShadingSystem *ss_)
                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);
                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, "westin_backscatter", id++,
+               closure_westin_backscatter_params(), closure_westin_backscatter_prepare);
+       register_closure(ss, "westin_sheen", id++,
+               closure_westin_sheen_params(), closure_westin_sheen_prepare);
        register_closure(ss, "bssrdf_cubic", id++,
                closure_bssrdf_params(), closure_bssrdf_prepare);
 }
        register_closure(ss, "bssrdf_cubic", id++,
                closure_bssrdf_params(), closure_bssrdf_prepare);
 }
index d0e25bb2b0c45659a4704580166b12498d99cda7..79b9b378d127fbfa9fbc736a37747cc0a2751fb4 100644 (file)
@@ -51,6 +51,8 @@ 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_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();
 
 void closure_emission_prepare(OSL::RendererServices *, int id, void *data);
 OSL::ClosureParam *closure_bssrdf_params();
 
 void closure_emission_prepare(OSL::RendererServices *, int id, void *data);
@@ -61,6 +63,8 @@ void closure_bsdf_diffuse_ramp_prepare(OSL::RendererServices *, int id, void *da
 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_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);
 
 enum {
 void closure_bssrdf_prepare(OSL::RendererServices *, int id, void *data);
 
 enum {
index 010d6ddd200e62264d20cdedba48517d89b62ac4..9c9e04ab7212a741e65fc736607cea0f528e5df8 100644 (file)
@@ -447,6 +447,8 @@ 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 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 westin_backscatter(normal N, float roughness) BUILTIN;
+closure color westin_sheen(normal N, float edginess) BUILTIN;
 closure color translucent(normal N) BUILTIN;
 closure color reflection(normal N) BUILTIN;
 closure color refraction(normal N, float eta) BUILTIN;
 closure color translucent(normal N) BUILTIN;
 closure color reflection(normal N) BUILTIN;
 closure color refraction(normal N, float eta) BUILTIN;
diff --git a/release/scripts/templates_osl/westin_closure.osl b/release/scripts/templates_osl/westin_closure.osl
new file mode 100644 (file)
index 0000000..8d90f3a
--- /dev/null
@@ -0,0 +1,12 @@
+
+shader node_westin_bsdf(
+       color Color = 0.8,
+       float Roughness = 0.5,
+       float Edginess = 0.2,
+       normal Normal = N,
+       output closure color Sheen = 0,
+       output closure color Backscatter = 0)
+{
+       Sheen = Color * westin_sheen(Normal, Roughness);
+       Backscatter = Color * westin_backscatter(Normal, Edginess);
+}
\ No newline at end of file