00001
00002
00003 #ifndef __LAMBERTIAN_BRDF_H
00004 #define __LAMBERTIAN_BRDF_H
00005
00006 #include <esg/Definitions.h>
00007 #include <esg/visitor/MatVisitor.h>
00008 #include <esg/brdf/DiffuseBRDF.h>
00009 #include <esg/geometry/Hemisphere.h>
00010
00011 namespace esg {
00012
00019 class OGSCENE_EXPORT LambertianBRDF : public DiffuseBRDF {
00020 protected:
00021 virtual void _duplicate_attributes (const BRDF& src) {
00022 DiffuseBRDF::_duplicate_attributes(src);
00023 }
00024
00025 public:
00029 LambertianBRDF (void) : DiffuseBRDF(true) {}
00030
00041 virtual RetVal reflectance(const MatVisitor& visitor,
00042 const Vector3* L,
00043 const Vector3* V,
00044 const Vector3* N,
00045 Vector3& color) {
00046 color.set(visitor.diffuse());
00047 return NONZERO_CONTRIB;
00048 }
00049
00063 virtual RetVal reflectanceVNL(const MatVisitor& visitor,
00064 const Vector3* L,
00065 const Vector3* V,
00066 const Vector3* N,
00067 double NV,
00068 double NL,
00069 Vector3& color) {
00070 color.set(visitor.diffuse());
00071 return NONZERO_CONTRIB;
00072 }
00073
00086 virtual RetVal reflectanceNL(const MatVisitor& visitor,
00087 const Vector3* L,
00088 const Vector3* V,
00089 const Vector3* N,
00090 double NL,
00091 Vector3& color) {
00092 color.set(visitor.diffuse());
00093 return NONZERO_CONTRIB;
00094 }
00095
00096 virtual BRDF* clone (void) const { return new LambertianBRDF(); }
00097
00106 virtual double albedo (const MatVisitor& visitor,
00107 const Vector3& N,
00108 const Vector3* V) const {
00109 return visitor.avgDiffuse() / PI;
00110 }
00111
00127 virtual void importanceSample(const MatVisitor& visitor,
00128 const Vector3& D,
00129 double r1,
00130 double r2,
00131 Vector3& dir,
00132 double* pPDFVal) {
00133 Hemisphere hemisphere(D);
00134 dir.set(hemisphere.sampleUniformly(r1, r2, pPDFVal));
00135 }
00136
00150 virtual Vector2 dir2uv (const MatVisitor& visitor,
00151 const Vector3& N,
00152 const Vector3& D) const {
00153 Hemisphere h(N);
00154 return h.dir2uvUniformly(D);
00155 }
00156 };
00157
00158 };
00159
00160 #endif // ___LAMBERTIAN_BRDF_H