intravenous

annotate src/ship.cc @ 3:94d4c60af435

some progress
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 22 Apr 2012 03:35:18 +0300
parents 472c28b8b875
children 2723dc026c4f
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 }