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 "camera.h"
00025
00026 namespace lux
00027 {
00028
00029
00030 class PerspectiveCamera : public ProjectiveCamera {
00031 public:
00032
00033 PerspectiveCamera(const Transform &world2camStart,
00034 const Transform &world2camEnd,
00035 const float Screen[4], float hither, float yon,
00036 float sopen, float sclose, int sdist,
00037 float lensr, float focald, bool autofocus, float fov,
00038 int distribution, int shape, int power,
00039 Film *film);
00040 virtual ~PerspectiveCamera() { }
00041 virtual float GenerateRay(const Sample &sample, Ray *) const;
00042 virtual bool Sample_W(const TsPack *tspack, const Scene *scene, float u1, float u2, float u3, BSDF **bsdf, float *pdf, SWCSpectrum *We) const;
00043 virtual bool Sample_W(const TsPack *tspack, const Scene *scene, const Point &p, const Normal &n, float u1, float u2, float u3, BSDF **bsdf, float *pdf, float *pdfDirect, VisibilityTester *visibility, SWCSpectrum *We) const;
00044 virtual bool GetSamplePosition(const Point &p, const Vector &wi, float distance, float *x, float *y) const;
00045 virtual void ClampRay(Ray &ray) const;
00046 virtual bool IsDelta() const { return LensRadius == 0.f; }
00047 virtual BBox Bounds() const;
00048 virtual void AutoFocus(Scene* scene);
00049 void SampleLens(float u1, float u2, float *dx, float *dy) const;
00050
00051 virtual PerspectiveCamera* Clone() const {
00052 return new PerspectiveCamera(*this);
00053 }
00054
00055 static Camera *CreateCamera(const Transform &world2camStart, const Transform &world2camEnd, const ParamSet ¶ms, Film *film);
00056
00057 private:
00058 Point pos;
00059 Normal normal;
00060 Transform RasterToCameraBidir, WorldToRasterBidir;
00061 float fov;
00062 float posPdf;
00063 float xStart, xEnd, yStart, yEnd;
00064 float R, xPixelWidth, yPixelHeight, Apixel;
00065 int distribution, shape, power;
00066
00067
00068 bool autoFocus;
00069
00070 boost::shared_ptr<Shape> lens;
00071 };
00072
00073 }