00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "lux.h"
00025 #include "light.h"
00026 #include "texture.h"
00027
00028 namespace lux
00029 {
00030
00031
00032 class SpotLight : public Light {
00033 public:
00034
00035 SpotLight(const Transform &light2world, const boost::shared_ptr< Texture<SWCSpectrum> > L,
00036 float gain, float width, float fall);
00037 virtual ~SpotLight();
00038 virtual bool IsDeltaLight() const { return true; }
00039 virtual bool IsEnvironmental() const { return false; }
00040 float Falloff(const Vector &w) const;
00041 virtual SWCSpectrum Power(const TsPack *tspack, const Scene *) const {
00042 return Lbase->Evaluate(tspack, dummydg) * gain * 2.f * M_PI *
00043 (1.f - .5f * (cosFalloffStart + cosTotalWidth));
00044 }
00045 virtual SWCSpectrum Sample_L(const TsPack *tspack, const Point &P, float u1, float u2, float u3,
00046 Vector *wo, float *pdf, VisibilityTester *visibility) const;
00047 virtual SWCSpectrum Sample_L(const TsPack *tspack, const Scene *scene, float u1, float u2,
00048 float u3, float u4, Ray *ray, float *pdf) const;
00049 virtual float Pdf(const Point &, const Vector &) const;
00050 virtual float Pdf(const Point &p, const Normal &n,
00051 const Point &po, const Normal &ns) const;
00052 virtual bool Sample_L(const TsPack *tspack, const Scene *scene, float u1, float u2, float u3, BSDF **bsdf, float *pdf, SWCSpectrum *Le) const;
00053 virtual bool Sample_L(const TsPack *tspack, const Scene *scene, const Point &p, const Normal &n,
00054 float u1, float u2, float u3, BSDF **bsdf, float *pdf, float *pdfDirect,
00055 VisibilityTester *visibility, SWCSpectrum *Le) const;
00056 virtual SWCSpectrum Le(const TsPack *tspack, const Scene *scene, const Ray &r,
00057 const Normal &n, BSDF **bsdf, float *pdf, float *pdfDirect) const;
00058
00059 static Light *CreateLight(const Transform &light2world,
00060 const ParamSet ¶mSet, const TextureParams &tp);
00061 private:
00062
00063 float cosTotalWidth, cosFalloffStart;
00064 Point lightPos;
00065 boost::shared_ptr< Texture<SWCSpectrum> > Lbase;
00066 DifferentialGeometry dummydg;
00067 float gain;
00068 };
00069
00070 }
00071