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_SPECULARTRANSMISSION_H
00024 #define LUX_SPECULARTRANSMISSION_H
00025
00026 #include "lux.h"
00027 #include "bxdf.h"
00028 #include "spectrum.h"
00029 #include "fresneldielectric.h"
00030
00031 namespace lux
00032 {
00033
00034 class SpecularTransmission : public BxDF {
00035 public:
00036
00037 SpecularTransmission(const SWCSpectrum &t, Fresnel *fr, bool disp, bool archi = false)
00038 : BxDF(BxDFType(BSDF_TRANSMISSION | BSDF_SPECULAR)),
00039 T(t), dispersive(disp), architectural(archi),
00040 fresnel(fr) {}
00041 virtual ~SpecularTransmission() { }
00042 virtual void f(const TsPack *tspack, const Vector &wo, const Vector &wi, SWCSpectrum *const f) const;
00043 virtual bool Sample_f(const TsPack *tspack, const Vector &wo, Vector *wi,
00044 float u1, float u2, SWCSpectrum *const f, float *pdf, float *pdfBack = NULL, bool reverse = false) const;
00045 virtual float Weight(const TsPack *tspack, const Vector &wo) const;
00046 virtual float Pdf(const TsPack *tspack, const Vector &wo, const Vector &wi) const {
00047 return (architectural && Dot(wo, wi) < MachineEpsilon::E(1.f) - 1.f) ? 1.f : 0.f;
00048 }
00049 private:
00050
00051 SWCSpectrum T;
00052 bool dispersive, architectural;
00053 Fresnel *fresnel;
00054 };
00055
00056 }
00057
00058 #endif // LUX_SPECULARTRANSMISSION_H
00059