nuclear@0: #ifndef CAMERA_H_ nuclear@0: #define CAMERA_H_ nuclear@0: nuclear@0: #include nuclear@0: nuclear@0: namespace goatgfx { nuclear@0: nuclear@0: class Camera { nuclear@0: protected: nuclear@0: float roll; nuclear@0: nuclear@0: mutable struct { nuclear@0: bool valid; nuclear@0: Matrix4x4 mat; nuclear@0: } mcache, mcache_inv; nuclear@0: nuclear@0: virtual void calc_matrix(Matrix4x4 *mat) const = 0; nuclear@0: virtual void calc_inv_matrix(Matrix4x4 *mat) const; nuclear@0: nuclear@0: void inval_cache() { mcache.valid = mcache_inv.valid = false; } nuclear@0: void set_glmat(const Matrix4x4 &m) const; nuclear@0: nuclear@0: public: nuclear@0: Camera(); nuclear@0: virtual ~Camera(); nuclear@0: nuclear@0: const Matrix4x4 &matrix() const; nuclear@0: const Matrix4x4 &inv_matrix() const; nuclear@0: nuclear@0: void use() const; nuclear@0: void use_inverse() const; nuclear@0: nuclear@0: // these do nothing, override to provide input handling nuclear@0: virtual void input_move(float x, float y, float z); nuclear@0: virtual void input_rotate(float x, float y, float z); nuclear@0: virtual void input_zoom(float factor); nuclear@0: }; nuclear@0: nuclear@0: class OrbitCamera : public Camera { nuclear@0: protected: nuclear@0: float theta, phi, rad; nuclear@0: nuclear@0: void calc_matrix(Matrix4x4 *mat) const; nuclear@0: void calc_inv_matrix(Matrix4x4 *mat) const; nuclear@0: nuclear@0: public: nuclear@0: OrbitCamera(); nuclear@0: virtual ~OrbitCamera(); nuclear@0: nuclear@0: void input_rotate(float x, float y, float z); nuclear@0: void input_zoom(float factor); nuclear@0: }; nuclear@0: nuclear@0: class FpsCamera : public OrbitCamera { nuclear@0: protected: nuclear@0: Vector3 pos; nuclear@0: nuclear@0: void calc_matrix(Matrix4x4 *mat) const; nuclear@0: void calc_inv_matrix(Matrix4x4 *mat) const; nuclear@0: nuclear@0: public: nuclear@0: void input_move(float x, float y, float z); nuclear@0: nuclear@0: const Vector3 &get_position() const; nuclear@0: }; nuclear@0: nuclear@0: class FlyCamera : public Camera { nuclear@0: private: nuclear@0: Vector3 pos; nuclear@0: Quaternion rot; nuclear@0: nuclear@0: void calc_matrix(Matrix4x4 *mat) const; nuclear@0: //void calc_inv_matrix(Matrix4x4 *mat) const; nuclear@0: nuclear@0: public: nuclear@0: FlyCamera(); nuclear@0: nuclear@0: const Vector3 &get_position() const; nuclear@0: const Quaternion &get_rotation() const; nuclear@0: 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: nuclear@0: class VRFpsCamera : public FpsCamera { nuclear@0: private: nuclear@0: float neck_eye_dist; nuclear@0: float prev_angles[3]; nuclear@0: nuclear@0: void calc_matrix(Matrix4x4 *mat) const; nuclear@0: void calc_inv_matrix(Matrix4x4 *mat) const; nuclear@0: nuclear@0: public: nuclear@0: VRFpsCamera(); nuclear@0: nuclear@0: void track_vr(); nuclear@0: }; nuclear@0: nuclear@0: } // namespace goatgfx nuclear@0: nuclear@0: #endif // CAMERA_H_