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
|