00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if defined(_MSC_VER)
00025 #pragma once
00026 #endif
00027
00028 #ifndef PBRT_INTEGRATORS_IRRADIANCECACHE_H
00029 #define PBRT_INTEGRATORS_IRRADIANCECACHE_H
00030
00031
00032 #include "pbrt.h"
00033 #include "integrator.h"
00034 #include "octree.h"
00035 #include "parallel.h"
00036
00037
00038 struct IrradianceSample;
00039
00040
00041 class IrradianceCacheIntegrator : public SurfaceIntegrator {
00042 public:
00043
00044 IrradianceCacheIntegrator(float minwt, float minsp, float maxsp,
00045 float maxang, int maxspec, int maxind, int ns) {
00046 minWeight = minwt;
00047 minSamplePixelSpacing = minsp;
00048 maxSamplePixelSpacing = maxsp;
00049 cosMaxSampleAngleDifference = cosf(Degrees(maxang));
00050 nSamples = ns;
00051 maxSpecularDepth = maxspec;
00052 maxIndirectDepth = maxind;
00053 mutex = RWMutex::Create();
00054 lightSampleOffsets = NULL;
00055 bsdfSampleOffsets = NULL;
00056 }
00057 ~IrradianceCacheIntegrator();
00058 Spectrum Li(const Scene *scene, const Renderer *renderer,
00059 const RayDifferential &ray, const Intersection &isect,
00060 const Sample *sample, RNG &rng, MemoryArena &arena) const;
00061 void RequestSamples(Sampler *sampler, Sample *sample, const Scene *scene);
00062 void Preprocess(const Scene *, const Camera *, const Renderer *);
00063 private:
00064
00065 float minSamplePixelSpacing, maxSamplePixelSpacing;
00066 float minWeight, cosMaxSampleAngleDifference;
00067 int nSamples, maxSpecularDepth, maxIndirectDepth;
00068 mutable RWMutex *mutex;
00069
00070
00071 LightSampleOffsets *lightSampleOffsets;
00072 BSDFSampleOffsets *bsdfSampleOffsets;
00073 mutable Octree<IrradianceSample *> *octree;
00074
00075
00076 Spectrum indirectLo(const Point &p, const Normal &ng, float pixelSpacing,
00077 const Vector &wo, float rayEpsilon,BSDF *bsdf, BxDFType flags, RNG &rng,
00078 const Scene *scene, const Renderer *renderer, MemoryArena &arena) const;
00079 bool interpolateE(const Scene *scene,
00080 const Point &p, const Normal &n, Spectrum *E, Vector *wi) const;
00081 Spectrum pathL(Ray &r, const Scene *scene, const Renderer *renderer,
00082 RNG &rng, MemoryArena &arena) const;
00083 };
00084
00085
00086 IrradianceCacheIntegrator *CreateIrradianceCacheIntegrator(const ParamSet ¶ms);
00087
00088 #endif // PBRT_INTEGRATORS_IRRADIANCECACHE_H