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
00026 #include "stdafx.h"
00027 #include "lights/goniometric.h"
00028 #include "paramset.h"
00029 #include "montecarlo.h"
00030 #include "imageio.h"
00031
00032
00033 Spectrum GonioPhotometricLight::Sample_L(const Point &p, float pEpsilon,
00034 const LightSample &ls, float time, Vector *wi, float *pdf, VisibilityTester *visibility) const {
00035 *wi = Normalize(lightPos - p);
00036 *pdf = 1.f;
00037 visibility->SetSegment(p, pEpsilon, lightPos, 0., time);
00038 return Intensity * Scale(-*wi) / DistanceSquared(lightPos, p);
00039 }
00040
00041
00042 GonioPhotometricLight::GonioPhotometricLight(const Transform &light2world,
00043 const Spectrum &intensity, const string &texname)
00044 : Light(light2world) {
00045 lightPos = LightToWorld(Point(0,0,0));
00046 Intensity = intensity;
00047
00048 int width, height;
00049 RGBSpectrum *texels = ReadImage(texname, &width, &height);
00050 if (texels) {
00051 mipmap = new MIPMap<RGBSpectrum>(width, height, texels);
00052 delete[] texels;
00053 }
00054 else mipmap = NULL;
00055 }
00056
00057
00058 Spectrum GonioPhotometricLight::Power(const Scene *) const {
00059 return 4.f * M_PI * Intensity *
00060 Spectrum(mipmap ? mipmap->Lookup(.5f, .5f, .5f) : 1.f, SPECTRUM_ILLUMINANT);
00061 }
00062
00063
00064 GonioPhotometricLight *CreateGoniometricLight(const Transform &light2world,
00065 const ParamSet ¶mSet) {
00066 Spectrum I = paramSet.FindOneSpectrum("I", Spectrum(1.0));
00067 Spectrum sc = paramSet.FindOneSpectrum("scale", Spectrum(1.0));
00068 string texname = paramSet.FindOneString("mapname", "");
00069 return new GonioPhotometricLight(light2world, I * sc, texname);
00070 }
00071
00072
00073 Spectrum GonioPhotometricLight::Sample_L(const Scene *scene, const LightSample &ls,
00074 float u1, float u2, float time, Ray *ray, Normal *Ns, float *pdf) const {
00075 *ray = Ray(lightPos, UniformSampleSphere(ls.uPos[0], ls.uPos[1]), 0.f, INFINITY, time);
00076 *Ns = (Normal)ray->d;
00077 *pdf = UniformSpherePdf();
00078 return Intensity * Scale(ray->d);
00079 }
00080
00081
00082 float GonioPhotometricLight::Pdf(const Point &, const Vector &) const {
00083 return 0.;
00084 }
00085
00086