diff options
Diffstat (limited to 'intern/cycles/kernel/osl')
-rw-r--r-- | intern/cycles/kernel/osl/osl_closures.cpp | 13 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_closures.h | 50 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_shader.cpp | 21 |
3 files changed, 77 insertions, 7 deletions
diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp index 340e4492584..a96c0e2b1fb 100644 --- a/intern/cycles/kernel/osl/osl_closures.cpp +++ b/intern/cycles/kernel/osl/osl_closures.cpp @@ -55,6 +55,7 @@ #include "closure/bsdf_westin.h" #include "closure/bsdf_toon.h" #include "closure/bsdf_hair.h" +#include "closure/volume.h" CCL_NAMESPACE_BEGIN @@ -169,6 +170,13 @@ BSDF_CLOSURE_CLASS_BEGIN(HairTransmission, hair_transmission, hair_transmission, #endif BSDF_CLOSURE_CLASS_END(HairTransmission, hair_transmission) +VOLUME_CLOSURE_CLASS_BEGIN(VolumeHenyeyGreenstein, henyey_greenstein, LABEL_VOLUME_SCATTER) + CLOSURE_FLOAT_PARAM(VolumeHenyeyGreensteinClosure, sc.data0), +VOLUME_CLOSURE_CLASS_END(VolumeHenyeyGreenstein, henyey_greenstein) + +VOLUME_CLOSURE_CLASS_BEGIN(VolumeAbsorption, absorption, LABEL_SINGULAR) +VOLUME_CLOSURE_CLASS_END(VolumeAbsorption, absorption) + /* Registration */ static void register_closure(OSL::ShadingSystem *ss, const char *name, int id, OSL::ClosureParam *params, OSL::PrepareClosureFunc prepare) @@ -248,6 +256,11 @@ void OSLShader::register_closures(OSLShadingSystem *ss_) bsdf_hair_reflection_params(), bsdf_hair_reflection_prepare); register_closure(ss, "hair_transmission", id++, bsdf_hair_transmission_params(), bsdf_hair_transmission_prepare); + + register_closure(ss, "henyey_greenstein", id++, + volume_henyey_greenstein_params(), volume_henyey_greenstein_prepare); + register_closure(ss, "absorption", id++, + volume_absorption_params(), volume_absorption_prepare); } CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/osl/osl_closures.h b/intern/cycles/kernel/osl/osl_closures.h index b6c38e01b23..f2f79f80fdf 100644 --- a/intern/cycles/kernel/osl/osl_closures.h +++ b/intern/cycles/kernel/osl/osl_closures.h @@ -54,6 +54,7 @@ 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(); +OSL::ClosureParam *closure_henyey_greenstein_volume_params(); void closure_emission_prepare(OSL::RendererServices *, int id, void *data); void closure_background_prepare(OSL::RendererServices *, int id, void *data); @@ -65,6 +66,7 @@ void closure_westin_backscatter_prepare(OSL::RendererServices *, int id, void *d void closure_westin_sheen_prepare(OSL::RendererServices *, int id, void *data); void closure_bssrdf_cubic_prepare(OSL::RendererServices *, int id, void *data); void closure_bssrdf_gaussian_prepare(OSL::RendererServices *, int id, void *data); +void closure_henyey_greenstein_volume_prepare(OSL::RendererServices *, int id, void *data); #define CCLOSURE_PREPARE(name, classname) \ void name(RendererServices *, int id, void *data) \ @@ -186,6 +188,54 @@ static ClosureParam *bsdf_##lower##_params() \ \ CCLOSURE_PREPARE_STATIC(bsdf_##lower##_prepare, Upper##Closure) + +/* Volume */ + +class CVolumeClosure : public CClosurePrimitive { +public: + ShaderClosure sc; + + CVolumeClosure(int scattering) : CClosurePrimitive(Volume), + m_scattering_label(scattering), m_shaderdata_flag(0) + { memset(&sc, 0, sizeof(sc)); } + ~CVolumeClosure() { } + + int scattering() const { return m_scattering_label; } + int shaderdata_flag() const { return m_shaderdata_flag; } + +protected: + int m_scattering_label; + int m_shaderdata_flag; +}; + +#define VOLUME_CLOSURE_CLASS_BEGIN(Upper, lower, TYPE) \ +\ +class Upper##Closure : public CVolumeClosure { \ +public: \ + Upper##Closure() : CVolumeClosure(TYPE) {} \ +\ + void setup() \ + { \ + sc.prim = NULL; \ + m_shaderdata_flag = volume_##lower##_setup(&sc); \ + } \ +}; \ +\ +static ClosureParam *volume_##lower##_params() \ +{ \ + static ClosureParam params[] = { + +/* parameters */ + +#define VOLUME_CLOSURE_CLASS_END(Upper, lower) \ + CLOSURE_STRING_KEYPARAM("label"), \ + CLOSURE_FINISH_PARAM(Upper##Closure) \ + }; \ + return params; \ +} \ +\ +CCLOSURE_PREPARE_STATIC(volume_##lower##_prepare, Upper##Closure) + CCL_NAMESPACE_END #endif /* __OSL_CLOSURES_H__ */ diff --git a/intern/cycles/kernel/osl/osl_shader.cpp b/intern/cycles/kernel/osl/osl_shader.cpp index b0461013239..4358d3f2e76 100644 --- a/intern/cycles/kernel/osl/osl_shader.cpp +++ b/intern/cycles/kernel/osl/osl_shader.cpp @@ -187,7 +187,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag, #endif /* add */ - if(sc.sample_weight > 1e-5f && sd->num_closure < MAX_CLOSURE) { + if(sc.sample_weight > CLOSURE_WEIGHT_CUTOFF && sd->num_closure < MAX_CLOSURE) { sd->closure[sd->num_closure++] = sc; sd->flag |= bsdf->shaderdata_flag(); } @@ -243,7 +243,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag, CBSSRDFClosure *bssrdf = (CBSSRDFClosure *)prim; float sample_weight = fabsf(average(weight)); - if(sample_weight > 1e-5f && sd->num_closure+2 < MAX_CLOSURE) { + if(sample_weight > CLOSURE_WEIGHT_CUTOFF && sd->num_closure+2 < MAX_CLOSURE) { sc.sample_weight = sample_weight; sc.type = bssrdf->sc.type; @@ -401,18 +401,21 @@ static void flatten_volume_closure_tree(ShaderData *sd, switch (prim->category) { case CClosurePrimitive::Volume: { + CVolumeClosure *volume = (CVolumeClosure *)prim; /* sample weight */ float sample_weight = fabsf(average(weight)); sc.sample_weight = sample_weight; - sc.type = CLOSURE_VOLUME_ID; - sc.data0 = 0.0f; - sc.data1 = 0.0f; - sc.prim = NULL; + sc.type = volume->sc.type; + sc.data0 = volume->sc.data0; + sc.data1 = volume->sc.data1; /* add */ - if(sc.sample_weight > 1e-5f && sd->num_closure < MAX_CLOSURE) + if(sc.sample_weight > CLOSURE_WEIGHT_CUTOFF && + sd->num_closure < MAX_CLOSURE) { sd->closure[sd->num_closure++] = sc; + sd->flag |= volume->shaderdata_flag(); + } break; } case CClosurePrimitive::Holdout: @@ -451,6 +454,10 @@ void OSLShader::eval_volume(KernelGlobals *kg, ShaderData *sd, float randb, int if (kg->osl->volume_state[shader]) ss->execute(*octx, *(kg->osl->volume_state[shader]), *globals); + + /* flatten closure tree */ + sd->num_closure = 0; + sd->randb_closure = randb; if (globals->Ci) flatten_volume_closure_tree(sd, globals->Ci); |