00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LUX_CAMERA_H
00024 #define LUX_CAMERA_H
00025
00026 #include "lux.h"
00027 #include "geometry/transform.h"
00028 #include "spectrum.h"
00029 #include "error.h"
00030
00031 namespace lux
00032 {
00033
00034 class Camera {
00035 public:
00036
00037 Camera(const Transform &world2cam, float hither, float yon,
00038 float sopen, float sclose, Film *film);
00039 virtual ~Camera();
00040 virtual float GenerateRay(const Sample &sample, Ray *ray) const = 0;
00041 virtual SWCSpectrum Sample_W(const Scene *scene, float u1, float u2, BSDF **bsdf, float *pdf) const {luxError(LUX_BUG, LUX_SEVERE, "Unimplemented Camera::Sample_W"); return 0.f;}
00042 virtual 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 {luxError(LUX_BUG, LUX_SEVERE, "Unimplemented Camera::Sample_W"); return 0.f;}
00043 virtual float Pdf(const Point &p, const Normal &n, const Vector &wi) const {return 0.f;}
00044 virtual void GetSamplePosition(const Point &p, const Vector &wi, float *x, float *y) const {}
00045 virtual bool IsVisibleFromEyes(const Scene *scene, const Point &lenP, const Point &worldP, Sample* sample_gen, Ray *ray_gen) const;
00046 virtual float GetConnectingFactor(const Point &lenP, const Point &worldP, const Vector &wo, const Normal &n) const;
00047 virtual void GetFlux2RadianceFactors(Film *film, float *factors, int xPixelCount, int yPixelCount) const;
00048 virtual bool IsDelta() const;
00049 virtual void SamplePosition(float u1, float u2, Point *p, float *pdf) const;
00050 virtual float EvalPositionPdf() const;
00051 virtual bool Intersect(const Ray &ray, Intersection *isect) const;
00052 virtual void AutoFocus(Scene* scene) { }
00053
00054
00055 Film *film;
00056 protected:
00057
00058 Transform WorldToCamera, CameraToWorld;
00059 float ClipHither, ClipYon;
00060 float ShutterOpen, ShutterClose;
00061 };
00062 class ProjectiveCamera : public Camera {
00063 public:
00064
00065 ProjectiveCamera(const Transform &world2cam,
00066 const Transform &proj, const float Screen[4],
00067 float hither, float yon,
00068 float sopen, float sclose,
00069 float lensr, float focald, Film *film);
00070 protected:
00071 bool GenerateSample(const Point &p, Sample *sample) const;
00072
00073 Transform CameraToScreen, WorldToScreen, RasterToCamera;
00074 Transform ScreenToRaster, RasterToScreen;
00075 Transform WorldToRaster, RasterToWorld;
00076 float LensRadius, FocalDistance;
00077 };
00078
00079 }
00080
00081 #endif // LUX_CAMERA_H