[Bf-blender-cvs] [16d223c] soc-2013-dingto: Merge branch 'master' into soc-2013-dingto
Brecht Van Lommel
noreply at git.blender.org
Sun Dec 8 13:03:11 CET 2013
Commit: 16d223c5e740fc4c4d173ce3255d9039f4a092a6
Author: Brecht Van Lommel
Date: Sun Dec 8 12:54:04 2013 +0100
http://developer.blender.org/rB16d223c5e740fc4c4d173ce3255d9039f4a092a6
Merge branch 'master' into soc-2013-dingto
===================================================================
===================================================================
diff --cc intern/cycles/kernel/osl/osl_closures.cpp
index 40e1966,340e449..20c696c
--- a/intern/cycles/kernel/osl/osl_closures.cpp
+++ b/intern/cycles/kernel/osl/osl_closures.cpp
@@@ -170,33 -169,18 +170,24 @@@ BSDF_CLOSURE_CLASS_BEGIN(HairTransmissi
#endif
BSDF_CLOSURE_CLASS_END(HairTransmission, hair_transmission)
+VOLUME_CLOSURE_CLASS_BEGIN(VolumeHenyeyGreenstein, henyey_greenstein, henyey_greenstein)
+ CLOSURE_FLOAT3_PARAM(VolumeHenyeyGreensteinClosure, sc.N),
+ CLOSURE_FLOAT_PARAM(VolumeHenyeyGreensteinClosure, sc.data0),
+ CLOSURE_FLOAT_PARAM(VolumeHenyeyGreensteinClosure, sc.data1),
+VOLUME_CLOSURE_CLASS_END(VolumeHenyeyGreenstein, henyey_greenstein)
+
/* 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 --cc intern/cycles/kernel/osl/osl_closures.h
index b26bfe9,b6c38e0..5ac15b3
--- a/intern/cycles/kernel/osl/osl_closures.h
+++ b/intern/cycles/kernel/osl/osl_closures.h
@@@ -66,13 -65,8 +66,9 @@@ void closure_westin_backscatter_prepare
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);
- 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)); \
@@@ -180,90 -184,8 +186,90 @@@ static ClosureParam *bsdf_##lower##_par
return params; \
} \
\
- CLOSURE_PREPARE_STATIC(bsdf_##lower##_prepare, Upper##Closure)
+ CCLOSURE_PREPARE_STATIC(bsdf_##lower##_prepare, Upper##Closure)
+
+/* Volume */
+
+class CVolumeClosure : public OSL::ClosurePrimitive {
+public:
+ ShaderClosure sc;
+
+ CVolumeClosure() : OSL::ClosurePrimitive(Volume),
+ m_shaderdata_flag(0)
+ { memset(&sc, 0, sizeof(sc)); }
+ ~CVolumeClosure() { }
+
+ int shaderdata_flag() const { return m_shaderdata_flag; }
+
+ virtual float3 eval_phase(const float3 &omega_out, const float3 &omega_in, float& pdf) const = 0;
+
+ virtual int sample(const float3 &Ng,
+ const float3 &omega_out, const float3 &domega_out_dx, const float3 &domega_out_dy,
+ float randu, float randv,
+ float3 &omega_in, float3 &domega_in_dx, float3 &domega_in_dy,
+ float &pdf, float3 &eval) const = 0;
+
+protected:
+ int m_shaderdata_flag;
+};
+
+#define VOLUME_CLOSURE_CLASS_BEGIN(Upper, lower, svmlower) \
+\
+class Upper##Closure : public CVolumeClosure { \
+public: \
+ Upper##Closure() : CVolumeClosure() {} \
+ size_t memsize() const { return sizeof(*this); } \
+ const char *name() const { return #lower; } \
+\
+ void setup() \
+ { \
+ sc.prim = NULL; \
+ m_shaderdata_flag = volume_##lower##_setup(&sc); \
+ } \
+\
+ 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] << "))"; \
+ } \
+\
+ float3 eval_phase(const float3 &omega_out, const float3 &omega_in, float& pdf) const \
+ { \
+ return volume_##svmlower##_eval_phase(&sc, omega_out, omega_in, &pdf); \
+ } \
+\
+ int sample(const float3 &Ng, \
+ const float3 &omega_out, const float3 &domega_out_dx, const float3 &domega_out_dy, \
+ float randu, float randv, \
+ float3 &omega_in, float3 &domega_in_dx, float3 &domega_in_dy, \
+ float &pdf, float3 &eval) const \
+ { \
+ return volume_##svmlower##_sample(&sc, Ng, omega_out, domega_out_dx, domega_out_dy, \
+ randu, randv, &eval, &omega_in, &domega_in_dx, &domega_in_dy, &pdf); \
+ } \
+\
+}; \
+\
+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; \
+} \
+\
- CLOSURE_PREPARE_STATIC(volume_##lower##_prepare, Upper##Closure)
++CCLOSURE_PREPARE_STATIC(volume_##lower##_prepare, Upper##Closure)
+
CCL_NAMESPACE_END
#endif /* __OSL_CLOSURES_H__ */
diff --cc intern/cycles/kernel/osl/osl_shader.cpp
index de43a8d,f2be61e..4df8fb3
--- a/intern/cycles/kernel/osl/osl_shader.cpp
+++ b/intern/cycles/kernel/osl/osl_shader.cpp
@@@ -397,34 -397,31 +397,36 @@@ static void flatten_volume_closure_tree
sc.weight = weight;
#endif
- switch (prim->category()) {
- case OSL::ClosurePrimitive::Volume: {
+ prim->setup();
+
+ 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.N = volume->sc.N;
+ sc.T = volume->sc.T;
+ sc.data0 = volume->sc.data0;
+ sc.data1 = volume->sc.data1;
+ sc.prim = volume->sc.prim;
/* add */
- if(sc.sample_weight > 1e-5f && sd->num_closure < MAX_CLOSURE)
+ if(sc.sample_weight > 1e-5f && sd->num_closure < MAX_CLOSURE) {
sd->closure[sd->num_closure++] = sc;
+ sd->flag |= volume->shaderdata_flag();
+ }
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 */
}
}
More information about the Bf-blender-cvs
mailing list