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_SPECULARREFLECTION_H
00024 #define LUX_SPECULARREFLECTION_H
00025
00026 #include "lux.h"
00027 #include "bxdf.h"
00028 #include "spectrum.h"
00029
00030 namespace lux
00031 {
00032
00033 class SpecularReflection : public BxDF {
00034 public:
00035
00036 SpecularReflection(const SWCSpectrum &r, Fresnel *fr, float flm, float flmindex)
00037 : BxDF(BxDFType(BSDF_REFLECTION | BSDF_SPECULAR)),
00038 R(r), fresnel(fr), film(flm), filmindex(flmindex) {
00039 }
00040 virtual ~SpecularReflection() { }
00041 virtual void f(const TsPack *tspack, const Vector &wo, const Vector &wi, SWCSpectrum *const f_) const {
00042
00043 }
00044 virtual bool Sample_f(const TsPack *tspack, const Vector &wo, Vector *wi,
00045 float u1, float u2, SWCSpectrum *const f, float *pdf, float *pdfBack = NULL, bool reverse = false) const;
00046 virtual float Weight(const TsPack *tspack, const Vector &wo) const;
00047 virtual float Pdf(const TsPack *tspack, const Vector &wo, const Vector &wi) const {
00048 return 0.f;
00049 }
00050 private:
00051
00052 SWCSpectrum R;
00053 Fresnel *fresnel;
00054 float film, filmindex;
00055 };
00056
00057 class ArchitecturalReflection : public SpecularReflection {
00058 public:
00059 ArchitecturalReflection(const SWCSpectrum &r, Fresnel *fr, float flm, float flmindex)
00060 : SpecularReflection(r, fr, flm, flmindex) {}
00061 virtual ~ArchitecturalReflection() { }
00062 virtual bool Sample_f(const TsPack *tspack, const Vector &wo, Vector *wi,
00063 float u1, float u2, SWCSpectrum *const f, float *pdf, float *pdfBack = NULL, bool reverse = false) const;
00064 virtual float Weight(const TsPack *tspack, const Vector &wo) const;
00065 };
00066
00067 }
00068
00069 #endif // LUX_SPECULARREFLECTION_H
00070