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
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/kernel/osl')
-rw-r--r--intern/cycles/kernel/osl/background.cpp33
-rw-r--r--intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp17
-rw-r--r--intern/cycles/kernel/osl/bsdf_phong_ramp.cpp17
-rw-r--r--intern/cycles/kernel/osl/emissive.cpp15
-rw-r--r--intern/cycles/kernel/osl/osl_bssrdf.cpp32
-rw-r--r--intern/cycles/kernel/osl/osl_bssrdf.h8
-rw-r--r--intern/cycles/kernel/osl/osl_closures.cpp25
-rw-r--r--intern/cycles/kernel/osl/osl_closures.h56
-rw-r--r--intern/cycles/kernel/osl/osl_services.cpp51
-rw-r--r--intern/cycles/kernel/osl/osl_services.h7
-rw-r--r--intern/cycles/kernel/osl/osl_shader.cpp65
-rw-r--r--intern/cycles/kernel/osl/osl_shader.h5
12 files changed, 149 insertions, 182 deletions
diff --git a/intern/cycles/kernel/osl/background.cpp b/intern/cycles/kernel/osl/background.cpp
index eed4446cddc..2facced0914 100644
--- a/intern/cycles/kernel/osl/background.cpp
+++ b/intern/cycles/kernel/osl/background.cpp
@@ -46,14 +46,9 @@ using namespace OSL;
/// to return a color in background shaders. No methods,
/// only the weight is taking into account
///
-class GenericBackgroundClosure : public OSL::BackgroundClosure {
+class GenericBackgroundClosure : public CClosurePrimitive {
public:
- GenericBackgroundClosure() {}
-
- void setup() {};
- size_t memsize() const { return sizeof(*this); }
- const char *name() const { return "background"; }
- void print_on(std::ostream &out) const { out << name() << " ()"; }
+ GenericBackgroundClosure() : CClosurePrimitive(Background) {}
};
/// Holdout closure
@@ -63,14 +58,9 @@ public:
/// point. No parameters, only the weight will be
/// used
///
-class HoldoutClosure : ClosurePrimitive {
+class HoldoutClosure : CClosurePrimitive {
public:
- HoldoutClosure () : ClosurePrimitive(Holdout) {}
-
- void setup() {};
- size_t memsize() const { return sizeof(*this); }
- const char *name() const { return "holdout"; }
- void print_on(std::ostream &out) const { out << name() << " ()"; }
+ HoldoutClosure () : CClosurePrimitive(Holdout) {}
};
/// ambient occlusion closure
@@ -79,14 +69,9 @@ public:
/// to return a color in ambient occlusion shaders. No methods,
/// only the weight is taking into account
///
-class AmbientOcclusionClosure : public ClosurePrimitive {
+class AmbientOcclusionClosure : public CClosurePrimitive {
public:
- AmbientOcclusionClosure () : ClosurePrimitive((ClosurePrimitive::Category)AmbientOcclusion) {}
-
- void setup() {};
- size_t memsize() const { return sizeof(*this); }
- const char *name() const { return "ambient_occlusion"; }
- void print_on(std::ostream &out) const { out << name() << " ()"; }
+ AmbientOcclusionClosure () : CClosurePrimitive(AmbientOcclusion) {}
};
ClosureParam *closure_background_params()
@@ -98,7 +83,7 @@ ClosureParam *closure_background_params()
return params;
}
-CLOSURE_PREPARE(closure_background_prepare, GenericBackgroundClosure)
+CCLOSURE_PREPARE(closure_background_prepare, GenericBackgroundClosure)
ClosureParam *closure_holdout_params()
{
@@ -108,7 +93,7 @@ ClosureParam *closure_holdout_params()
return params;
}
-CLOSURE_PREPARE(closure_holdout_prepare, HoldoutClosure)
+CCLOSURE_PREPARE(closure_holdout_prepare, HoldoutClosure)
ClosureParam *closure_ambient_occlusion_params()
{
@@ -119,7 +104,7 @@ ClosureParam *closure_ambient_occlusion_params()
return params;
}
-CLOSURE_PREPARE(closure_ambient_occlusion_prepare, AmbientOcclusionClosure)
+CCLOSURE_PREPARE(closure_ambient_occlusion_prepare, AmbientOcclusionClosure)
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp b/intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp
index a320bea118a..8f9c2efd470 100644
--- a/intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp
+++ b/intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp
@@ -46,12 +46,11 @@ using namespace OSL;
class DiffuseRampClosure : public CBSDFClosure {
public:
- DiffuseRampClosure() : CBSDFClosure(LABEL_DIFFUSE) {}
Color3 colors[8];
float3 fcolors[8];
- size_t memsize() const { return sizeof(*this); }
- const char *name() const { return "diffuse_ramp"; }
+ DiffuseRampClosure() : CBSDFClosure(LABEL_DIFFUSE)
+ {}
void setup()
{
@@ -62,21 +61,11 @@ public:
fcolors[i] = TO_FLOAT3(colors[i]);
}
- bool mergeable(const ClosurePrimitive *other) const
- {
- return false;
- }
-
void blur(float roughness)
{
bsdf_diffuse_ramp_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_ramp_eval_reflect(&sc, fcolors, omega_out, omega_in, &pdf);
@@ -109,7 +98,7 @@ ClosureParam *closure_bsdf_diffuse_ramp_params()
return params;
}
-CLOSURE_PREPARE(closure_bsdf_diffuse_ramp_prepare, DiffuseRampClosure)
+CCLOSURE_PREPARE(closure_bsdf_diffuse_ramp_prepare, DiffuseRampClosure)
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/osl/bsdf_phong_ramp.cpp b/intern/cycles/kernel/osl/bsdf_phong_ramp.cpp
index ef656ee7d5f..c5851747b54 100644
--- a/intern/cycles/kernel/osl/bsdf_phong_ramp.cpp
+++ b/intern/cycles/kernel/osl/bsdf_phong_ramp.cpp
@@ -45,12 +45,11 @@ using namespace OSL;
class PhongRampClosure : public CBSDFClosure {
public:
- PhongRampClosure() : CBSDFClosure(LABEL_GLOSSY) {}
Color3 colors[8];
float3 fcolors[8];
- size_t memsize() const { return sizeof(*this); }
- const char *name() const { return "phong_ramp"; }
+ PhongRampClosure() : CBSDFClosure(LABEL_GLOSSY)
+ {}
void setup()
{
@@ -61,21 +60,11 @@ public:
fcolors[i] = TO_FLOAT3(colors[i]);
}
- bool mergeable(const ClosurePrimitive *other) const
- {
- return false;
- }
-
void blur(float roughness)
{
bsdf_phong_ramp_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_phong_ramp_eval_reflect(&sc, fcolors, omega_out, omega_in, &pdf);
@@ -109,7 +98,7 @@ ClosureParam *closure_bsdf_phong_ramp_params()
return params;
}
-CLOSURE_PREPARE(closure_bsdf_phong_ramp_prepare, PhongRampClosure)
+CCLOSURE_PREPARE(closure_bsdf_phong_ramp_prepare, PhongRampClosure)
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/osl/emissive.cpp b/intern/cycles/kernel/osl/emissive.cpp
index 7d9fa81dbdd..02935542c56 100644
--- a/intern/cycles/kernel/osl/emissive.cpp
+++ b/intern/cycles/kernel/osl/emissive.cpp
@@ -50,18 +50,9 @@ using namespace OSL;
/// outer_angle limit. It can also behave as a lambertian emitter
/// if the provided angles are PI/2, which is the default
///
-class GenericEmissiveClosure : public EmissiveClosure {
+class GenericEmissiveClosure : public CClosurePrimitive {
public:
- GenericEmissiveClosure() { }
-
- void setup() {}
- size_t memsize() const { return sizeof(*this); }
- const char *name() const { return "emission"; }
-
- void print_on(std::ostream &out) const
- {
- out << name() << "()";
- }
+ GenericEmissiveClosure() : CClosurePrimitive(Emissive) { }
Color3 eval(const Vec3 &Ng, const Vec3 &omega_out) const
{
@@ -92,7 +83,7 @@ ClosureParam *closure_emission_params()
return params;
}
-CLOSURE_PREPARE(closure_emission_prepare, GenericEmissiveClosure)
+CCLOSURE_PREPARE(closure_emission_prepare, GenericEmissiveClosure)
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/osl/osl_bssrdf.cpp b/intern/cycles/kernel/osl/osl_bssrdf.cpp
index 975967c0bbb..94337290d20 100644
--- a/intern/cycles/kernel/osl/osl_bssrdf.cpp
+++ b/intern/cycles/kernel/osl/osl_bssrdf.cpp
@@ -51,24 +51,14 @@ using namespace OSL;
class CubicBSSRDFClosure : public CBSSRDFClosure {
public:
- size_t memsize() const { return sizeof(*this); }
- const char *name() const { return "bssrdf_cubic"; }
+ CubicBSSRDFClosure()
+ {}
void setup()
{
sc.type = CLOSURE_BSSRDF_CUBIC_ID;
sc.data0 = fabsf(average(radius));
}
-
- bool mergeable(const ClosurePrimitive *other) const
- {
- return false;
- }
-
- void print_on(std::ostream &out) const
- {
- out << name() << " ((" << sc.N[0] << ", " << sc.N[1] << ", " << sc.N[2] << "))";
- }
};
ClosureParam *closure_bssrdf_cubic_params()
@@ -96,30 +86,20 @@ ClosureParam *closure_bssrdf_cubic_extended_params()
return params;
}
-CLOSURE_PREPARE(closure_bssrdf_cubic_prepare, CubicBSSRDFClosure)
+CCLOSURE_PREPARE(closure_bssrdf_cubic_prepare, CubicBSSRDFClosure)
/* Gaussian */
class GaussianBSSRDFClosure : public CBSSRDFClosure {
public:
- size_t memsize() const { return sizeof(*this); }
- const char *name() const { return "bssrdf_gaussian"; }
+ GaussianBSSRDFClosure()
+ {}
void setup()
{
sc.type = CLOSURE_BSSRDF_GAUSSIAN_ID;
sc.data0 = fabsf(average(radius));
}
-
- bool mergeable(const ClosurePrimitive *other) const
- {
- return false;
- }
-
- void print_on(std::ostream &out) const
- {
- out << name() << " ((" << sc.N[0] << ", " << sc.N[1] << ", " << sc.N[2] << "))";
- }
};
ClosureParam *closure_bssrdf_gaussian_params()
@@ -146,7 +126,7 @@ ClosureParam *closure_bssrdf_gaussian_extended_params()
return params;
}
-CLOSURE_PREPARE(closure_bssrdf_gaussian_prepare, GaussianBSSRDFClosure)
+CCLOSURE_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 fc1a4c587cc..6aee2c28ea8 100644
--- a/intern/cycles/kernel/osl/osl_bssrdf.h
+++ b/intern/cycles/kernel/osl/osl_bssrdf.h
@@ -37,20 +37,20 @@
#include <OSL/oslexec.h>
#include <OSL/genclosure.h>
+#include "osl_closures.h"
+
#include "kernel_types.h"
#include "util_types.h"
CCL_NAMESPACE_BEGIN
-class CBSSRDFClosure : public OSL::ClosurePrimitive {
+class CBSSRDFClosure : public CClosurePrimitive {
public:
ShaderClosure sc;
float3 radius;
- CBSSRDFClosure() : OSL::ClosurePrimitive(BSSRDF) { memset(&sc, 0, sizeof(sc)); }
- ~CBSSRDFClosure() { }
-
+ CBSSRDFClosure() : CClosurePrimitive(BSSRDF) { }
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 221406a1716..340e4492584 100644
--- a/intern/cycles/kernel/osl/osl_closures.cpp
+++ b/intern/cycles/kernel/osl/osl_closures.cpp
@@ -171,25 +171,16 @@ BSDF_CLOSURE_CLASS_END(HairTransmission, hair_transmission)
/* Registration */
-static void generic_closure_setup(OSL::RendererServices *, int id, void *data)
-{
- assert(data);
- OSL::ClosurePrimitive *prim = (OSL::ClosurePrimitive *)data;
- prim->setup();
-}
-
-static bool generic_closure_compare(int id, const void *dataA, const void *dataB)
-{
- assert(dataA && dataB);
-
- OSL::ClosurePrimitive *primA = (OSL::ClosurePrimitive *)dataA;
- OSL::ClosurePrimitive *primB = (OSL::ClosurePrimitive *)dataB;
- return primA->mergeable(primB);
-}
-
static void register_closure(OSL::ShadingSystem *ss, const char *name, int id, OSL::ClosureParam *params, OSL::PrepareClosureFunc prepare)
{
- ss->register_closure(name, id, params, prepare, generic_closure_setup, generic_closure_compare);
+ /* optimization: it's possible to not use a prepare function at all and
+ * only initialize the actual class when accessing the closure component
+ * data, but then we need to map the id to the class somehow */
+#ifdef CLOSURE_PREPARE
+ ss->register_closure(name, id, params, prepare, NULL, NULL);
+#else
+ ss->register_closure(name, id, params, prepare, NULL);
+#endif
}
void OSLShader::register_closures(OSLShadingSystem *ss_)
diff --git a/intern/cycles/kernel/osl/osl_closures.h b/intern/cycles/kernel/osl/osl_closures.h
index 6632c2c57e5..b6c38e01b23 100644
--- a/intern/cycles/kernel/osl/osl_closures.h
+++ b/intern/cycles/kernel/osl/osl_closures.h
@@ -66,36 +66,52 @@ 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);
-enum {
- AmbientOcclusion = 100
-};
-
-#define CLOSURE_PREPARE(name, classname) \
+#define CCLOSURE_PREPARE(name, classname) \
void name(RendererServices *, int id, void *data) \
{ \
memset(data, 0, sizeof(classname)); \
new (data) classname(); \
}
-#define CLOSURE_PREPARE_STATIC(name, classname) static CLOSURE_PREPARE(name, classname)
+#define CCLOSURE_PREPARE_STATIC(name, classname) static CCLOSURE_PREPARE(name, classname)
#define CLOSURE_FLOAT3_PARAM(st, fld) \
- { TypeDesc::TypeVector, reckless_offsetof(st, fld), NULL, sizeof(OSL::Vec3) }
+ { TypeDesc::TypeVector, reckless_offsetof(st, fld), NULL, sizeof(OSL::Vec3) }
#define TO_VEC3(v) OSL::Vec3(v.x, v.y, v.z)
#define TO_COLOR3(v) OSL::Color3(v.x, v.y, v.z)
#define TO_FLOAT3(v) make_float3(v[0], v[1], v[2])
+/* Closure */
+
+class CClosurePrimitive {
+public:
+ enum Category {
+ BSDF, ///< Reflective and/or transmissive surface
+ BSSRDF, ///< Sub-surface light transfer
+ Emissive, ///< Light emission
+ Background, ///< Background emission
+ Volume, ///< Volume scattering
+ Holdout, ///< Holdout from alpha
+ AmbientOcclusion, ///< Ambient occlusion
+ };
+
+ CClosurePrimitive (Category category_) : category (category_) {}
+ virtual ~CClosurePrimitive() {}
+ virtual void setup() {}
+
+ Category category;
+};
+
/* BSDF */
-class CBSDFClosure : public OSL::ClosurePrimitive {
+class CBSDFClosure : public CClosurePrimitive {
public:
ShaderClosure sc;
- CBSDFClosure(int scattering) : OSL::ClosurePrimitive(BSDF),
+ CBSDFClosure(int scattering) : CClosurePrimitive(BSDF),
m_scattering_label(scattering), m_shaderdata_flag(0)
- { memset(&sc, 0, sizeof(sc)); }
- ~CBSDFClosure() { }
+ {}
int scattering() const { return m_scattering_label; }
int shaderdata_flag() const { return m_shaderdata_flag; }
@@ -119,9 +135,9 @@ protected:
\
class Upper##Closure : public CBSDFClosure { \
public: \
- Upper##Closure() : CBSDFClosure(TYPE) {} \
- size_t memsize() const { return sizeof(*this); } \
- const char *name() const { return #lower; } \
+ Upper##Closure() : CBSDFClosure(TYPE) \
+ { \
+ } \
\
void setup() \
{ \
@@ -129,21 +145,11 @@ public: \
m_shaderdata_flag = bsdf_##lower##_setup(&sc); \
} \
\
- bool mergeable(const ClosurePrimitive *other) const \
- { \
- return false; \
- } \
- \
void blur(float roughness) \
{ \
bsdf_##svmlower##_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_##svmlower##_eval_reflect(&sc, omega_out, omega_in, &pdf); \
@@ -178,7 +184,7 @@ static ClosureParam *bsdf_##lower##_params() \
return params; \
} \
\
-CLOSURE_PREPARE_STATIC(bsdf_##lower##_prepare, Upper##Closure)
+CCLOSURE_PREPARE_STATIC(bsdf_##lower##_prepare, Upper##Closure)
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp
index 309f5ded96d..d7d3301c0b0 100644
--- a/intern/cycles/kernel/osl/osl_services.cpp
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@ -44,6 +44,10 @@
#include "kernel_camera.h"
#include "kernel_shader.h"
+#ifdef WITH_PTEX
+#include <Ptexture.h>
+#endif
+
CCL_NAMESPACE_BEGIN
/* RenderServices implementation */
@@ -98,10 +102,18 @@ OSLRenderServices::OSLRenderServices()
{
kernel_globals = NULL;
osl_ts = NULL;
+
+#ifdef WITH_PTEX
+ size_t maxmem = 16384 * 1024;
+ ptex_cache = PtexCache::create(0, maxmem);
+#endif
}
OSLRenderServices::~OSLRenderServices()
{
+#ifdef WITH_PTEX
+ ptex_cache->release();
+#endif
}
void OSLRenderServices::thread_init(KernelGlobals *kernel_globals_, OSL::TextureSystem *osl_ts_)
@@ -776,6 +788,45 @@ bool OSLRenderServices::texture(ustring filename, TextureOpt &options,
OSL::TextureSystem *ts = osl_ts;
ShaderData *sd = (ShaderData *)(sg->renderstate);
KernelGlobals *kg = sd->osl_globals;
+
+#ifdef WITH_PTEX
+ /* todo: this is just a quick hack, only works with particular files and options */
+ if(string_endswith(filename.string(), ".ptx")) {
+ float2 uv;
+ int faceid;
+
+ if(!primitive_ptex(kg, sd, &uv, &faceid))
+ return false;
+
+ float u = uv.x;
+ float v = uv.y;
+ float dudx = 0.0f;
+ float dvdx = 0.0f;
+ float dudy = 0.0f;
+ float dvdy = 0.0f;
+
+ Ptex::String error;
+ PtexPtr<PtexTexture> r(ptex_cache->get(filename.c_str(), error));
+
+ if(!r) {
+ //std::cerr << error.c_str() << std::endl;
+ return false;
+ }
+
+ bool mipmaplerp = false;
+ float sharpness = 1.0f;
+ PtexFilter::Options opts(PtexFilter::f_bicubic, mipmaplerp, sharpness);
+ PtexPtr<PtexFilter> f(PtexFilter::getFilter(r, opts));
+
+ f->eval(result, options.firstchannel, options.nchannels, faceid, u, v, dudx, dvdx, dudy, dvdy);
+
+ for(int c = r->numChannels(); c < options.nchannels; c++)
+ result[c] = result[0];
+
+ return true;
+ }
+#endif
+
OSLThreadData *tdata = kg->osl_tdata;
OIIO::TextureSystem::Perthread *thread_info = tdata->oiio_thread_info;
diff --git a/intern/cycles/kernel/osl/osl_services.h b/intern/cycles/kernel/osl/osl_services.h
index f62895047b3..21609621b1d 100644
--- a/intern/cycles/kernel/osl/osl_services.h
+++ b/intern/cycles/kernel/osl/osl_services.h
@@ -28,6 +28,10 @@
#include <OSL/oslexec.h>
#include <OSL/oslclosure.h>
+#ifdef WITH_PTEX
+class PtexCache;
+#endif
+
CCL_NAMESPACE_BEGIN
class Object;
@@ -148,6 +152,9 @@ public:
private:
KernelGlobals *kernel_globals;
OSL::TextureSystem *osl_ts;
+#ifdef WITH_PTEX
+ PtexCache *ptex_cache;
+#endif
};
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/osl/osl_shader.cpp b/intern/cycles/kernel/osl/osl_shader.cpp
index 18e8fee4348..f2be61eb535 100644
--- a/intern/cycles/kernel/osl/osl_shader.cpp
+++ b/intern/cycles/kernel/osl/osl_shader.cpp
@@ -146,7 +146,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag,
if (closure->type == OSL::ClosureColor::COMPONENT) {
OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
- OSL::ClosurePrimitive *prim = (OSL::ClosurePrimitive *)comp->data();
+ CClosurePrimitive *prim = (CClosurePrimitive *)comp->data();
if (prim) {
ShaderClosure sc;
@@ -156,8 +156,10 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag,
sc.weight = weight;
#endif
- switch (prim->category()) {
- case OSL::ClosurePrimitive::BSDF: {
+ prim->setup();
+
+ switch (prim->category) {
+ case CClosurePrimitive::BSDF: {
CBSDFClosure *bsdf = (CBSDFClosure *)prim;
int scattering = bsdf->scattering();
@@ -191,7 +193,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag,
}
break;
}
- case OSL::ClosurePrimitive::Emissive: {
+ case CClosurePrimitive::Emissive: {
/* sample weight */
float sample_weight = fabsf(average(weight));
@@ -208,7 +210,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag,
}
break;
}
- case AmbientOcclusion: {
+ case CClosurePrimitive::AmbientOcclusion: {
/* sample weight */
float sample_weight = fabsf(average(weight));
@@ -224,7 +226,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag,
}
break;
}
- case OSL::ClosurePrimitive::Holdout: {
+ case CClosurePrimitive::Holdout: {
sc.sample_weight = 0.0f;
sc.type = CLOSURE_HOLDOUT_ID;
sc.data0 = 0.0f;
@@ -237,7 +239,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag,
}
break;
}
- case OSL::ClosurePrimitive::BSSRDF: {
+ case CClosurePrimitive::BSSRDF: {
CBSSRDFClosure *bssrdf = (CBSSRDFClosure *)prim;
float sample_weight = fabsf(average(weight));
@@ -280,10 +282,8 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag,
}
break;
}
- case OSL::ClosurePrimitive::Debug:
- break; /* not implemented */
- case OSL::ClosurePrimitive::Background:
- case OSL::ClosurePrimitive::Volume:
+ case CClosurePrimitive::Background:
+ case CClosurePrimitive::Volume:
break; /* not relevant */
}
}
@@ -332,9 +332,9 @@ static float3 flatten_background_closure_tree(const OSL::ClosureColor *closure)
if (closure->type == OSL::ClosureColor::COMPONENT) {
OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
- OSL::ClosurePrimitive *prim = (OSL::ClosurePrimitive *)comp->data();
+ CClosurePrimitive *prim = (CClosurePrimitive *)comp->data();
- if (prim && prim->category() == OSL::ClosurePrimitive::Background)
+ if (prim && prim->category == CClosurePrimitive::Background)
#ifdef OSL_SUPPORTS_WEIGHTED_CLOSURE_COMPONENTS
return TO_FLOAT3(comp->w);
#else
@@ -387,7 +387,7 @@ static void flatten_volume_closure_tree(ShaderData *sd,
if (closure->type == OSL::ClosureColor::COMPONENT) {
OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
- OSL::ClosurePrimitive *prim = (OSL::ClosurePrimitive *)comp->data();
+ CClosurePrimitive *prim = (CClosurePrimitive *)comp->data();
if (prim) {
ShaderClosure sc;
@@ -397,8 +397,10 @@ static void flatten_volume_closure_tree(ShaderData *sd,
sc.weight = weight;
#endif
- switch (prim->category()) {
- case OSL::ClosurePrimitive::Volume: {
+ prim->setup();
+
+ switch (prim->category) {
+ case CClosurePrimitive::Volume: {
/* sample weight */
float sample_weight = fabsf(average(weight));
@@ -413,13 +415,13 @@ static void flatten_volume_closure_tree(ShaderData *sd,
sd->closure[sd->num_closure++] = sc;
break;
}
- case OSL::ClosurePrimitive::Holdout:
- case OSL::ClosurePrimitive::Debug:
+ case CClosurePrimitive::Holdout:
break; /* not implemented */
- case OSL::ClosurePrimitive::Background:
- case OSL::ClosurePrimitive::BSDF:
- case OSL::ClosurePrimitive::Emissive:
- case OSL::ClosurePrimitive::BSSRDF:
+ case CClosurePrimitive::Background:
+ case CClosurePrimitive::BSDF:
+ case CClosurePrimitive::Emissive:
+ case CClosurePrimitive::BSSRDF:
+ case CClosurePrimitive::AmbientOcclusion:
break; /* not relevant */
}
}
@@ -509,25 +511,6 @@ void OSLShader::bsdf_blur(ShaderClosure *sc, float roughness)
bsdf->blur(roughness);
}
-/* Emissive Closure */
-
-float3 OSLShader::emissive_eval(const ShaderData *sd, const ShaderClosure *sc)
-{
- OSL::EmissiveClosure *emissive = (OSL::EmissiveClosure *)sc->prim;
- OSL::Color3 emissive_eval = emissive->eval(TO_VEC3(sd->Ng), TO_VEC3(sd->I));
-
- return TO_FLOAT3(emissive_eval);
-}
-
-/* Volume Closure */
-
-float3 OSLShader::volume_eval_phase(const ShaderClosure *sc, const float3 omega_in, const float3 omega_out)
-{
- OSL::VolumeClosure *volume = (OSL::VolumeClosure *)sc->prim;
- OSL::Color3 volume_eval = volume->eval_phase(TO_VEC3(omega_in), TO_VEC3(omega_out));
- return TO_FLOAT3(volume_eval) * sc->weight;
-}
-
/* Attributes */
int OSLShader::find_attribute(KernelGlobals *kg, const ShaderData *sd, uint id, AttributeElement *elem)
diff --git a/intern/cycles/kernel/osl/osl_shader.h b/intern/cycles/kernel/osl/osl_shader.h
index 777ecb6af81..2520b703ab7 100644
--- a/intern/cycles/kernel/osl/osl_shader.h
+++ b/intern/cycles/kernel/osl/osl_shader.h
@@ -66,11 +66,6 @@ public:
const float3& omega_in, float& pdf);
static void bsdf_blur(ShaderClosure *sc, float roughness);
- static float3 emissive_eval(const ShaderData *sd, const ShaderClosure *sc);
-
- static float3 volume_eval_phase(const ShaderClosure *sc,
- const float3 omega_in, const float3 omega_out);
-
/* attributes */
static int find_attribute(KernelGlobals *kg, const ShaderData *sd, uint id, AttributeElement *elem);
};