nuclear@0: #ifndef CAMERA_H_ nuclear@0: #define CAMERA_H_ nuclear@0: nuclear@45: #include nuclear@0: nuclear@0: class Camera { nuclear@0: protected: nuclear@46: Vec3 pos; nuclear@0: float vfov; // vertical field of view in radians nuclear@0: nuclear@46: mutable Mat4x4 cached_matrix; nuclear@0: mutable bool cached_matrix_valid; nuclear@0: nuclear@46: virtual void calc_matrix(Mat4x4 *mat) const = 0; nuclear@0: nuclear@46: Vec2 calc_sample_pos(int x, int y, int xsz, int ysz, int sample) const; nuclear@0: nuclear@0: public: nuclear@0: Camera(); nuclear@46: Camera(const Vec3 &pos); nuclear@0: virtual ~Camera(); nuclear@0: nuclear@0: virtual void set_fov(float vfov); nuclear@0: virtual float get_fov() const; nuclear@0: nuclear@46: virtual void set_position(const Vec3 &pos); nuclear@46: virtual const Vec3 &get_position() const; nuclear@46: virtual const Mat4x4 &get_matrix() const; nuclear@0: nuclear@0: virtual Ray get_primary_ray(int x, int y, int xsz, int ysz, int sample = 0) const; nuclear@0: }; nuclear@0: nuclear@0: class TargetCamera : public Camera { nuclear@0: protected: nuclear@46: Vec3 target; nuclear@0: nuclear@46: void calc_matrix(Mat4x4 *mat) const; nuclear@0: nuclear@0: public: nuclear@0: TargetCamera(); nuclear@46: TargetCamera(const Vec3 &pos, const Vec3 &targ); nuclear@0: nuclear@46: virtual void set_target(const Vec3 &targ); nuclear@46: virtual const Vec3 &get_target() const; nuclear@0: }; nuclear@0: nuclear@0: class FlyCamera : public Camera { nuclear@0: protected: nuclear@46: Quat rot; nuclear@0: nuclear@46: void calc_matrix(Mat4x4 *mat) const; nuclear@0: nuclear@0: public: nuclear@0: void input_move(float x, float y, float z); nuclear@0: void input_rotate(float x, float y, float z); nuclear@0: }; nuclear@0: nuclear@0: #endif // CAMERA_H_