[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