rev |
line source |
nuclear@1
|
1 #include "opengl.h"
|
nuclear@1
|
2 #include "ship.h"
|
nuclear@1
|
3
|
nuclear@1
|
4 Ship::Ship()
|
nuclear@1
|
5 {
|
nuclear@1
|
6 friction = 0.2;
|
nuclear@1
|
7 }
|
nuclear@1
|
8
|
nuclear@1
|
9 void Ship::accelerate(double a)
|
nuclear@1
|
10 {
|
nuclear@1
|
11 velocity += get_direction() * a;
|
nuclear@1
|
12 }
|
nuclear@1
|
13
|
nuclear@1
|
14 void Ship::turn(double yaw, double pitch)
|
nuclear@1
|
15 {
|
nuclear@1
|
16 Quaternion qyaw(Vector3(0, 1, 0), yaw);
|
nuclear@1
|
17 Quaternion qpitch(Vector3(1, 0, 0), pitch);
|
nuclear@1
|
18
|
nuclear@1
|
19 rot *= qpitch;
|
nuclear@1
|
20 rot *= qyaw;
|
nuclear@1
|
21 }
|
nuclear@1
|
22
|
nuclear@1
|
23 void Ship::update(time_sec_t dt)
|
nuclear@1
|
24 {
|
nuclear@1
|
25 pos += velocity * dt;
|
nuclear@1
|
26 velocity -= velocity * friction * dt;
|
nuclear@1
|
27 }
|
nuclear@1
|
28
|
nuclear@1
|
29 const Vector3 &Ship::get_position() const
|
nuclear@1
|
30 {
|
nuclear@1
|
31 return pos;
|
nuclear@1
|
32 }
|
nuclear@1
|
33
|
nuclear@1
|
34 Vector3 Ship::get_direction() const
|
nuclear@1
|
35 {
|
nuclear@2
|
36 static const Vector3 dir{0, 0, -1};
|
nuclear@1
|
37 return dir.transformed(rot);
|
nuclear@1
|
38 }
|
nuclear@1
|
39
|
nuclear@1
|
40 Matrix4x4 Ship::get_matrix() const
|
nuclear@1
|
41 {
|
nuclear@2
|
42 Matrix3x3 rmat = rot.get_rotation_matrix().transposed();
|
nuclear@2
|
43 Matrix4x4 tmat;
|
nuclear@2
|
44 tmat.set_translation(pos);
|
nuclear@2
|
45
|
nuclear@2
|
46 return tmat * Matrix4x4(rmat);
|
nuclear@1
|
47 }
|
nuclear@1
|
48
|
nuclear@1
|
49 void Ship::dbg_draw() const
|
nuclear@1
|
50 {
|
nuclear@1
|
51 glPushAttrib(GL_POINT_BIT | GL_ENABLE_BIT);
|
nuclear@1
|
52
|
nuclear@1
|
53 glPointSize(3.0);
|
nuclear@1
|
54 glDisable(GL_LIGHTING);
|
nuclear@1
|
55
|
nuclear@1
|
56 glBegin(GL_LINES);
|
nuclear@1
|
57 glColor3f(0, 0, 1);
|
nuclear@1
|
58 glVertex3f(pos.x, pos.y, pos.z);
|
nuclear@1
|
59
|
nuclear@1
|
60 Vector3 end = pos + get_direction();
|
nuclear@1
|
61 glVertex3f(end.x, end.y, end.z);
|
nuclear@1
|
62 glEnd();
|
nuclear@1
|
63
|
nuclear@1
|
64 glBegin(GL_POINTS);
|
nuclear@1
|
65 glColor3f(1, 0, 0);
|
nuclear@1
|
66 glVertex3f(pos.x, pos.y, pos.z);
|
nuclear@1
|
67 glEnd();
|
nuclear@1
|
68
|
nuclear@2
|
69 glMatrixMode(GL_MODELVIEW);
|
nuclear@2
|
70 glPushMatrix();
|
nuclear@2
|
71 mult_gl_matrix(get_matrix());
|
nuclear@2
|
72
|
nuclear@2
|
73 glScalef(1, 1, -1);
|
nuclear@2
|
74 glColor3f(1, 1, 0);
|
nuclear@2
|
75 glutWireCone(0.1, 0.6, 12, 2);
|
nuclear@2
|
76
|
nuclear@2
|
77 glPopMatrix();
|
nuclear@2
|
78
|
nuclear@1
|
79 glPopAttrib();
|
nuclear@1
|
80 }
|