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 "point.h"
00025 #include "mc.h"
00026 #include "paramset.h"
00027
00028 using namespace lux;
00029
00030
00031 PointLight::PointLight(const Transform &light2world,
00032 const Spectrum &intensity, float gain)
00033 : Light(light2world) {
00034 lightPos = LightToWorld(Point(0,0,0));
00035
00036 LSPD = new RGBIllumSPD(intensity);
00037 LSPD->Scale(gain);
00038 }
00039 SWCSpectrum PointLight::Sample_L(const Point &p, Vector *wi,
00040 VisibilityTester *visibility) const {
00041 *wi = Normalize(lightPos - p);
00042 visibility->SetSegment(p, lightPos);
00043 return SWCSpectrum(LSPD) / DistanceSquared(lightPos, p);
00044 }
00045 SWCSpectrum PointLight::Sample_L(const Point &p, float u1,
00046 float u2, float u3, Vector *wi, float *pdf,
00047 VisibilityTester *visibility) const {
00048 *pdf = 1.f;
00049 return Sample_L(p, wi, visibility);
00050 }
00051 float PointLight::Pdf(const Point &, const Vector &) const {
00052 return 0.;
00053 }
00054 SWCSpectrum PointLight::Sample_L(const Scene *scene, float u1,
00055 float u2, float u3, float u4,
00056 Ray *ray, float *pdf) const {
00057 ray->o = lightPos;
00058 ray->d = UniformSampleSphere(u1, u2);
00059 *pdf = UniformSpherePdf();
00060 return SWCSpectrum(LSPD);
00061 }
00062 Light* PointLight::CreateLight(const Transform &light2world,
00063 const ParamSet ¶mSet) {
00064 Spectrum intensity = paramSet.FindOneSpectrum("I", Spectrum(1.0));
00065 float g = paramSet.FindOneFloat("gain", 1.f);
00066 Point P = paramSet.FindOnePoint("from", Point(0,0,0));
00067 Transform l2w = Translate(Vector(P.x, P.y, P.z)) * light2world;
00068 return new PointLight(l2w, intensity, g);
00069 }