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 "goniometric.h"
00027 #include "imagereader.h"
00028 #include "mc.h"
00029 #include "paramset.h"
00030
00031 using namespace lux;
00032
00033
00034 SWCSpectrum GonioPhotometricLight::Sample_L(const Point &p, Vector *wi,
00035 VisibilityTester *visibility) const {
00036 *wi = Normalize(lightPos - p);
00037 visibility->SetSegment(p, lightPos);
00038 return Intensity * Scale(-*wi) / DistanceSquared(lightPos, p);
00039 }
00040 GonioPhotometricLight::GonioPhotometricLight(
00041 const Transform &light2world,
00042 const Spectrum &intensity, const string &texname)
00043 : Light(light2world) {
00044 lightPos = LightToWorld(Point(0,0,0));
00045 Intensity = intensity;
00046
00047 auto_ptr<ImageData> imgdata(ReadImage(texname));
00048 if (imgdata.get()!=NULL) {
00049 mipmap = imgdata->createMIPMap<Spectrum>();
00050 }
00051 else
00052 mipmap = NULL;
00053 }
00054 SWCSpectrum GonioPhotometricLight::Sample_L(const Point &P, float u1, float u2,
00055 float u3, Vector *wo, float *pdf,
00056 VisibilityTester *visibility) const {
00057 *wo = Normalize(lightPos - P);
00058 *pdf = 1.f;
00059 visibility->SetSegment(P, lightPos);
00060 return Intensity * Scale(-*wo) / DistanceSquared(lightPos, P);
00061 }
00062 SWCSpectrum GonioPhotometricLight::Sample_L(const Scene *scene, float u1, float u2,
00063 float u3, float u4, Ray *ray, float *pdf) const {
00064 ray->o = lightPos;
00065 ray->d = UniformSampleSphere(u1, u2);
00066 *pdf = UniformSpherePdf();
00067 return Intensity * Scale(ray->d);
00068 }
00069 float GonioPhotometricLight::Pdf(const Point &, const Vector &) const {
00070 return 0.;
00071 }
00072 Light* GonioPhotometricLight::CreateLight(const Transform &light2world,
00073 const ParamSet ¶mSet) {
00074 Spectrum I = paramSet.FindOneSpectrum("I", Spectrum(1.0));
00075 string texname = paramSet.FindOneString("mapname", "");
00076 return new GonioPhotometricLight(light2world, I, texname);
00077 }