00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "pbrt.h"
00026 #include "light.h"
00027 #include "shape.h"
00028
00029 class PointLight : public Light {
00030 public:
00031
00032 PointLight(const Transform &light2world, const Spectrum &intensity);
00033 Spectrum Sample_L(const Point &p, Vector *wi, VisibilityTester *vis) const;
00034 Spectrum Power(const Scene *) const {
00035 return Intensity * 4.f * M_PI;
00036 }
00037 bool IsDeltaLight() const { return true; }
00038 Spectrum Sample_L(const Point &P, float u1, float u2,
00039 Vector *wo, float *pdf, VisibilityTester *visibility) const;
00040 Spectrum Sample_L(const Scene *scene, float u1, float u2,
00041 float u3, float u4, Ray *ray, float *pdf) const;
00042 float Pdf(const Point &, const Vector &) const;
00043 private:
00044
00045 Point lightPos;
00046 Spectrum Intensity;
00047 };
00048
00049 PointLight::PointLight(const Transform &light2world,
00050 const Spectrum &intensity)
00051 : Light(light2world) {
00052 lightPos = LightToWorld(Point(0,0,0));
00053 Intensity = intensity;
00054 }
00055 Spectrum PointLight::Sample_L(const Point &p, Vector *wi,
00056 VisibilityTester *visibility) const {
00057 *wi = Normalize(lightPos - p);
00058 visibility->SetSegment(p, lightPos);
00059 return Intensity / DistanceSquared(lightPos, p);
00060 }
00061 Spectrum PointLight::Sample_L(const Point &p, float u1,
00062 float u2, Vector *wi, float *pdf,
00063 VisibilityTester *visibility) const {
00064 *pdf = 1.f;
00065 return Sample_L(p, wi, visibility);
00066 }
00067 float PointLight::Pdf(const Point &, const Vector &) const {
00068 return 0.;
00069 }
00070 Spectrum PointLight::Sample_L(const Scene *scene, float u1,
00071 float u2, float u3, float u4,
00072 Ray *ray, float *pdf) const {
00073 ray->o = lightPos;
00074 ray->d = UniformSampleSphere(u1, u2);
00075 *pdf = UniformSpherePdf();
00076 return Intensity;
00077 }
00078 extern "C" DLLEXPORT Light *CreateLight(const Transform &light2world,
00079 const ParamSet ¶mSet) {
00080 Spectrum I = paramSet.FindOneSpectrum("I", Spectrum(1.0));
00081 Point P = paramSet.FindOnePoint("from", Point(0,0,0));
00082 Transform l2w = Translate(Vector(P.x, P.y, P.z)) * light2world;
00083 return new PointLight(l2w, I);
00084 }