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 "lux.h"
00025 #include "transport.h"
00026 #include "scene.h"
00027 #include "mc.h"
00028 #include "octree.h"
00029
00030 namespace lux
00031 {
00032
00033
00034 struct IrradianceSample;
00035 struct IrradProcess;
00036
00037 class IrradianceCache : public SurfaceIntegrator {
00038 public:
00039
00040 IrradianceCache(int maxspec, int maxind, float maxerr, int nsamples);
00041 ~IrradianceCache();
00042 Spectrum Li(const Scene *scene, const RayDifferential &ray, const Sample *sample, float *alpha) const;
00043 void RequestSamples(Sample *sample, const Scene *scene);
00044 void Preprocess(const Scene *);
00045 virtual IrradianceCache* clone() const;
00046 IntegrationSampler* HasIntegrationSampler(IntegrationSampler *is) { return NULL; };
00047 static SurfaceIntegrator *CreateSurfaceIntegrator(const ParamSet ¶ms);
00048 private:
00049
00050 float maxError;
00051 int nSamples;
00052 int maxSpecularDepth, maxIndirectDepth;
00053 mutable int specularDepth;
00054
00055 int *lightSampleOffset, lightNumOffset;
00056 int *bsdfSampleOffset, *bsdfComponentOffset;
00057 mutable Octree<IrradianceSample, IrradProcess> *octree;
00058
00059 Spectrum IndirectLo(const Point &p, const Normal &n,
00060 const Vector &wo, BSDF *bsdf, BxDFType flags,
00061 const Sample *sample, const Scene *scene) const;
00062 bool InterpolateIrradiance(const Scene *scene,
00063 const Point &p, const Normal &n, Spectrum *E) const;
00064 };
00065 struct IrradianceSample {
00066
00067 IrradianceSample() { }
00068 IrradianceSample(const Spectrum &e, const Point &P, const Normal &N,
00069 float md) : E(e), n(N), p(P) {
00070 maxDist = md;
00071 }
00072 Spectrum E;
00073 Normal n;
00074 Point p;
00075 float maxDist;
00076 };
00077 struct IrradProcess {
00078
00079 IrradProcess(const Normal &N, float me) {
00080 n = N;
00081 maxError = me;
00082 nFound = samplesChecked = 0;
00083 sumWt = 0.;
00084 E = 0.;
00085 }
00086 void operator()(const Point &P, const IrradianceSample &sample) const;
00087 bool Successful() {
00088 return (sumWt > 0. && nFound > 0);
00089 }
00090 Spectrum GetIrradiance() const { return E / sumWt; }
00091 Normal n;
00092 float maxError;
00093 mutable int nFound, samplesChecked;
00094 mutable float sumWt;
00095 mutable Spectrum E;
00096 };
00097
00098 }
00099