nuclear@1: #ifndef CAMERA_H_ nuclear@1: #define CAMERA_H_ nuclear@1: nuclear@1: #include "vmath/vmath.h" nuclear@1: nuclear@1: class Camera { nuclear@1: protected: nuclear@1: mutable struct { nuclear@1: bool valid; nuclear@1: Matrix4x4 mat; nuclear@1: } mcache, mcache_inv; nuclear@1: nuclear@1: virtual void calc_matrix(Matrix4x4 *mat) const = 0; nuclear@1: virtual void calc_inv_matrix(Matrix4x4 *mat) const; nuclear@1: nuclear@1: void inval_cache() { mcache.valid = mcache_inv.valid = false; } nuclear@1: void set_glmat(const Matrix4x4 &m) const; nuclear@1: nuclear@1: public: nuclear@1: Camera(); nuclear@1: virtual ~Camera(); nuclear@1: nuclear@1: const Matrix4x4 &matrix() const; nuclear@1: const Matrix4x4 &inv_matrix() const; nuclear@1: nuclear@1: void use() const; nuclear@1: void use_inverse() const; nuclear@1: nuclear@1: // these do nothing, override to provide input handling nuclear@1: virtual void input_move(float x, float y, float z); nuclear@1: virtual void input_rotate(float x, float y, float z); nuclear@1: virtual void input_zoom(float factor); nuclear@1: }; nuclear@1: nuclear@1: class OrbitCamera : public Camera { nuclear@1: private: nuclear@1: float theta, phi, rad; nuclear@1: nuclear@1: void calc_matrix(Matrix4x4 *mat) const; nuclear@1: void calc_inv_matrix(Matrix4x4 *mat) const; nuclear@1: nuclear@1: public: nuclear@1: OrbitCamera(); nuclear@1: virtual ~OrbitCamera(); nuclear@1: nuclear@1: void input_rotate(float x, float y, float z); nuclear@1: void input_zoom(float factor); nuclear@1: }; nuclear@1: nuclear@1: class FlyCamera : public Camera { nuclear@1: private: nuclear@1: Vector3 pos; nuclear@1: Quaternion rot; nuclear@1: nuclear@1: void calc_matrix(Matrix4x4 *mat) const; nuclear@1: //void calc_inv_matrix(Matrix4x4 *mat) const; nuclear@1: nuclear@1: public: nuclear@1: FlyCamera(); nuclear@1: nuclear@1: const Vector3 &get_position() const; nuclear@1: const Quaternion &get_rotation() const; nuclear@1: nuclear@1: void input_move(float x, float y, float z); nuclear@1: void input_rotate(float x, float y, float z); nuclear@1: }; nuclear@1: nuclear@1: nuclear@1: #endif // CAMERA_H_