Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision 4f3262fbb197a9d1018a6b3e0a52f8a9bcf81131)
+++ new-game.cpp	(revision f9a242b7652494a12b264ef60cdf86d86404a2eb)
@@ -104,4 +104,6 @@
 void printVector(string label, vec3 v);
 void print4DVector(string label, vec4 v);
+
+void addObjectToScene(SceneObject& obj);
 
 void renderMainMenu();
@@ -259,12 +261,11 @@
    GLuint texture_sp = loadShaderProgram("./texture.vert", "./texture.frag");
 
+   SceneObject obj;
    mat4 T_model, R_model;
 
    // triangle
-   objects.push_back(SceneObject());
-   objects[0].id = 0;
-   objects[0].shader_program = color_sp;
-   objects[0].vertex_vbo_offset = 0;
-   objects[0].points = {
+   obj = SceneObject();
+   obj.shader_program = color_sp;
+   obj.points = {
        0.0f,  0.5f,  0.0f,
       -0.5f, -0.5f,  0.0f,
@@ -274,5 +275,5 @@
        0.0f,  0.5f,  0.0f,
    };
-   objects[0].colors = {
+   obj.colors = {
       1.0f, 0.0f, 0.0f,
       0.0f, 0.0f, 1.0f,
@@ -282,5 +283,5 @@
       1.0f, 0.0f, 0.0f,
    };
-   objects[0].texcoords = {
+   obj.texcoords = {
       1.0f, 1.0f,
       0.0f, 1.0f,
@@ -290,32 +291,23 @@
       1.0f, 0.0f
    };
-   objects[0].normals = {
-       0.0f,  0.0f,  1.0f,
-       0.0f,  0.0f,  1.0f,
-       0.0f,  0.0f,  1.0f,
-       0.0f,  0.0f, -1.0f,
-       0.0f,  0.0f, -1.0f,
-       0.0f,  0.0f, -1.0f,
-   };
-   objects[0].selected_colors = {
-      0.0f, 1.0f, 0.0f,
-      0.0f, 1.0f, 0.0f,
-      0.0f, 1.0f, 0.0f,
-      0.0f, 1.0f, 0.0f,
-      0.0f, 1.0f, 0.0f,
-      0.0f, 1.0f, 0.0f,
-   };
-   objects[0].num_points = objects[0].points.size() / 3;
+   obj.selected_colors = {
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+   };
 
    T_model = translate(mat4(), vec3(0.45f, 0.0f, 0.0f));
    R_model = rotate(mat4(), 0.0f, vec3(0.0f, 1.0f, 0.0f));
-   objects[0].model_mat = T_model*R_model;
+   obj.model_mat = T_model*R_model;
+
+   addObjectToScene(obj);
 
    // square
-   objects.push_back(SceneObject());
-   objects[1].id = 1;
-   objects[1].shader_program = texture_sp;
-   objects[1].vertex_vbo_offset = 6;
-   objects[1].points = {
+   obj = SceneObject();
+   obj.shader_program = texture_sp;
+   obj.points = {
        0.5f,  0.5f,  0.0f,
       -0.5f,  0.5f,  0.0f,
@@ -325,5 +317,5 @@
        0.5f, -0.5f,  0.0f,
    };
-   objects[1].colors = {
+   obj.colors = {
       1.0f, 0.0f, 0.0f,
       0.0f, 0.0f, 1.0f,
@@ -333,5 +325,5 @@
       1.0f, 0.0f, 0.0f,
    };
-   objects[1].texcoords = {
+   obj.texcoords = {
       1.0f, 1.0f,
       0.0f, 1.0f,
@@ -341,13 +333,5 @@
       1.0f, 0.0f
    };
-   objects[1].normals = {
-      0.0f,  0.0f,  1.0f,
-      0.0f,  0.0f,  1.0f,
-      0.0f,  0.0f,  1.0f,
-      0.0f,  0.0f,  1.0f,
-      0.0f,  0.0f,  1.0f,
-      0.0f,  0.0f,  1.0f,
-   };
-   objects[1].selected_colors = {
+   obj.selected_colors = {
       0.0f, 0.6f, 0.9f,
       0.0f, 0.6f, 0.9f,
@@ -357,9 +341,52 @@
       0.0f, 0.6f, 0.9f,
    };
-   objects[1].num_points = objects[1].points.size() / 3;
 
    T_model = translate(mat4(), vec3(-0.5f, 0.0f, -1.00f));
    R_model = rotate(mat4(), 0.5f, vec3(0.0f, 1.0f, 0.0f));
-   objects[1].model_mat = T_model*R_model;
+   obj.model_mat = T_model*R_model;
+
+   addObjectToScene(obj);
+
+   // player ship
+   obj = SceneObject();
+   obj.shader_program = color_sp;
+   obj.points = {
+      0.0f,  0.5f,  0.0f,
+      -0.5f, -0.5f,  0.0f,
+      0.5f, -0.5f,  0.0f,
+      0.5f, -0.5f,  0.0f,
+      -0.5f, -0.5f,  0.0f,
+      0.0f,  0.5f,  0.0f,
+   };
+   obj.colors = {
+      0.0f, 0.0f, 0.3f,
+      0.0f, 0.0f, 0.3f,
+      0.0f, 0.0f, 0.3f,
+      0.0f, 0.0f, 0.3f,
+      0.0f, 0.0f, 0.3f,
+      0.0f, 0.0f, 0.3f,
+   };
+   obj.texcoords = {
+      1.0f, 1.0f,
+      0.0f, 1.0f,
+      0.0f, 0.0f,
+      1.0f, 1.0f,
+      0.0f, 0.0f,
+      1.0f, 0.0f
+   };
+   obj.selected_colors = {
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+   };
+
+   T_model = translate(mat4(), vec3(0.0f, -0.65f, 0.0f));
+   R_model = rotate(mat4(), -1.0f, vec3(1.0f, 0.0f, 0.0f));
+   obj.model_mat = T_model * R_model;
+
+   addObjectToScene(obj);
 
    vector<SceneObject>::iterator obj_it;
@@ -1023,4 +1050,31 @@
 }
 
+void addObjectToScene(SceneObject& obj) {
+   obj.id = objects.size(); // currently unused
+   obj.num_points = obj.points.size() / 3;
+
+   static GLint vbo_offset = 0;
+   obj.vertex_vbo_offset = vbo_offset;
+   vbo_offset += obj.num_points;
+
+   obj.normals.reserve(obj.points.size());
+   for (int i = 0; i < obj.points.size(); i += 9) {
+      vec3 point1 = vec3(obj.points[i], obj.points[i+1], obj.points[i + 2]);
+      vec3 point2 = vec3(obj.points[i+3], obj.points[i + 4], obj.points[i + 5]);
+      vec3 point3 = vec3(obj.points[i+6], obj.points[i + 7], obj.points[i + 8]);
+
+      vec3 normal = normalize(cross(point2 - point1, point3 - point1));
+
+      // Add the same normal for all 3 points
+      for (int j = 0; j < 3; j++) {
+         obj.normals.push_back(normal.x);
+         obj.normals.push_back(normal.y);
+         obj.normals.push_back(normal.z);
+      }
+   }
+
+   objects.push_back(obj);
+}
+
 void renderMainMenu() {
 }
