symmetry

annotate src/camera.h @ 0:a90a71a74f0b

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 25 Feb 2014 19:53:34 +0200
parents
children
rev   line source
nuclear@0 1 #ifndef CAMERA_H_
nuclear@0 2 #define CAMERA_H_
nuclear@0 3
nuclear@0 4 #include <vmath/vmath.h>
nuclear@0 5
nuclear@0 6 namespace goatgfx {
nuclear@0 7
nuclear@0 8 class Camera {
nuclear@0 9 protected:
nuclear@0 10 float roll;
nuclear@0 11
nuclear@0 12 mutable struct {
nuclear@0 13 bool valid;
nuclear@0 14 Matrix4x4 mat;
nuclear@0 15 } mcache, mcache_inv;
nuclear@0 16
nuclear@0 17 virtual void calc_matrix(Matrix4x4 *mat) const = 0;
nuclear@0 18 virtual void calc_inv_matrix(Matrix4x4 *mat) const;
nuclear@0 19
nuclear@0 20 void inval_cache() { mcache.valid = mcache_inv.valid = false; }
nuclear@0 21 void set_glmat(const Matrix4x4 &m) const;
nuclear@0 22
nuclear@0 23 public:
nuclear@0 24 Camera();
nuclear@0 25 virtual ~Camera();
nuclear@0 26
nuclear@0 27 const Matrix4x4 &matrix() const;
nuclear@0 28 const Matrix4x4 &inv_matrix() const;
nuclear@0 29
nuclear@0 30 void use() const;
nuclear@0 31 void use_inverse() const;
nuclear@0 32
nuclear@0 33 // these do nothing, override to provide input handling
nuclear@0 34 virtual void input_move(float x, float y, float z);
nuclear@0 35 virtual void input_rotate(float x, float y, float z);
nuclear@0 36 virtual void input_zoom(float factor);
nuclear@0 37 };
nuclear@0 38
nuclear@0 39 class OrbitCamera : public Camera {
nuclear@0 40 protected:
nuclear@0 41 float theta, phi, rad;
nuclear@0 42
nuclear@0 43 void calc_matrix(Matrix4x4 *mat) const;
nuclear@0 44 void calc_inv_matrix(Matrix4x4 *mat) const;
nuclear@0 45
nuclear@0 46 public:
nuclear@0 47 OrbitCamera();
nuclear@0 48 virtual ~OrbitCamera();
nuclear@0 49
nuclear@0 50 void input_rotate(float x, float y, float z);
nuclear@0 51 void input_zoom(float factor);
nuclear@0 52 };
nuclear@0 53
nuclear@0 54 class FpsCamera : public OrbitCamera {
nuclear@0 55 protected:
nuclear@0 56 Vector3 pos;
nuclear@0 57
nuclear@0 58 void calc_matrix(Matrix4x4 *mat) const;
nuclear@0 59 void calc_inv_matrix(Matrix4x4 *mat) const;
nuclear@0 60
nuclear@0 61 public:
nuclear@0 62 void input_move(float x, float y, float z);
nuclear@0 63
nuclear@0 64 const Vector3 &get_position() const;
nuclear@0 65 };
nuclear@0 66
nuclear@0 67 class FlyCamera : public Camera {
nuclear@0 68 private:
nuclear@0 69 Vector3 pos;
nuclear@0 70 Quaternion rot;
nuclear@0 71
nuclear@0 72 void calc_matrix(Matrix4x4 *mat) const;
nuclear@0 73 //void calc_inv_matrix(Matrix4x4 *mat) const;
nuclear@0 74
nuclear@0 75 public:
nuclear@0 76 FlyCamera();
nuclear@0 77
nuclear@0 78 const Vector3 &get_position() const;
nuclear@0 79 const Quaternion &get_rotation() const;
nuclear@0 80
nuclear@0 81 void input_move(float x, float y, float z);
nuclear@0 82 void input_rotate(float x, float y, float z);
nuclear@0 83 };
nuclear@0 84
nuclear@0 85
nuclear@0 86 class VRFpsCamera : public FpsCamera {
nuclear@0 87 private:
nuclear@0 88 float neck_eye_dist;
nuclear@0 89 float prev_angles[3];
nuclear@0 90
nuclear@0 91 void calc_matrix(Matrix4x4 *mat) const;
nuclear@0 92 void calc_inv_matrix(Matrix4x4 *mat) const;
nuclear@0 93
nuclear@0 94 public:
nuclear@0 95 VRFpsCamera();
nuclear@0 96
nuclear@0 97 void track_vr();
nuclear@0 98 };
nuclear@0 99
nuclear@0 100 } // namespace goatgfx
nuclear@0 101
nuclear@0 102 #endif // CAMERA_H_