intravenous

annotate src/ship.cc @ 2:472c28b8b875

I think I pretty much nailed the camera
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 21 Apr 2012 23:03:36 +0300
parents 3ea290d35984
children 94d4c60af435
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 }