From 799779d432309e518922d23e3a1d1b5baaece71d Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Fri, 15 Jun 2018 11:03:29 +0200 Subject: Cycles: change Ambient Occlusion shader to output colors. This means the shader can now be used for procedural texturing. New settings on the node are Samples, Inside, Local Only and Distance. Original patch by Lukas with further changes by Brecht. Differential Revision: https://developer.blender.org/D3479 --- intern/cycles/kernel/osl/background.cpp | 26 -------------------------- intern/cycles/kernel/osl/osl_closures.cpp | 2 -- intern/cycles/kernel/osl/osl_closures.h | 2 -- intern/cycles/kernel/osl/osl_services.cpp | 20 ++++++++++++++++++++ intern/cycles/kernel/osl/osl_services.h | 1 + 5 files changed, 21 insertions(+), 30 deletions(-) (limited to 'intern/cycles/kernel/osl') diff --git a/intern/cycles/kernel/osl/background.cpp b/intern/cycles/kernel/osl/background.cpp index 8fff19407d9..30a9e84c399 100644 --- a/intern/cycles/kernel/osl/background.cpp +++ b/intern/cycles/kernel/osl/background.cpp @@ -74,21 +74,6 @@ public: } }; -/// ambient occlusion closure -/// -/// We only have a ambient occlusion closure for the shaders -/// to return a color in ambient occlusion shaders. No methods, -/// only the weight is taking into account -/// -class AmbientOcclusionClosure : public CClosurePrimitive { -public: - void setup(ShaderData *sd, int /* path_flag */, float3 weight) - { - closure_alloc(sd, sizeof(ShaderClosure), CLOSURE_AMBIENT_OCCLUSION_ID, weight); - sd->flag |= SD_AO; - } -}; - ClosureParam *closure_background_params() { static ClosureParam params[] = { @@ -110,16 +95,5 @@ ClosureParam *closure_holdout_params() CCLOSURE_PREPARE(closure_holdout_prepare, HoldoutClosure) -ClosureParam *closure_ambient_occlusion_params() -{ - static ClosureParam params[] = { - CLOSURE_STRING_KEYPARAM(AmbientOcclusionClosure, label, "label"), - CLOSURE_FINISH_PARAM(AmbientOcclusionClosure) - }; - return params; -} - -CCLOSURE_PREPARE(closure_ambient_occlusion_prepare, AmbientOcclusionClosure) - CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp index ee16ddaf0fd..6a1e52d7d16 100644 --- a/intern/cycles/kernel/osl/osl_closures.cpp +++ b/intern/cycles/kernel/osl/osl_closures.cpp @@ -310,8 +310,6 @@ void OSLShader::register_closures(OSLShadingSystem *ss_) closure_background_params(), closure_background_prepare); register_closure(ss, "holdout", id++, closure_holdout_params(), closure_holdout_prepare); - register_closure(ss, "ambient_occlusion", id++, - closure_ambient_occlusion_params(), closure_ambient_occlusion_prepare); register_closure(ss, "diffuse_ramp", id++, closure_bsdf_diffuse_ramp_params(), closure_bsdf_diffuse_ramp_prepare); register_closure(ss, "phong_ramp", id++, diff --git a/intern/cycles/kernel/osl/osl_closures.h b/intern/cycles/kernel/osl/osl_closures.h index dca7e74f154..68dfa9a4650 100644 --- a/intern/cycles/kernel/osl/osl_closures.h +++ b/intern/cycles/kernel/osl/osl_closures.h @@ -45,7 +45,6 @@ CCL_NAMESPACE_BEGIN OSL::ClosureParam *closure_emission_params(); OSL::ClosureParam *closure_background_params(); 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_transparent_params(); @@ -65,7 +64,6 @@ OSL::ClosureParam *closure_bsdf_principled_clearcoat_params(); void closure_emission_prepare(OSL::RendererServices *, int id, void *data); void closure_background_prepare(OSL::RendererServices *, int id, void *data); 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_transparent_prepare(OSL::RendererServices *, int id, void *data); diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index 1aca54d2ad5..4b7a4cb34b7 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -125,6 +125,7 @@ ustring OSLRenderServices::u_u("u"); ustring OSLRenderServices::u_v("v"); ustring OSLRenderServices::u_empty; ustring OSLRenderServices::u_at_bevel("@bevel"); +ustring OSLRenderServices::u_at_ao("@ao"); OSLRenderServices::OSLRenderServices() { @@ -957,6 +958,25 @@ bool OSLRenderServices::texture(ustring filename, status = true; } } + else if(filename == u_at_ao) { + /* AO shader hack. */ + PathState *state = sd->osl_path_state; + int num_samples = (int)s; + float radius = t; + float3 N = make_float3(dsdx, dtdx, dsdy); + int flags = 0; + if((int)dtdy) { + flags |= NODE_AO_INSIDE; + } + if((int)options.sblur) { + flags |= NODE_AO_ONLY_LOCAL; + } + if((int)options.tblur) { + flags |= NODE_AO_GLOBAL_RADIUS; + } + result[0] = svm_ao(kg, sd, N, state, radius, num_samples, flags); + status = true; + } else if(filename[1] == 'l') { /* IES light. */ int slot = atoi(filename.c_str() + 2); diff --git a/intern/cycles/kernel/osl/osl_services.h b/intern/cycles/kernel/osl/osl_services.h index d96048e26f2..1a40e2ece2b 100644 --- a/intern/cycles/kernel/osl/osl_services.h +++ b/intern/cycles/kernel/osl/osl_services.h @@ -182,6 +182,7 @@ public: static ustring u_v; static ustring u_empty; static ustring u_at_bevel; + static ustring u_at_ao; private: KernelGlobals *kernel_globals; -- cgit v1.2.3