00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LUX_COOKTORRANCE_H
00024 #define LUX_COOKTORRANCE_H
00025
00026 #include "lux.h"
00027 #include "bxdf.h"
00028 #include "spectrum.h"
00029
00030 namespace lux
00031 {
00032
00033
00034 class CookTorrance : public BxDF {
00035 public:
00036
00037 CookTorrance(const SWCSpectrum &ks, MicrofacetDistribution *dist, Fresnel *fres);
00038 virtual ~CookTorrance() { }
00039 virtual void f(const TsPack *tspack, const Vector &wo, const Vector &wi, SWCSpectrum *const f) const;
00040 float G(const Vector &wo, const Vector &wi, const Vector &wh) const;
00041 virtual bool Sample_f(const TsPack *tspack, const Vector &wi, Vector *sampled_f, float u1, float u2, SWCSpectrum *const f, float *pdf, float *pdfBack = NULL, bool reverse = false) const;
00042 virtual float Pdf(const TsPack *tspack, const Vector &wi, const Vector &wo) const;
00043 private:
00044
00045 const SWCSpectrum KS;
00046 MicrofacetDistribution *distribution;
00047 Fresnel *fresnel;
00048 };
00049
00050 }
00051
00052 #endif // LUX_COOKTORRANCE_H
00053