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 "distant.h"
00025 #include "mc.h"
00026 #include "paramset.h"
00027
00028 using namespace lux;
00029
00030
00031 DistantLight::DistantLight(const Transform &light2world,
00032 const Spectrum &radiance, float gain, const Vector &dir)
00033 : Light(light2world) {
00034 lightDir = Normalize(LightToWorld(dir));
00035
00036 LSPD = new RGBIllumSPD(radiance);
00037 LSPD->Scale(gain);
00038 }
00039 SWCSpectrum DistantLight::Sample_L(const Point &p,
00040 Vector *wi, VisibilityTester *visibility) const {
00041 *wi = lightDir;
00042 visibility->SetRay(p, *wi);
00043 return SWCSpectrum(LSPD);
00044 }
00045 SWCSpectrum DistantLight::Sample_L(const Point &p, float u1, float u2, float u3,
00046 Vector *wi, float *pdf, VisibilityTester *visibility) const {
00047 *pdf = 1.f;
00048 return Sample_L(p, wi, visibility);
00049 }
00050 float DistantLight::Pdf(const Point &, const Vector &) const {
00051 return 0.;
00052 }
00053 SWCSpectrum DistantLight::Sample_L(const Scene *scene,
00054 float u1, float u2, float u3, float u4,
00055 Ray *ray, float *pdf) const {
00056
00057 Point worldCenter;
00058 float worldRadius;
00059 scene->WorldBound().BoundingSphere(&worldCenter,
00060 &worldRadius);
00061 Vector v1, v2;
00062 CoordinateSystem(lightDir, &v1, &v2);
00063 float d1, d2;
00064 ConcentricSampleDisk(u1, u2, &d1, &d2);
00065 Point Pdisk =
00066 worldCenter + worldRadius * (d1 * v1 + d2 * v2);
00067
00068 ray->o = Pdisk + worldRadius * lightDir;
00069 ray->d = -lightDir;
00070 *pdf = 1.f / (M_PI * worldRadius * worldRadius);
00071 return SWCSpectrum(LSPD);
00072 }
00073 Light* DistantLight::CreateLight(const Transform &light2world,
00074 const ParamSet ¶mSet) {
00075 Spectrum L = paramSet.FindOneSpectrum("L", Spectrum(1.0));
00076 float g = paramSet.FindOneFloat("gain", 1.f);
00077 Point from = paramSet.FindOnePoint("from", Point(0,0,0));
00078 Point to = paramSet.FindOnePoint("to", Point(0,0,1));
00079 Vector dir = from-to;
00080 return new DistantLight(light2world, L, g, dir);
00081 }