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