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 #include "spectrum.h"
00026 #include "sampling.h"
00027 #include "mc.h"
00028
00029 namespace lux
00030 {
00031
00032
00033 class PerspectiveCamera : public ProjectiveCamera {
00034 public:
00035
00036 PerspectiveCamera(const Transform &world2cam,
00037 const float Screen[4], float hither, float yon,
00038 float sopen, float sclose,
00039 float lensr, float focald, bool autofocus, float fov,
00040 Film *film);
00041 float GenerateRay(const Sample &sample, Ray *) const;
00042 SWCSpectrum Sample_W(const Scene *scene, float u1, float u2, BSDF **bsdf, float *pdf) const;
00043 SWCSpectrum Sample_W(const Scene *scene, const Point &p, const Normal &n, float u1, float u2, BSDF **bsdf, float *pdf, float *pdfDirect, VisibilityTester *visibility) const;
00044 float Pdf(const Point &p, const Normal &n, const Vector &wi) const;
00045 void GetSamplePosition(const Point &p, const Vector &wi, float *x, float *y) const;
00046 bool IsVisibleFromEyes(const Scene *scene, const Point &lenP, const Point &worldP, Sample* sample_gen, Ray *ray_gen) const;
00047 float GetConnectingFactor(const Point &lenP, const Point &worldP, const Vector &wo, const Normal &n) const;
00048 void GetFlux2RadianceFactors(Film *film, float *factors, int xPixelCount, int yPixelCount) const;
00049 bool IsDelta() const
00050 {
00051 return LensRadius==0.0f;
00052 }
00053 bool Intersect(const Ray &ray, Intersection *isect) const;
00054 void SamplePosition(float u1, float u2, Point *p, float *pdf) const;
00055 float EvalPositionPdf() const;
00056 void AutoFocus(Scene* scene);
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 static Camera *CreateCamera(const ParamSet ¶ms, const Transform &world2cam, Film *film);
00090
00091 private:
00092 Point pos;
00093 Normal normal;
00094 float fov;
00095 float posPdf;
00096 float screen[4];
00097 float R,xWidth,yHeight,xPixelWidth,yPixelHeight,Apixel;
00098
00099
00100 bool autoFocus;
00101
00102 boost::shared_ptr<Shape> lens;
00103 };
00104
00105 }