Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision 8316333db194c8414031b9c87c994abac7899768)
+++ new-game.cpp	(revision fabed35a3b55b12b0f68d21d134322aa46d18f01)
@@ -177,5 +177,5 @@
 
 int key_state[NUM_KEYS];
-bool key_pressed[NUM_KEYS];
+bool key_down[NUM_KEYS];
 
 int width = 640;
@@ -203,4 +203,12 @@
 
 ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
+
+// TODO: Come up with a better way to keep references to specific objects,
+// which remain valid (or are recreated) when the object vector or VBOs are resized.
+// I could store SceneObject*, but I have to keep track of when the vector is about to
+// resize and re-init the pointers when that happens since they'll be invalidated
+// I would prefer the above apporach, but I should write some helper functions to make it less error-prone
+int leftLaserIdx = -1;
+int rightLaserIdx = -1;
 
 /*
@@ -777,18 +785,4 @@
    objects.push_back(obj);
 
-   // I could also store SceneObject*, but I have to keep track of when the vector is about to
-   // resize and re-init the pointers when that happens since they'll be invalidated
-   // I would prefer the above apporach, but I should write some helper functions to make it less error-prone
-   unsigned int leftLaserIdx = -1;
-   unsigned int rightLaserIdx = -1;
-
-   obj = createLaser(vec3(0.21f, -1.19f, 1.76f), vec3(0.21f, -1.19f, -3.0f), vec3(0.0f, 1.0f, 0.0f), 0.03f, laser_sp);
-   objects.push_back(obj);
-   leftLaserIdx = objects.size() - 1;
-
-   obj = createLaser(vec3(-0.21f, -1.19f, 1.76f), vec3(-0.21f, -1.19f, -3.0f), vec3(0.0f, 1.0f, 0.0f), 0.03f, laser_sp);
-   objects.push_back(obj);
-   rightLaserIdx = objects.size() - 1;
-
    vector<SceneObject>::iterator obj_it;
 
@@ -1036,24 +1030,38 @@
             transformObject(objects[1], translate(mat4(1.0f), vec3(0.3f, 0.0f, 0.0f)), ubo);
          }
-         if (key_pressed[GLFW_KEY_RIGHT]) {
+         if (key_down[GLFW_KEY_RIGHT]) {
             transformObject(objects[2], translate(mat4(1.0f), vec3(0.01f, 0.0f, 0.0f)), ubo);
          }
-         if (key_pressed[GLFW_KEY_LEFT]) {
+         if (key_down[GLFW_KEY_LEFT]) {
             transformObject(objects[2], translate(mat4(1.0f), vec3(-0.01f, 0.0f, 0.0f)), ubo);
          }
          */
 
-         if (key_pressed[GLFW_KEY_RIGHT]) {
+         if (key_down[GLFW_KEY_RIGHT]) {
             transformObject(objects[0], translate(mat4(1.0f), vec3(0.01f, 0.0f, 0.0f)), ubo);
-            transformObject(objects[leftLaserIdx], translate(mat4(1.0f), vec3(0.01f, 0.0f, 0.0f)), ubo);
-            transformObject(objects[rightLaserIdx], translate(mat4(1.0f), vec3(0.01f, 0.0f, 0.0f)), ubo);
+
+            // TODO: Update the rotation of the lasers as they moves so they point towards the camera
+            if (leftLaserIdx != -1) {
+               transformObject(objects[leftLaserIdx], translate(mat4(1.0f), vec3(0.01f, 0.0f, 0.0f)), ubo);
+            }
+            if (rightLaserIdx != -1) {
+               transformObject(objects[rightLaserIdx], translate(mat4(1.0f), vec3(0.01f, 0.0f, 0.0f)), ubo);
+            }
          }
-         if (key_pressed[GLFW_KEY_LEFT]) {
+         if (key_down[GLFW_KEY_LEFT]) {
             transformObject(objects[0], translate(mat4(1.0f), vec3(-0.01f, 0.0f, 0.0f)), ubo);
-            transformObject(objects[leftLaserIdx], translate(mat4(1.0f), vec3(-0.01f, 0.0f, 0.0f)), ubo);
-            transformObject(objects[rightLaserIdx], translate(mat4(1.0f), vec3(-0.01f, 0.0f, 0.0f)), ubo);
+
+            // TODO: Update the rotation of the lasers as they moves so they point towards the camera
+            if (leftLaserIdx != -1) {
+               transformObject(objects[leftLaserIdx], translate(mat4(1.0f), vec3(-0.01f, 0.0f, 0.0f)), ubo);
+            }
+            if (rightLaserIdx != -1) {
+               transformObject(objects[rightLaserIdx], translate(mat4(1.0f), vec3(-0.01f, 0.0f, 0.0f)), ubo);
+            }
          }
-         if (key_pressed[GLFW_KEY_Z]) {
+
+         if (key_state[GLFW_KEY_Z] == GLFW_PRESS) {
             vec3 offset(objects[0].model_transform * vec4(0.0f, 0.0f, 0.0f, 1.0f));
+            leftLaserIdx = objects.size();
 
             SceneObject obj = createLaser(vec3(-0.21f, -1.19f, 1.76f)+offset, vec3(-0.21f, -1.19f, -3.0f)+offset,
@@ -1067,7 +1075,11 @@
                ubo,
                model_mat_idx_vbo);
+         } else if (key_state[GLFW_KEY_Z] == GLFW_RELEASE) {
+            removeObjectFromScene(objects[leftLaserIdx], ubo);
          }
-         if (key_pressed[GLFW_KEY_X]) {
+
+         if (key_state[GLFW_KEY_X] == GLFW_PRESS) {
             vec3 offset(objects[0].model_transform * vec4(0.0f, 0.0f, 0.0f, 1.0f));
+            rightLaserIdx = objects.size();
 
             SceneObject obj = createLaser(vec3(0.21f, -1.19f, 1.76f) + offset, vec3(0.21f, -1.19f, -3.0f) + offset,
@@ -1081,4 +1093,6 @@
                ubo,
                model_mat_idx_vbo);
+         } else if (key_state[GLFW_KEY_X] == GLFW_RELEASE) {
+            removeObjectFromScene(objects[rightLaserIdx], ubo);
          }
 
@@ -1096,4 +1110,5 @@
          }
 
+         // TODO: Probablu remove this since it was only added to test that object removal owrks
          if (key_state[GLFW_KEY_SPACE] == GLFW_PRESS) {
             removeObjectFromScene(objects[0], ubo);
@@ -1106,5 +1121,5 @@
 
       float dist = cam_speed * elapsed_seconds;
-      if (key_pressed[GLFW_KEY_A]) {
+      if (key_down[GLFW_KEY_A]) {
          vec3 dir = vec3(inverse(R) * vec4(-1.0f, 0.0f, 0.0f, 1.0f));
          cam_pos += dir * dist;
@@ -1112,5 +1127,5 @@
          cam_moved = true;
       }
-      if (key_pressed[GLFW_KEY_D]) {
+      if (key_down[GLFW_KEY_D]) {
          vec3 dir = vec3(inverse(R) * vec4(1.0f, 0.0f, 0.0f, 1.0f));
          cam_pos += dir * dist;
@@ -1118,5 +1133,5 @@
          cam_moved = true;
       }
-      if (key_pressed[GLFW_KEY_W]) {
+      if (key_down[GLFW_KEY_W]) {
          vec3 dir = vec3(inverse(R) * vec4(0.0f, 0.0f, -1.0f, 1.0f));
          cam_pos += dir * dist;
@@ -1124,5 +1139,5 @@
          cam_moved = true;
       }
-      if (key_pressed[GLFW_KEY_S]) {
+      if (key_down[GLFW_KEY_S]) {
          vec3 dir = vec3(inverse(R) * vec4(0.0f, 0.0f, 1.0f, 1.0f));
          cam_pos += dir * dist;
@@ -1131,17 +1146,17 @@
       }
       /*
-      if (key_pressed[GLFW_KEY_LEFT]) {
+      if (key_down[GLFW_KEY_LEFT]) {
       cam_yaw += cam_yaw_speed * elapsed_seconds;
       cam_moved = true;
       }
-      if (key_pressed[GLFW_KEY_RIGHT]) {
+      if (key_down[GLFW_KEY_RIGHT]) {
       cam_yaw -= cam_yaw_speed * elapsed_seconds;
       cam_moved = true;
       }
-      if (key_pressed[GLFW_KEY_UP]) {
+      if (key_down[GLFW_KEY_UP]) {
       cam_pitch += cam_pitch_speed * elapsed_seconds;
       cam_moved = true;
       }
-      if (key_pressed[GLFW_KEY_DOWN]) {
+      if (key_down[GLFW_KEY_DOWN]) {
       cam_pitch -= cam_pitch_speed * elapsed_seconds;
       cam_moved = true;
@@ -1262,5 +1277,5 @@
 
    // should be true for GLFW_PRESS and GLFW_REPEAT
-   key_pressed[key] = (action != GLFW_RELEASE);
+   key_down[key] = (action != GLFW_RELEASE);
 }
 
@@ -1446,4 +1461,12 @@
    if (bufferInfo->vbo_capacity < (bufferInfo->ubo_offset + obj.num_points) ||
       bufferInfo->ubo_capacity < (bufferInfo->ubo_offset + 1)) {
+
+      if (leftLaserIdx != -1 && objects[leftLaserIdx].deleted) {
+         leftLaserIdx = -1;
+      }
+      if (rightLaserIdx != -1 && objects[rightLaserIdx].deleted) {
+         rightLaserIdx = -1;
+      }
+
       populateBuffers(objects, shaderBufferInfo,
          points_vbo,
@@ -1454,6 +1477,5 @@
          ubo,
          model_mat_idx_vbo);
-   }
-   else {
+   } else {
       copyObjectDataToBuffers(objects.back(), shaderBufferInfo,
          points_vbo,
@@ -1676,4 +1698,14 @@
    for (it = objects.begin(); it != objects.end();) {
       if (it->deleted) {
+         // terrible way of keeping track of the laser scene objects
+         // TODO: Find a more robust way of doing this, one that would work well
+         // for any objects in the scene
+         if (leftLaserIdx > it - objects.begin()) {
+            leftLaserIdx--;
+         }
+         if (rightLaserIdx > it - objects.begin()) {
+            rightLaserIdx--;
+         }
+
          it = objects.erase(it);
       } else {
@@ -1814,4 +1846,6 @@
 
 void transformObject(SceneObject& obj, const mat4& transform, GLuint ubo) {
+   if (obj.deleted) return;
+
    obj.model_transform = transform * obj.model_transform;
    obj.model_mat = obj.model_transform * obj.model_base;
