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_CORE_INTEGRATOR_H
00029 #define PBRT_CORE_INTEGRATOR_H
00030
00031
00032 #include "pbrt.h"
00033 #include "primitive.h"
00034 #include "spectrum.h"
00035 #include "light.h"
00036 #include "reflection.h"
00037 #include "sampler.h"
00038 #include "material.h"
00039 #include "probes.h"
00040 #include "renderer.h"
00041
00042
00043 class Integrator {
00044 public:
00045
00046 virtual ~Integrator();
00047 virtual void Preprocess(const Scene *scene, const Camera *camera,
00048 const Renderer *renderer) {
00049 }
00050 virtual void RequestSamples(Sampler *sampler, Sample *sample,
00051 const Scene *scene) {
00052 }
00053 };
00054
00055
00056 class SurfaceIntegrator : public Integrator {
00057 public:
00058
00059 virtual Spectrum Li(const Scene *scene, const Renderer *renderer,
00060 const RayDifferential &ray, const Intersection &isect,
00061 const Sample *sample, RNG &rng, MemoryArena &arena) const = 0;
00062 };
00063
00064
00065 Spectrum UniformSampleAllLights(const Scene *scene, const Renderer *renderer,
00066 MemoryArena &arena, const Point &p, const Normal &n, const Vector &wo,
00067 float rayEpsilon, float time, BSDF *bsdf, const Sample *sample, RNG &rng,
00068 const LightSampleOffsets *lightSampleOffsets,
00069 const BSDFSampleOffsets *bsdfSampleOffsets);
00070 Spectrum UniformSampleOneLight(const Scene *scene, const Renderer *renderer,
00071 MemoryArena &arena, const Point &p, const Normal &n, const Vector &wo,
00072 float rayEpsilon, float time, BSDF *bsdf,
00073 const Sample *sample, RNG &rng, int lightNumOffset = -1,
00074 const LightSampleOffsets *lightSampleOffset = NULL,
00075 const BSDFSampleOffsets *bsdfSampleOffset = NULL);
00076 Spectrum EstimateDirect(const Scene *scene, const Renderer *renderer,
00077 MemoryArena &arena, const Light *light, const Point &p,
00078 const Normal &n, const Vector &wo, float rayEpsilon, float time, const BSDF *bsdf,
00079 RNG &rng, const LightSample &lightSample, const BSDFSample &bsdfSample,
00080 BxDFType flags);
00081 Spectrum SpecularReflect(const RayDifferential &ray, BSDF *bsdf, RNG &rng,
00082 const Intersection &isect, const Renderer *renderer, const Scene *scene,
00083 const Sample *sample, MemoryArena &arena);
00084 Spectrum SpecularTransmit(const RayDifferential &ray, BSDF *bsdf, RNG &rng,
00085 const Intersection &isect, const Renderer *renderer, const Scene *scene,
00086 const Sample *sample, MemoryArena &arena);
00087 Distribution1D *ComputeLightSamplingCDF(const Scene *scene);
00088
00089 #endif // PBRT_CORE_INTEGRATOR_H