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