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 "motionsystem.h"
00029 #include "error.h"
00030
00031 namespace lux
00032 {
00033
00034 class Camera {
00035 public:
00036
00037 Camera(const Transform &w2cstart, const Transform &w2cend, float hither, float yon,
00038 float sopen, float sclose, int sdist, Film *film);
00039 virtual ~Camera();
00040 virtual float GenerateRay(const Sample &sample, Ray *ray) const = 0;
00041 virtual bool Sample_W(const TsPack *tspack, const Scene *scene, float u1, float u2, float u3, BSDF **bsdf, float *pdf, SWCSpectrum *We) const {
00042 if (!warnOnce)
00043 luxError(LUX_BUG, LUX_SEVERE, "Unimplemented Camera::Sample_W");
00044 warnOnce = true;
00045 return false;
00046 }
00047 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 {
00048 if (!warnOnce)
00049 luxError(LUX_BUG, LUX_SEVERE, "Unimplemented Camera::Sample_W");
00050 warnOnce = true;
00051 return false;
00052 }
00053 virtual bool GetSamplePosition(const Point &p, const Vector &wi, float distance, float *x, float *y) const { return false; }
00054 virtual void ClampRay(Ray &ray) const { }
00055 virtual bool IsDelta() const;
00056 virtual bool IsLensBased() const { return true; }
00057 virtual void AutoFocus(Scene* scene) { }
00058 virtual BBox Bounds() const { return BBox(); }
00059
00060 float GetTime(float u1) const;
00061
00062 virtual void SampleMotion(float time);
00063
00064 virtual Camera* Clone() const = 0;
00065
00066
00067 Film *film;
00068 protected:
00069
00070 Transform WorldToCamera, CameraToWorld;
00071 MotionSystem CameraMotion;
00072 float ClipHither, ClipYon;
00073 float ShutterOpen, ShutterClose;
00074 int ShutterDistribution;
00075 mutable bool warnOnce;
00076 };
00077 class ProjectiveCamera : public Camera {
00078 public:
00079
00080 ProjectiveCamera(const Transform &world2cam,
00081 const Transform &world2camEnd,
00082 const Transform &proj, const float Screen[4],
00083 float hither, float yon,
00084 float sopen, float sclose, int sdist,
00085 float lensr, float focald, Film *film);
00086
00087 void SampleMotion(float time);
00088
00089 protected:
00090 bool GenerateSample(const Point &p, Sample *sample) const;
00091
00092 Transform CameraToScreen, WorldToScreen, RasterToCamera;
00093 Transform ScreenToRaster, RasterToScreen;
00094 Transform WorldToRaster, RasterToWorld;
00095 float LensRadius, FocalDistance;
00096 };
00097
00098 }
00099
00100 #endif // LUX_CAMERA_H