Cycles: Support building with latest OSL-1.7dev
So now the following OSL versions are supported (at least for compilation): - 1.5 with closure alignment patch applied - 1.6.8 release - 1.7 development version from latest git
This commit is contained in:
@@ -77,7 +77,7 @@ public:
|
|||||||
ClosureParam *closure_background_params()
|
ClosureParam *closure_background_params()
|
||||||
{
|
{
|
||||||
static ClosureParam params[] = {
|
static ClosureParam params[] = {
|
||||||
CLOSURE_STRING_KEYPARAM("label"),
|
CLOSURE_STRING_KEYPARAM(GenericBackgroundClosure, label, "label"),
|
||||||
CLOSURE_FINISH_PARAM(GenericBackgroundClosure)
|
CLOSURE_FINISH_PARAM(GenericBackgroundClosure)
|
||||||
};
|
};
|
||||||
return params;
|
return params;
|
||||||
@@ -98,7 +98,7 @@ CCLOSURE_PREPARE(closure_holdout_prepare, HoldoutClosure)
|
|||||||
ClosureParam *closure_ambient_occlusion_params()
|
ClosureParam *closure_ambient_occlusion_params()
|
||||||
{
|
{
|
||||||
static ClosureParam params[] = {
|
static ClosureParam params[] = {
|
||||||
CLOSURE_STRING_KEYPARAM("label"),
|
CLOSURE_STRING_KEYPARAM(AmbientOcclusionClosure, label, "label"),
|
||||||
CLOSURE_FINISH_PARAM(AmbientOcclusionClosure)
|
CLOSURE_FINISH_PARAM(AmbientOcclusionClosure)
|
||||||
};
|
};
|
||||||
return params;
|
return params;
|
||||||
|
@@ -93,7 +93,7 @@ ClosureParam *closure_bsdf_diffuse_ramp_params()
|
|||||||
static ClosureParam params[] = {
|
static ClosureParam params[] = {
|
||||||
CLOSURE_FLOAT3_PARAM(DiffuseRampClosure, sc.N),
|
CLOSURE_FLOAT3_PARAM(DiffuseRampClosure, sc.N),
|
||||||
CLOSURE_COLOR_ARRAY_PARAM(DiffuseRampClosure, colors, 8),
|
CLOSURE_COLOR_ARRAY_PARAM(DiffuseRampClosure, colors, 8),
|
||||||
CLOSURE_STRING_KEYPARAM("label"),
|
CLOSURE_STRING_KEYPARAM(DiffuseRampClosure, label, "label"),
|
||||||
CLOSURE_FINISH_PARAM(DiffuseRampClosure)
|
CLOSURE_FINISH_PARAM(DiffuseRampClosure)
|
||||||
};
|
};
|
||||||
return params;
|
return params;
|
||||||
|
@@ -93,7 +93,7 @@ ClosureParam *closure_bsdf_phong_ramp_params()
|
|||||||
CLOSURE_FLOAT3_PARAM(PhongRampClosure, sc.N),
|
CLOSURE_FLOAT3_PARAM(PhongRampClosure, sc.N),
|
||||||
CLOSURE_FLOAT_PARAM(PhongRampClosure, sc.data0),
|
CLOSURE_FLOAT_PARAM(PhongRampClosure, sc.data0),
|
||||||
CLOSURE_COLOR_ARRAY_PARAM(PhongRampClosure, colors, 8),
|
CLOSURE_COLOR_ARRAY_PARAM(PhongRampClosure, colors, 8),
|
||||||
CLOSURE_STRING_KEYPARAM("label"),
|
CLOSURE_STRING_KEYPARAM(PhongRampClosure, label, "label"),
|
||||||
CLOSURE_FINISH_PARAM(PhongRampClosure)
|
CLOSURE_FINISH_PARAM(PhongRampClosure)
|
||||||
};
|
};
|
||||||
return params;
|
return params;
|
||||||
|
@@ -77,7 +77,7 @@ public:
|
|||||||
ClosureParam *closure_emission_params()
|
ClosureParam *closure_emission_params()
|
||||||
{
|
{
|
||||||
static ClosureParam params[] = {
|
static ClosureParam params[] = {
|
||||||
CLOSURE_STRING_KEYPARAM("label"),
|
CLOSURE_STRING_KEYPARAM(GenericEmissiveClosure, label, "label"),
|
||||||
CLOSURE_FINISH_PARAM(GenericEmissiveClosure)
|
CLOSURE_FINISH_PARAM(GenericEmissiveClosure)
|
||||||
};
|
};
|
||||||
return params;
|
return params;
|
||||||
|
@@ -69,7 +69,7 @@ ClosureParam *closure_bssrdf_cubic_params()
|
|||||||
CLOSURE_FLOAT3_PARAM(CubicBSSRDFClosure, radius),
|
CLOSURE_FLOAT3_PARAM(CubicBSSRDFClosure, radius),
|
||||||
CLOSURE_FLOAT_PARAM(CubicBSSRDFClosure, sc.data1),
|
CLOSURE_FLOAT_PARAM(CubicBSSRDFClosure, sc.data1),
|
||||||
CLOSURE_FLOAT_PARAM(CubicBSSRDFClosure, sc.T.x),
|
CLOSURE_FLOAT_PARAM(CubicBSSRDFClosure, sc.T.x),
|
||||||
CLOSURE_STRING_KEYPARAM("label"),
|
CLOSURE_STRING_KEYPARAM(CubicBSSRDFClosure, label, "label"),
|
||||||
CLOSURE_FINISH_PARAM(CubicBSSRDFClosure)
|
CLOSURE_FINISH_PARAM(CubicBSSRDFClosure)
|
||||||
};
|
};
|
||||||
return params;
|
return params;
|
||||||
@@ -97,7 +97,7 @@ ClosureParam *closure_bssrdf_gaussian_params()
|
|||||||
CLOSURE_FLOAT3_PARAM(GaussianBSSRDFClosure, sc.N),
|
CLOSURE_FLOAT3_PARAM(GaussianBSSRDFClosure, sc.N),
|
||||||
CLOSURE_FLOAT3_PARAM(GaussianBSSRDFClosure, radius),
|
CLOSURE_FLOAT3_PARAM(GaussianBSSRDFClosure, radius),
|
||||||
CLOSURE_FLOAT_PARAM(GaussianBSSRDFClosure, sc.data1),
|
CLOSURE_FLOAT_PARAM(GaussianBSSRDFClosure, sc.data1),
|
||||||
CLOSURE_STRING_KEYPARAM("label"),
|
CLOSURE_STRING_KEYPARAM(GaussianBSSRDFClosure, label, "label"),
|
||||||
CLOSURE_FINISH_PARAM(GaussianBSSRDFClosure)
|
CLOSURE_FINISH_PARAM(GaussianBSSRDFClosure)
|
||||||
};
|
};
|
||||||
return params;
|
return params;
|
||||||
|
@@ -78,6 +78,11 @@ void name(RendererServices *, int id, void *data) \
|
|||||||
#define TO_COLOR3(v) OSL::Color3(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])
|
#define TO_FLOAT3(v) make_float3(v[0], v[1], v[2])
|
||||||
|
|
||||||
|
#if OSL_LIBRARY_VERSION_CODE < 10700
|
||||||
|
# undef CLOSURE_STRING_KEYPARAM
|
||||||
|
# define CLOSURE_STRING_KEYPARAM(st, fld, key) { TypeDesc::TypeString, 0, key, 0 }
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Closure */
|
/* Closure */
|
||||||
|
|
||||||
class CClosurePrimitive {
|
class CClosurePrimitive {
|
||||||
@@ -97,6 +102,10 @@ public:
|
|||||||
virtual void setup() {}
|
virtual void setup() {}
|
||||||
|
|
||||||
Category category;
|
Category category;
|
||||||
|
|
||||||
|
#if OSL_LIBRARY_VERSION_CODE >= 10700
|
||||||
|
OSL::ustring label;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/* BSDF */
|
/* BSDF */
|
||||||
@@ -175,7 +184,7 @@ static ClosureParam *bsdf_##lower##_params() \
|
|||||||
/* parameters */
|
/* parameters */
|
||||||
|
|
||||||
#define BSDF_CLOSURE_CLASS_END(Upper, lower) \
|
#define BSDF_CLOSURE_CLASS_END(Upper, lower) \
|
||||||
CLOSURE_STRING_KEYPARAM("label"), \
|
CLOSURE_STRING_KEYPARAM(Upper##Closure, label, "label"), \
|
||||||
CLOSURE_FINISH_PARAM(Upper##Closure) \
|
CLOSURE_FINISH_PARAM(Upper##Closure) \
|
||||||
}; \
|
}; \
|
||||||
return params; \
|
return params; \
|
||||||
@@ -223,7 +232,7 @@ static ClosureParam *volume_##lower##_params() \
|
|||||||
/* parameters */
|
/* parameters */
|
||||||
|
|
||||||
#define VOLUME_CLOSURE_CLASS_END(Upper, lower) \
|
#define VOLUME_CLOSURE_CLASS_END(Upper, lower) \
|
||||||
CLOSURE_STRING_KEYPARAM("label"), \
|
CLOSURE_STRING_KEYPARAM(Upper##Closure, label, "label"), \
|
||||||
CLOSURE_FINISH_PARAM(Upper##Closure) \
|
CLOSURE_FINISH_PARAM(Upper##Closure) \
|
||||||
}; \
|
}; \
|
||||||
return params; \
|
return params; \
|
||||||
|
@@ -146,165 +146,175 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag,
|
|||||||
/* OSL gives us a closure tree, we flatten it into arrays per
|
/* OSL gives us a closure tree, we flatten it into arrays per
|
||||||
* closure type, for evaluation, sampling, etc later on. */
|
* closure type, for evaluation, sampling, etc later on. */
|
||||||
|
|
||||||
if(closure->type == OSL::ClosureColor::COMPONENT) {
|
#if OSL_LIBRARY_VERSION_CODE < 10700
|
||||||
OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
|
switch(closure->type) {
|
||||||
CClosurePrimitive *prim = (CClosurePrimitive *)comp->data();
|
#else
|
||||||
|
switch(closure->id) {
|
||||||
|
#endif
|
||||||
|
case OSL::ClosureColor::MUL: {
|
||||||
|
OSL::ClosureMul *mul = (OSL::ClosureMul *)closure;
|
||||||
|
flatten_surface_closure_tree(sd, path_flag, mul->closure, TO_FLOAT3(mul->weight) * weight);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OSL::ClosureColor::ADD: {
|
||||||
|
OSL::ClosureAdd *add = (OSL::ClosureAdd *)closure;
|
||||||
|
flatten_surface_closure_tree(sd, path_flag, add->closureA, weight);
|
||||||
|
flatten_surface_closure_tree(sd, path_flag, add->closureB, weight);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
|
||||||
|
CClosurePrimitive *prim = (CClosurePrimitive *)comp->data();
|
||||||
|
|
||||||
if(prim) {
|
if(prim) {
|
||||||
ShaderClosure sc;
|
ShaderClosure sc;
|
||||||
|
|
||||||
#ifdef OSL_SUPPORTS_WEIGHTED_CLOSURE_COMPONENTS
|
#ifdef OSL_SUPPORTS_WEIGHTED_CLOSURE_COMPONENTS
|
||||||
weight = weight*TO_FLOAT3(comp->w);
|
weight = weight*TO_FLOAT3(comp->w);
|
||||||
#endif
|
#endif
|
||||||
sc.weight = weight;
|
sc.weight = weight;
|
||||||
|
|
||||||
prim->setup();
|
prim->setup();
|
||||||
|
|
||||||
switch (prim->category) {
|
switch(prim->category) {
|
||||||
case CClosurePrimitive::BSDF: {
|
case CClosurePrimitive::BSDF: {
|
||||||
CBSDFClosure *bsdf = (CBSDFClosure *)prim;
|
CBSDFClosure *bsdf = (CBSDFClosure *)prim;
|
||||||
int scattering = bsdf->scattering();
|
int scattering = bsdf->scattering();
|
||||||
|
|
||||||
/* caustic options */
|
/* caustic options */
|
||||||
if((scattering & LABEL_GLOSSY) && (path_flag & PATH_RAY_DIFFUSE)) {
|
if((scattering & LABEL_GLOSSY) && (path_flag & PATH_RAY_DIFFUSE)) {
|
||||||
KernelGlobals *kg = sd->osl_globals;
|
KernelGlobals *kg = sd->osl_globals;
|
||||||
|
|
||||||
if((!kernel_data.integrator.caustics_reflective && (scattering & LABEL_REFLECT)) ||
|
if((!kernel_data.integrator.caustics_reflective && (scattering & LABEL_REFLECT)) ||
|
||||||
(!kernel_data.integrator.caustics_refractive && (scattering & LABEL_TRANSMIT))) {
|
(!kernel_data.integrator.caustics_refractive && (scattering & LABEL_TRANSMIT)))
|
||||||
return;
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* sample weight */
|
/* sample weight */
|
||||||
float sample_weight = fabsf(average(weight));
|
float sample_weight = fabsf(average(weight));
|
||||||
|
|
||||||
sc.sample_weight = sample_weight;
|
|
||||||
|
|
||||||
sc.type = bsdf->sc.type;
|
|
||||||
sc.N = bsdf->sc.N;
|
|
||||||
sc.T = bsdf->sc.T;
|
|
||||||
sc.data0 = bsdf->sc.data0;
|
|
||||||
sc.data1 = bsdf->sc.data1;
|
|
||||||
sc.data2 = bsdf->sc.data2;
|
|
||||||
sc.prim = bsdf->sc.prim;
|
|
||||||
|
|
||||||
/* add */
|
|
||||||
if(sc.sample_weight > CLOSURE_WEIGHT_CUTOFF && sd->num_closure < MAX_CLOSURE) {
|
|
||||||
sd->closure[sd->num_closure++] = sc;
|
|
||||||
sd->flag |= bsdf->shaderdata_flag();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CClosurePrimitive::Emissive: {
|
|
||||||
/* sample weight */
|
|
||||||
float sample_weight = fabsf(average(weight));
|
|
||||||
|
|
||||||
sc.sample_weight = sample_weight;
|
|
||||||
sc.type = CLOSURE_EMISSION_ID;
|
|
||||||
sc.data0 = 0.0f;
|
|
||||||
sc.data1 = 0.0f;
|
|
||||||
sc.data2 = 0.0f;
|
|
||||||
sc.prim = NULL;
|
|
||||||
|
|
||||||
/* flag */
|
|
||||||
if(sd->num_closure < MAX_CLOSURE) {
|
|
||||||
sd->closure[sd->num_closure++] = sc;
|
|
||||||
sd->flag |= SD_EMISSION;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CClosurePrimitive::AmbientOcclusion: {
|
|
||||||
/* sample weight */
|
|
||||||
float sample_weight = fabsf(average(weight));
|
|
||||||
|
|
||||||
sc.sample_weight = sample_weight;
|
|
||||||
sc.type = CLOSURE_AMBIENT_OCCLUSION_ID;
|
|
||||||
sc.data0 = 0.0f;
|
|
||||||
sc.data1 = 0.0f;
|
|
||||||
sc.data2 = 0.0f;
|
|
||||||
sc.prim = NULL;
|
|
||||||
|
|
||||||
if(sd->num_closure < MAX_CLOSURE) {
|
|
||||||
sd->closure[sd->num_closure++] = sc;
|
|
||||||
sd->flag |= SD_AO;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CClosurePrimitive::Holdout: {
|
|
||||||
sc.sample_weight = 0.0f;
|
|
||||||
sc.type = CLOSURE_HOLDOUT_ID;
|
|
||||||
sc.data0 = 0.0f;
|
|
||||||
sc.data1 = 0.0f;
|
|
||||||
sc.data2 = 0.0f;
|
|
||||||
sc.prim = NULL;
|
|
||||||
|
|
||||||
if(sd->num_closure < MAX_CLOSURE) {
|
|
||||||
sd->closure[sd->num_closure++] = sc;
|
|
||||||
sd->flag |= SD_HOLDOUT;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CClosurePrimitive::BSSRDF: {
|
|
||||||
CBSSRDFClosure *bssrdf = (CBSSRDFClosure *)prim;
|
|
||||||
float sample_weight = fabsf(average(weight));
|
|
||||||
|
|
||||||
if(sample_weight > CLOSURE_WEIGHT_CUTOFF && sd->num_closure+2 < MAX_CLOSURE) {
|
|
||||||
sc.sample_weight = sample_weight;
|
sc.sample_weight = sample_weight;
|
||||||
|
|
||||||
sc.type = bssrdf->sc.type;
|
sc.type = bsdf->sc.type;
|
||||||
sc.N = bssrdf->sc.N;
|
sc.N = bsdf->sc.N;
|
||||||
sc.data1 = bssrdf->sc.data1;
|
sc.T = bsdf->sc.T;
|
||||||
sc.T.x = bssrdf->sc.T.x;
|
sc.data0 = bsdf->sc.data0;
|
||||||
|
sc.data1 = bsdf->sc.data1;
|
||||||
|
sc.data2 = bsdf->sc.data2;
|
||||||
|
sc.prim = bsdf->sc.prim;
|
||||||
|
|
||||||
|
/* add */
|
||||||
|
if(sc.sample_weight > CLOSURE_WEIGHT_CUTOFF && sd->num_closure < MAX_CLOSURE) {
|
||||||
|
sd->closure[sd->num_closure++] = sc;
|
||||||
|
sd->flag |= bsdf->shaderdata_flag();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CClosurePrimitive::Emissive: {
|
||||||
|
/* sample weight */
|
||||||
|
float sample_weight = fabsf(average(weight));
|
||||||
|
|
||||||
|
sc.sample_weight = sample_weight;
|
||||||
|
sc.type = CLOSURE_EMISSION_ID;
|
||||||
|
sc.data0 = 0.0f;
|
||||||
|
sc.data1 = 0.0f;
|
||||||
|
sc.data2 = 0.0f;
|
||||||
sc.prim = NULL;
|
sc.prim = NULL;
|
||||||
|
|
||||||
/* disable in case of diffuse ancestor, can't see it well then and
|
/* flag */
|
||||||
* adds considerably noise due to probabilities of continuing path
|
if(sd->num_closure < MAX_CLOSURE) {
|
||||||
* getting lower and lower */
|
|
||||||
if(path_flag & PATH_RAY_DIFFUSE_ANCESTOR)
|
|
||||||
bssrdf->radius = make_float3(0.0f, 0.0f, 0.0f);
|
|
||||||
|
|
||||||
/* create one closure for each color channel */
|
|
||||||
if(fabsf(weight.x) > 0.0f) {
|
|
||||||
sc.weight = make_float3(weight.x, 0.0f, 0.0f);
|
|
||||||
sc.data0 = bssrdf->radius.x;
|
|
||||||
sc.data1 = 0.0f;
|
|
||||||
sd->flag |= bssrdf_setup(&sc, sc.type);
|
|
||||||
sd->closure[sd->num_closure++] = sc;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fabsf(weight.y) > 0.0f) {
|
|
||||||
sc.weight = make_float3(0.0f, weight.y, 0.0f);
|
|
||||||
sc.data0 = bssrdf->radius.y;
|
|
||||||
sc.data1 = 0.0f;
|
|
||||||
sd->flag |= bssrdf_setup(&sc, sc.type);
|
|
||||||
sd->closure[sd->num_closure++] = sc;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fabsf(weight.z) > 0.0f) {
|
|
||||||
sc.weight = make_float3(0.0f, 0.0f, weight.z);
|
|
||||||
sc.data0 = bssrdf->radius.z;
|
|
||||||
sc.data1 = 0.0f;
|
|
||||||
sd->flag |= bssrdf_setup(&sc, sc.type);
|
|
||||||
sd->closure[sd->num_closure++] = sc;
|
sd->closure[sd->num_closure++] = sc;
|
||||||
|
sd->flag |= SD_EMISSION;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
case CClosurePrimitive::AmbientOcclusion: {
|
||||||
|
/* sample weight */
|
||||||
|
float sample_weight = fabsf(average(weight));
|
||||||
|
|
||||||
|
sc.sample_weight = sample_weight;
|
||||||
|
sc.type = CLOSURE_AMBIENT_OCCLUSION_ID;
|
||||||
|
sc.data0 = 0.0f;
|
||||||
|
sc.data1 = 0.0f;
|
||||||
|
sc.data2 = 0.0f;
|
||||||
|
sc.prim = NULL;
|
||||||
|
|
||||||
|
if(sd->num_closure < MAX_CLOSURE) {
|
||||||
|
sd->closure[sd->num_closure++] = sc;
|
||||||
|
sd->flag |= SD_AO;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CClosurePrimitive::Holdout: {
|
||||||
|
sc.sample_weight = 0.0f;
|
||||||
|
sc.type = CLOSURE_HOLDOUT_ID;
|
||||||
|
sc.data0 = 0.0f;
|
||||||
|
sc.data1 = 0.0f;
|
||||||
|
sc.data2 = 0.0f;
|
||||||
|
sc.prim = NULL;
|
||||||
|
|
||||||
|
if(sd->num_closure < MAX_CLOSURE) {
|
||||||
|
sd->closure[sd->num_closure++] = sc;
|
||||||
|
sd->flag |= SD_HOLDOUT;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CClosurePrimitive::BSSRDF: {
|
||||||
|
CBSSRDFClosure *bssrdf = (CBSSRDFClosure *)prim;
|
||||||
|
float sample_weight = fabsf(average(weight));
|
||||||
|
|
||||||
|
if(sample_weight > CLOSURE_WEIGHT_CUTOFF && sd->num_closure+2 < MAX_CLOSURE) {
|
||||||
|
sc.sample_weight = sample_weight;
|
||||||
|
|
||||||
|
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
|
||||||
|
* adds considerably noise due to probabilities of continuing path
|
||||||
|
* getting lower and lower */
|
||||||
|
if(path_flag & PATH_RAY_DIFFUSE_ANCESTOR)
|
||||||
|
bssrdf->radius = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
/* create one closure for each color channel */
|
||||||
|
if(fabsf(weight.x) > 0.0f) {
|
||||||
|
sc.weight = make_float3(weight.x, 0.0f, 0.0f);
|
||||||
|
sc.data0 = bssrdf->radius.x;
|
||||||
|
sc.data1 = 0.0f;
|
||||||
|
sd->flag |= bssrdf_setup(&sc, sc.type);
|
||||||
|
sd->closure[sd->num_closure++] = sc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fabsf(weight.y) > 0.0f) {
|
||||||
|
sc.weight = make_float3(0.0f, weight.y, 0.0f);
|
||||||
|
sc.data0 = bssrdf->radius.y;
|
||||||
|
sc.data1 = 0.0f;
|
||||||
|
sd->flag |= bssrdf_setup(&sc, sc.type);
|
||||||
|
sd->closure[sd->num_closure++] = sc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fabsf(weight.z) > 0.0f) {
|
||||||
|
sc.weight = make_float3(0.0f, 0.0f, weight.z);
|
||||||
|
sc.data0 = bssrdf->radius.z;
|
||||||
|
sc.data1 = 0.0f;
|
||||||
|
sd->flag |= bssrdf_setup(&sc, sc.type);
|
||||||
|
sd->closure[sd->num_closure++] = sc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CClosurePrimitive::Background:
|
||||||
|
case CClosurePrimitive::Volume:
|
||||||
|
break; /* not relevant */
|
||||||
}
|
}
|
||||||
case CClosurePrimitive::Background:
|
|
||||||
case CClosurePrimitive::Volume:
|
|
||||||
break; /* not relevant */
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(closure->type == OSL::ClosureColor::MUL) {
|
|
||||||
OSL::ClosureMul *mul = (OSL::ClosureMul *)closure;
|
|
||||||
flatten_surface_closure_tree(sd, path_flag, mul->closure, TO_FLOAT3(mul->weight) * weight);
|
|
||||||
}
|
|
||||||
else if(closure->type == OSL::ClosureColor::ADD) {
|
|
||||||
OSL::ClosureAdd *add = (OSL::ClosureAdd *)closure;
|
|
||||||
flatten_surface_closure_tree(sd, path_flag, add->closureA, weight);
|
|
||||||
flatten_surface_closure_tree(sd, path_flag, add->closureB, weight);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OSLShader::eval_surface(KernelGlobals *kg, ShaderData *sd, int path_flag, ShaderContext ctx)
|
void OSLShader::eval_surface(KernelGlobals *kg, ShaderData *sd, int path_flag, ShaderContext ctx)
|
||||||
@@ -335,27 +345,33 @@ static float3 flatten_background_closure_tree(const OSL::ClosureColor *closure)
|
|||||||
* is only one supported closure type at the moment, which has no evaluation
|
* is only one supported closure type at the moment, which has no evaluation
|
||||||
* functions, so we just sum the weights */
|
* functions, so we just sum the weights */
|
||||||
|
|
||||||
if(closure->type == OSL::ClosureColor::COMPONENT) {
|
#if OSL_LIBRARY_VERSION_CODE < 10700
|
||||||
OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
|
switch(closure->type) {
|
||||||
CClosurePrimitive *prim = (CClosurePrimitive *)comp->data();
|
|
||||||
|
|
||||||
if(prim && prim->category == CClosurePrimitive::Background)
|
|
||||||
#ifdef OSL_SUPPORTS_WEIGHTED_CLOSURE_COMPONENTS
|
|
||||||
return TO_FLOAT3(comp->w);
|
|
||||||
#else
|
#else
|
||||||
return make_float3(1.0f, 1.0f, 1.0f);
|
switch(closure->id) {
|
||||||
#endif
|
#endif
|
||||||
}
|
case OSL::ClosureColor::MUL: {
|
||||||
else if(closure->type == OSL::ClosureColor::MUL) {
|
OSL::ClosureMul *mul = (OSL::ClosureMul *)closure;
|
||||||
OSL::ClosureMul *mul = (OSL::ClosureMul *)closure;
|
|
||||||
|
|
||||||
return TO_FLOAT3(mul->weight) * flatten_background_closure_tree(mul->closure);
|
return TO_FLOAT3(mul->weight) * flatten_background_closure_tree(mul->closure);
|
||||||
}
|
}
|
||||||
else if(closure->type == OSL::ClosureColor::ADD) {
|
case OSL::ClosureColor::ADD: {
|
||||||
OSL::ClosureAdd *add = (OSL::ClosureAdd *)closure;
|
OSL::ClosureAdd *add = (OSL::ClosureAdd *)closure;
|
||||||
|
|
||||||
return flatten_background_closure_tree(add->closureA) +
|
return flatten_background_closure_tree(add->closureA) +
|
||||||
flatten_background_closure_tree(add->closureB);
|
flatten_background_closure_tree(add->closureB);
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
|
||||||
|
CClosurePrimitive *prim = (CClosurePrimitive *)comp->data();
|
||||||
|
|
||||||
|
if(prim && prim->category == CClosurePrimitive::Background)
|
||||||
|
#ifdef OSL_SUPPORTS_WEIGHTED_CLOSURE_COMPONENTS
|
||||||
|
return TO_FLOAT3(comp->w);
|
||||||
|
#else
|
||||||
|
return make_float3(1.0f, 1.0f, 1.0f);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return make_float3(0.0f, 0.0f, 0.0f);
|
return make_float3(0.0f, 0.0f, 0.0f);
|
||||||
@@ -390,76 +406,84 @@ static void flatten_volume_closure_tree(ShaderData *sd,
|
|||||||
/* OSL gives us a closure tree, we flatten it into arrays per
|
/* OSL gives us a closure tree, we flatten it into arrays per
|
||||||
* closure type, for evaluation, sampling, etc later on. */
|
* closure type, for evaluation, sampling, etc later on. */
|
||||||
|
|
||||||
if(closure->type == OSL::ClosureColor::COMPONENT) {
|
#if OSL_LIBRARY_VERSION_CODE < 10700
|
||||||
OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
|
switch(closure->type) {
|
||||||
CClosurePrimitive *prim = (CClosurePrimitive *)comp->data();
|
#else
|
||||||
|
switch(closure->id) {
|
||||||
|
#endif
|
||||||
|
case OSL::ClosureColor::MUL: {
|
||||||
|
OSL::ClosureMul *mul = (OSL::ClosureMul *)closure;
|
||||||
|
flatten_volume_closure_tree(sd, mul->closure, TO_FLOAT3(mul->weight) * weight);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OSL::ClosureColor::ADD: {
|
||||||
|
OSL::ClosureAdd *add = (OSL::ClosureAdd *)closure;
|
||||||
|
flatten_volume_closure_tree(sd, add->closureA, weight);
|
||||||
|
flatten_volume_closure_tree(sd, add->closureB, weight);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
|
||||||
|
CClosurePrimitive *prim = (CClosurePrimitive *)comp->data();
|
||||||
|
|
||||||
if(prim) {
|
if(prim) {
|
||||||
ShaderClosure sc;
|
ShaderClosure sc;
|
||||||
|
|
||||||
#ifdef OSL_SUPPORTS_WEIGHTED_CLOSURE_COMPONENTS
|
#ifdef OSL_SUPPORTS_WEIGHTED_CLOSURE_COMPONENTS
|
||||||
weight = weight*TO_FLOAT3(comp->w);
|
weight = weight*TO_FLOAT3(comp->w);
|
||||||
#endif
|
#endif
|
||||||
sc.weight = weight;
|
sc.weight = weight;
|
||||||
|
|
||||||
prim->setup();
|
prim->setup();
|
||||||
|
|
||||||
switch (prim->category) {
|
switch(prim->category) {
|
||||||
case CClosurePrimitive::Volume: {
|
case CClosurePrimitive::Volume: {
|
||||||
CVolumeClosure *volume = (CVolumeClosure *)prim;
|
CVolumeClosure *volume = (CVolumeClosure *)prim;
|
||||||
/* sample weight */
|
/* sample weight */
|
||||||
float sample_weight = fabsf(average(weight));
|
float sample_weight = fabsf(average(weight));
|
||||||
|
|
||||||
sc.sample_weight = sample_weight;
|
sc.sample_weight = sample_weight;
|
||||||
sc.type = volume->sc.type;
|
sc.type = volume->sc.type;
|
||||||
sc.data0 = volume->sc.data0;
|
sc.data0 = volume->sc.data0;
|
||||||
sc.data1 = volume->sc.data1;
|
sc.data1 = volume->sc.data1;
|
||||||
|
|
||||||
/* add */
|
/* add */
|
||||||
if((sc.sample_weight > CLOSURE_WEIGHT_CUTOFF) &&
|
if((sc.sample_weight > CLOSURE_WEIGHT_CUTOFF) &&
|
||||||
(sd->num_closure < MAX_CLOSURE))
|
(sd->num_closure < MAX_CLOSURE))
|
||||||
{
|
{
|
||||||
sd->closure[sd->num_closure++] = sc;
|
sd->closure[sd->num_closure++] = sc;
|
||||||
sd->flag |= volume->shaderdata_flag();
|
sd->flag |= volume->shaderdata_flag();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
case CClosurePrimitive::Emissive: {
|
||||||
}
|
/* sample weight */
|
||||||
case CClosurePrimitive::Emissive: {
|
float sample_weight = fabsf(average(weight));
|
||||||
/* sample weight */
|
|
||||||
float sample_weight = fabsf(average(weight));
|
|
||||||
|
|
||||||
sc.sample_weight = sample_weight;
|
sc.sample_weight = sample_weight;
|
||||||
sc.type = CLOSURE_EMISSION_ID;
|
sc.type = CLOSURE_EMISSION_ID;
|
||||||
sc.data0 = 0.0f;
|
sc.data0 = 0.0f;
|
||||||
sc.data1 = 0.0f;
|
sc.data1 = 0.0f;
|
||||||
sc.prim = NULL;
|
sc.prim = NULL;
|
||||||
|
|
||||||
/* flag */
|
/* flag */
|
||||||
if(sd->num_closure < MAX_CLOSURE) {
|
if(sd->num_closure < MAX_CLOSURE) {
|
||||||
sd->closure[sd->num_closure++] = sc;
|
sd->closure[sd->num_closure++] = sc;
|
||||||
sd->flag |= SD_EMISSION;
|
sd->flag |= SD_EMISSION;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
case CClosurePrimitive::Holdout:
|
||||||
|
break; /* not implemented */
|
||||||
|
case CClosurePrimitive::Background:
|
||||||
|
case CClosurePrimitive::BSDF:
|
||||||
|
case CClosurePrimitive::BSSRDF:
|
||||||
|
case CClosurePrimitive::AmbientOcclusion:
|
||||||
|
break; /* not relevant */
|
||||||
}
|
}
|
||||||
case CClosurePrimitive::Holdout:
|
|
||||||
break; /* not implemented */
|
|
||||||
case CClosurePrimitive::Background:
|
|
||||||
case CClosurePrimitive::BSDF:
|
|
||||||
case CClosurePrimitive::BSSRDF:
|
|
||||||
case CClosurePrimitive::AmbientOcclusion:
|
|
||||||
break; /* not relevant */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(closure->type == OSL::ClosureColor::MUL) {
|
|
||||||
OSL::ClosureMul *mul = (OSL::ClosureMul *)closure;
|
|
||||||
flatten_volume_closure_tree(sd, mul->closure, TO_FLOAT3(mul->weight) * weight);
|
|
||||||
}
|
|
||||||
else if(closure->type == OSL::ClosureColor::ADD) {
|
|
||||||
OSL::ClosureAdd *add = (OSL::ClosureAdd *)closure;
|
|
||||||
flatten_volume_closure_tree(sd, add->closureA, weight);
|
|
||||||
flatten_volume_closure_tree(sd, add->closureB, weight);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OSLShader::eval_volume(KernelGlobals *kg, ShaderData *sd, int path_flag, ShaderContext ctx)
|
void OSLShader::eval_volume(KernelGlobals *kg, ShaderData *sd, int path_flag, ShaderContext ctx)
|
||||||
|
Reference in New Issue
Block a user