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 *f)
00037 : BxDF(BxDFType(BSDF_REFLECTION | BSDF_SPECULAR)),
00038 R(r), fresnel(f) {
00039 }
00040 SWCSpectrum f(const Vector &, const Vector &) const {
00041 return SWCSpectrum(0.);
00042 }
00043 virtual SWCSpectrum Sample_f(const Vector &wo, Vector *wi,
00044 float u1, float u2, float *pdf, float *pdfBack = NULL) const;
00045 float Pdf(const Vector &wo, const Vector &wi) const {
00046 return 0.;
00047 }
00048 private:
00049
00050 SWCSpectrum R;
00051 Fresnel *fresnel;
00052 };
00053
00054 class ArchitecturalReflection : public SpecularReflection {
00055 public:
00056 ArchitecturalReflection(const SWCSpectrum &r, Fresnel *f)
00057 : SpecularReflection(r, f) {}
00058 SWCSpectrum Sample_f(const Vector &wo, Vector *wi,
00059 float u1, float u2, float *pdf, float *pdfBack = NULL) const;
00060 };
00061
00062 }
00063
00064 #endif // LUX_SPECULARREFLECTION_H
00065