00001
00002
00003 #ifndef __BRDF_H
00004 #define __BRDF_H
00005
00006 #include <esg/Definitions.h>
00007 #include <esg/ESGObject.h>
00008 #include <esg/visitor/MatVisitor.h>
00009 #include <esg/Export>
00010
00011 namespace esg {
00012
00017 class OGSCENE_EXPORT BRDF : public ESGObject {
00018 public:
00022 enum RetVal {
00023 NONZERO_CONTRIB = 1,
00024 BAD_PARAMS = 2,
00025 NL_NEGATIVE = 3,
00026 NV_NEGATIVE = 4,
00027 NL_OR_NV_NEGATIVE = 5,
00028 ZERO_CONTRIB = 6
00029 };
00030
00031 protected:
00032 bool _isDiffuse;
00033 bool _isIsotropic;
00034
00035 protected:
00036 virtual void _duplicate_attributes (const BRDF& src) {
00037 _isDiffuse = src._isDiffuse;
00038 _isIsotropic = src._isIsotropic;
00039 }
00040
00041 public:
00050 BRDF (bool diffuse, bool isotropic)
00051 : _isDiffuse(diffuse), _isIsotropic(isotropic) {}
00052
00056 virtual ~BRDF() {}
00057
00061 bool diffuse (void) const { return _isDiffuse; }
00062
00066 bool specular (void) const { return ! _isDiffuse; }
00067
00073 bool isotropic (void) const { return _isIsotropic; }
00074
00080 bool anisotropic (void) const { return ! _isIsotropic; }
00081
00092 virtual RetVal reflectance(const MatVisitor& visitor,
00093 const Vector3* L,
00094 const Vector3* V,
00095 const Vector3* N,
00096 Vector3& color) = 0;
00097
00111 virtual RetVal reflectanceVNL(const MatVisitor& visitor,
00112 const Vector3* L,
00113 const Vector3* V,
00114 const Vector3* N,
00115 double NV,
00116 double NL,
00117 Vector3& color) = 0;
00118
00131 virtual RetVal reflectanceNL(const MatVisitor& visitor,
00132 const Vector3* L,
00133 const Vector3* V,
00134 const Vector3* N,
00135 double NL,
00136 Vector3& color) = 0;
00137
00141 virtual BRDF* clone () const = 0;
00142
00151 virtual double albedo (const MatVisitor& visitor,
00152 const Vector3& N,
00153 const Vector3* V) const = 0;
00154
00173 virtual void importanceSample(const MatVisitor& visitor,
00174 const Vector3& D,
00175 double r1,
00176 double r2,
00177 Vector3& dir,
00178 double* pPDFVal) = 0;
00179
00191 virtual Vector2 dir2uv (const MatVisitor& visitor,
00192 const Vector3& N,
00193 const Vector3& D) const = 0;
00194
00195
00196
00197 };
00198
00199 };
00200
00201 #endif // __BRDF_H