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_NULLTRANSMISSION_H
00024 #define LUX_NULLTRANSMISSION_H
00025
00026 #include "lux.h"
00027 #include "bxdf.h"
00028 #include "spectrum.h"
00029
00030 namespace lux
00031 {
00032
00033 class NullTransmission : public BxDF {
00034 public:
00035
00036 NullTransmission()
00037 : BxDF(BxDFType(BSDF_TRANSMISSION | BSDF_SPECULAR)) {}
00038 virtual ~NullTransmission() { }
00039 virtual void f(const TsPack *tspack, const Vector &wo, const Vector &wi, SWCSpectrum *const f_) const {
00040 if (Dot(wo,wi) < MachineEpsilon::E(1.f) - 1.f)
00041 *f_ += SWCSpectrum(1.f / fabsf(CosTheta(wi)));
00042 }
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,
00045 bool reverse = false) const;
00046 virtual float Pdf(const TsPack *tspack, const Vector &wo, const Vector &wi) const {
00047 return Dot(wo,wi) < MachineEpsilon::E(1.f) - 1.f ? 1.f : 0.f;
00048 }
00049 private:
00050
00051 };
00052
00053 }
00054
00055 #endif // LUX_NULLTRANSMISSION_H
00056