symmetry

annotate src/camera.cc @ 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 #include "opengl.h"
nuclear@0 2 #include "camera.h"
nuclear@0 3 //#include "unistate.h"
nuclear@0 4 #include "vr.h"
nuclear@0 5
nuclear@0 6 using namespace goatgfx;
nuclear@0 7
nuclear@0 8 Camera::Camera()
nuclear@0 9 {
nuclear@0 10 roll = 0.0;
nuclear@0 11 inval_cache();
nuclear@0 12 }
nuclear@0 13
nuclear@0 14 Camera::~Camera()
nuclear@0 15 {
nuclear@0 16 }
nuclear@0 17
nuclear@0 18 void Camera::calc_inv_matrix(Matrix4x4 *mat) const
nuclear@0 19 {
nuclear@0 20 *mat = matrix().inverse();
nuclear@0 21 }
nuclear@0 22
nuclear@0 23 const Matrix4x4 &Camera::matrix() const
nuclear@0 24 {
nuclear@0 25 if(!mcache.valid) {
nuclear@0 26 calc_matrix(&mcache.mat);
nuclear@0 27 mcache.valid = true;
nuclear@0 28 }
nuclear@0 29 return mcache.mat;
nuclear@0 30 }
nuclear@0 31
nuclear@0 32 const Matrix4x4 &Camera::inv_matrix() const
nuclear@0 33 {
nuclear@0 34 if(!mcache_inv.valid) {
nuclear@0 35 calc_inv_matrix(&mcache_inv.mat);
nuclear@0 36 mcache_inv.valid = true;
nuclear@0 37 }
nuclear@0 38 return mcache_inv.mat;
nuclear@0 39 }
nuclear@0 40
nuclear@0 41 void Camera::use() const
nuclear@0 42 {
nuclear@0 43 //set_view_matrix(matrix());
nuclear@0 44 mult_matrix(matrix());
nuclear@0 45 }
nuclear@0 46
nuclear@0 47 void Camera::use_inverse() const
nuclear@0 48 {
nuclear@0 49 //set_view_matrix(inv_matrix());
nuclear@0 50 mult_matrix(inv_matrix());
nuclear@0 51 }
nuclear@0 52
nuclear@0 53 void Camera::input_move(float x, float y, float z)
nuclear@0 54 {
nuclear@0 55 }
nuclear@0 56
nuclear@0 57 void Camera::input_rotate(float x, float y, float z)
nuclear@0 58 {
nuclear@0 59 }
nuclear@0 60
nuclear@0 61 void Camera::input_zoom(float factor)
nuclear@0 62 {
nuclear@0 63 }
nuclear@0 64
nuclear@0 65
nuclear@0 66 // ---- orbit camera ----
nuclear@0 67
nuclear@0 68 OrbitCamera::OrbitCamera()
nuclear@0 69 {
nuclear@0 70 theta = 0.0;
nuclear@0 71 phi = 0.0;
nuclear@0 72 rad = 10.0;
nuclear@0 73 }
nuclear@0 74
nuclear@0 75 OrbitCamera::~OrbitCamera()
nuclear@0 76 {
nuclear@0 77 }
nuclear@0 78
nuclear@0 79 void OrbitCamera::calc_matrix(Matrix4x4 *mat) const
nuclear@0 80 {
nuclear@0 81 mat->reset_identity();
nuclear@0 82 mat->translate(Vector3(0, 0, -rad));
nuclear@0 83 mat->rotate(Vector3(phi, 0, 0));
nuclear@0 84 mat->rotate(Vector3(0, theta, 0));
nuclear@0 85 mat->rotate(Vector3(0, 0, roll));
nuclear@0 86 }
nuclear@0 87
nuclear@0 88 void OrbitCamera::calc_inv_matrix(Matrix4x4 *mat) const
nuclear@0 89 {
nuclear@0 90 mat->reset_identity();
nuclear@0 91 mat->rotate(Vector3(0, 0, roll));
nuclear@0 92 mat->rotate(Vector3(0, theta, 0));
nuclear@0 93 mat->rotate(Vector3(phi, 0, 0));
nuclear@0 94 mat->translate(Vector3(0, 0, -rad));
nuclear@0 95 }
nuclear@0 96
nuclear@0 97 void OrbitCamera::input_rotate(float x, float y, float z)
nuclear@0 98 {
nuclear@0 99 theta += y;
nuclear@0 100 phi += x;
nuclear@0 101 roll += z;
nuclear@0 102
nuclear@0 103 if(phi < -M_PI / 2)
nuclear@0 104 phi = -M_PI / 2;
nuclear@0 105 if(phi > M_PI)
nuclear@0 106 phi = M_PI;
nuclear@0 107
nuclear@0 108 inval_cache();
nuclear@0 109 }
nuclear@0 110
nuclear@0 111 void OrbitCamera::input_zoom(float factor)
nuclear@0 112 {
nuclear@0 113 rad += factor;
nuclear@0 114 if(rad < 0.0)
nuclear@0 115 rad = 0.0;
nuclear@0 116
nuclear@0 117 inval_cache();
nuclear@0 118 }
nuclear@0 119
nuclear@0 120 void FpsCamera::calc_matrix(Matrix4x4 *mat) const
nuclear@0 121 {
nuclear@0 122 mat->reset_identity();
nuclear@0 123 mat->translate(Vector3(pos.x, pos.y, pos.z));
nuclear@0 124 mat->rotate(Vector3(0, theta, 0));
nuclear@0 125 mat->rotate(Vector3(phi, 0, 0));
nuclear@0 126 mat->rotate(Vector3(0, 0, roll));
nuclear@0 127 }
nuclear@0 128
nuclear@0 129 void FpsCamera::calc_inv_matrix(Matrix4x4 *mat) const
nuclear@0 130 {
nuclear@0 131 mat->reset_identity();
nuclear@0 132 mat->rotate(Vector3(0, 0, roll));
nuclear@0 133 mat->rotate(Vector3(phi, 0, 0));
nuclear@0 134 mat->rotate(Vector3(0, theta, 0));
nuclear@0 135 mat->translate(Vector3(-pos.x, -pos.y, -pos.z));
nuclear@0 136 }
nuclear@0 137
nuclear@0 138 void FpsCamera::input_move(float x, float y, float z)
nuclear@0 139 {
nuclear@0 140 pos.x += x * cos(theta) - z * sin(theta);
nuclear@0 141 pos.z += x * sin(theta) + z * cos(theta);
nuclear@0 142 pos.y += y;
nuclear@0 143 inval_cache();
nuclear@0 144 }
nuclear@0 145
nuclear@0 146 const Vector3 &FpsCamera::get_position() const
nuclear@0 147 {
nuclear@0 148 return pos;
nuclear@0 149 }
nuclear@0 150
nuclear@0 151
nuclear@0 152 FlyCamera::FlyCamera()
nuclear@0 153 {
nuclear@0 154 pos.z = 10.0f;
nuclear@0 155 }
nuclear@0 156
nuclear@0 157 void FlyCamera::calc_matrix(Matrix4x4 *mat) const
nuclear@0 158 {
nuclear@0 159 Matrix3x3 rmat = rot.get_rotation_matrix().transposed();
nuclear@0 160 Matrix4x4 tmat;
nuclear@0 161 tmat.set_translation(pos);
nuclear@0 162 *mat = tmat * Matrix4x4(rmat);
nuclear@0 163 }
nuclear@0 164
nuclear@0 165 /*void FlyCamera::calc_inv_matrix(Matrix4x4 *mat) const
nuclear@0 166 {
nuclear@0 167 }*/
nuclear@0 168
nuclear@0 169 const Vector3 &FlyCamera::get_position() const
nuclear@0 170 {
nuclear@0 171 return pos;
nuclear@0 172 }
nuclear@0 173
nuclear@0 174 const Quaternion &FlyCamera::get_rotation() const
nuclear@0 175 {
nuclear@0 176 return rot;
nuclear@0 177 }
nuclear@0 178
nuclear@0 179 void FlyCamera::input_move(float x, float y, float z)
nuclear@0 180 {
nuclear@0 181 static const Vector3 vfwd(0, 0, 1), vright(1, 0, 0);
nuclear@0 182
nuclear@0 183 Vector3 k = vfwd.transformed(rot);
nuclear@0 184 Vector3 i = vright.transformed(rot);
nuclear@0 185 Vector3 j = cross_product(k, i);
nuclear@0 186
nuclear@0 187 pos += i * x + j * y + k * z;
nuclear@0 188 inval_cache();
nuclear@0 189 }
nuclear@0 190
nuclear@0 191 void FlyCamera::input_rotate(float x, float y, float z)
nuclear@0 192 {
nuclear@0 193 Vector3 axis(x, y, z);
nuclear@0 194 float axis_len = axis.length();
nuclear@0 195 rot.rotate(axis / axis_len, axis_len);
nuclear@0 196 rot.normalize();
nuclear@0 197
nuclear@0 198 inval_cache();
nuclear@0 199 }
nuclear@0 200
nuclear@0 201
nuclear@0 202 // --- VR additions ---
nuclear@0 203 VRFpsCamera::VRFpsCamera()
nuclear@0 204 {
nuclear@0 205 neck_eye_dist = 0.14; // default neck->eye distance 14cm
nuclear@0 206 }
nuclear@0 207
nuclear@0 208 void VRFpsCamera::calc_matrix(Matrix4x4 *mat) const
nuclear@0 209 {
nuclear@0 210 mat->reset_identity();
nuclear@0 211 mat->translate(Vector3(pos.x, pos.y, pos.z));
nuclear@0 212 mat->rotate(Vector3(0, theta, 0));
nuclear@0 213 mat->rotate(Vector3(phi, 0, 0));
nuclear@0 214 mat->rotate(Vector3(0, 0, roll));
nuclear@0 215 mat->translate(Vector3(0, neck_eye_dist, 0));
nuclear@0 216 }
nuclear@0 217
nuclear@0 218 void VRFpsCamera::calc_inv_matrix(Matrix4x4 *mat) const
nuclear@0 219 {
nuclear@0 220 mat->reset_identity();
nuclear@0 221 mat->translate(Vector3(0, -neck_eye_dist, 0));
nuclear@0 222 mat->rotate(Vector3(0, 0, roll));
nuclear@0 223 mat->rotate(Vector3(phi, 0, 0));
nuclear@0 224 mat->rotate(Vector3(0, theta, 0));
nuclear@0 225 mat->translate(Vector3(-pos.x, -pos.y, -pos.z));
nuclear@0 226 }
nuclear@0 227
nuclear@0 228 void VRFpsCamera::track_vr()
nuclear@0 229 {
nuclear@0 230 float euler[3];
nuclear@0 231 vr_get_rotation_euler(euler);
nuclear@0 232
nuclear@0 233 // input_rotate invalidates cache
nuclear@0 234 input_rotate(prev_angles[0] - euler[0], prev_angles[1] - euler[1], prev_angles[2] - euler[2]);
nuclear@0 235
nuclear@0 236 prev_angles[0] = euler[0];
nuclear@0 237 prev_angles[1] = euler[1];
nuclear@0 238 prev_angles[2] = euler[2];
nuclear@0 239 }
nuclear@0 240