diff options
Diffstat (limited to 'intern/cycles/kernel/osl')
-rw-r--r-- | intern/cycles/kernel/osl/osl_bssrdf.cpp | 31 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_bssrdf.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_closures.cpp | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_closures.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_shader.cpp | 1 |
5 files changed, 34 insertions, 6 deletions
diff --git a/intern/cycles/kernel/osl/osl_bssrdf.cpp b/intern/cycles/kernel/osl/osl_bssrdf.cpp index 7405b0be567..975967c0bbb 100644 --- a/intern/cycles/kernel/osl/osl_bssrdf.cpp +++ b/intern/cycles/kernel/osl/osl_bssrdf.cpp @@ -56,10 +56,8 @@ public: void setup() { - sc.type = CLOSURE_BSSRDF_COMPATIBLE_ID; - sc.prim = NULL; + sc.type = CLOSURE_BSSRDF_CUBIC_ID; sc.data0 = fabsf(average(radius)); - sc.data1 = 0.0f; // XXX texture blur } bool mergeable(const ClosurePrimitive *other) const @@ -85,6 +83,19 @@ ClosureParam *closure_bssrdf_cubic_params() return params; } +ClosureParam *closure_bssrdf_cubic_extended_params() +{ + static ClosureParam params[] = { + CLOSURE_FLOAT3_PARAM(CubicBSSRDFClosure, sc.N), + CLOSURE_FLOAT3_PARAM(CubicBSSRDFClosure, radius), + CLOSURE_FLOAT_PARAM(CubicBSSRDFClosure, sc.data1), + CLOSURE_FLOAT_PARAM(CubicBSSRDFClosure, sc.T.x), + CLOSURE_STRING_KEYPARAM("label"), + CLOSURE_FINISH_PARAM(CubicBSSRDFClosure) + }; + return params; +} + CLOSURE_PREPARE(closure_bssrdf_cubic_prepare, CubicBSSRDFClosure) /* Gaussian */ @@ -97,9 +108,7 @@ public: void setup() { sc.type = CLOSURE_BSSRDF_GAUSSIAN_ID; - sc.prim = NULL; sc.data0 = fabsf(average(radius)); - sc.data1 = 0.0f; // XXX texture blurring! } bool mergeable(const ClosurePrimitive *other) const @@ -125,6 +134,18 @@ ClosureParam *closure_bssrdf_gaussian_params() return params; } +ClosureParam *closure_bssrdf_gaussian_extended_params() +{ + static ClosureParam params[] = { + CLOSURE_FLOAT3_PARAM(GaussianBSSRDFClosure, sc.N), + CLOSURE_FLOAT3_PARAM(GaussianBSSRDFClosure, radius), + CLOSURE_FLOAT_PARAM(GaussianBSSRDFClosure, sc.data1), + CLOSURE_STRING_KEYPARAM("label"), + CLOSURE_FINISH_PARAM(GaussianBSSRDFClosure) + }; + return params; +} + CLOSURE_PREPARE(closure_bssrdf_gaussian_prepare, GaussianBSSRDFClosure) CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/osl/osl_bssrdf.h b/intern/cycles/kernel/osl/osl_bssrdf.h index ee9fc7c4ac5..fc1a4c587cc 100644 --- a/intern/cycles/kernel/osl/osl_bssrdf.h +++ b/intern/cycles/kernel/osl/osl_bssrdf.h @@ -48,7 +48,7 @@ public: ShaderClosure sc; float3 radius; - CBSSRDFClosure() : OSL::ClosurePrimitive(BSSRDF) { } + CBSSRDFClosure() : OSL::ClosurePrimitive(BSSRDF) { memset(&sc, 0, sizeof(sc)); } ~CBSSRDFClosure() { } int scattering() const { return LABEL_DIFFUSE; } diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp index c03e50d4313..6a3f27fb7b1 100644 --- a/intern/cycles/kernel/osl/osl_closures.cpp +++ b/intern/cycles/kernel/osl/osl_closures.cpp @@ -221,6 +221,10 @@ void OSLShader::register_closures(OSLShadingSystem *ss_) closure_bssrdf_cubic_params(), closure_bssrdf_cubic_prepare); register_closure(ss, "bssrdf_gaussian", id++, closure_bssrdf_gaussian_params(), closure_bssrdf_gaussian_prepare); + register_closure(ss, "bssrdf_cubic", id++, + closure_bssrdf_cubic_extended_params(), closure_bssrdf_cubic_prepare); + register_closure(ss, "bssrdf_gaussian", id++, + closure_bssrdf_gaussian_extended_params(), closure_bssrdf_gaussian_prepare); } CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/osl/osl_closures.h b/intern/cycles/kernel/osl/osl_closures.h index e3a7e890597..6632c2c57e5 100644 --- a/intern/cycles/kernel/osl/osl_closures.h +++ b/intern/cycles/kernel/osl/osl_closures.h @@ -52,6 +52,8 @@ OSL::ClosureParam *closure_westin_backscatter_params(); OSL::ClosureParam *closure_westin_sheen_params(); OSL::ClosureParam *closure_bssrdf_cubic_params(); OSL::ClosureParam *closure_bssrdf_gaussian_params(); +OSL::ClosureParam *closure_bssrdf_cubic_extended_params(); +OSL::ClosureParam *closure_bssrdf_gaussian_extended_params(); void closure_emission_prepare(OSL::RendererServices *, int id, void *data); void closure_background_prepare(OSL::RendererServices *, int id, void *data); diff --git a/intern/cycles/kernel/osl/osl_shader.cpp b/intern/cycles/kernel/osl/osl_shader.cpp index c55f36bcc9d..d2ccb7da84c 100644 --- a/intern/cycles/kernel/osl/osl_shader.cpp +++ b/intern/cycles/kernel/osl/osl_shader.cpp @@ -239,6 +239,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag, sc.type = bssrdf->sc.type; sc.N = bssrdf->sc.N; sc.data1 = bssrdf->sc.data1; + sc.T.x = bssrdf->sc.T.x; sc.prim = NULL; /* disable in case of diffuse ancestor, can't see it well then and |