Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision 4c7cd57c51f23b2c41f2448cb6f7470a65935378)
+++ new-game.cpp	(revision b62c109ac6409e2e43e1db20ba30cddda206573d)
@@ -106,5 +106,4 @@
 struct BufferInfo {
    unsigned int vbo_base;
-   unsigned int vbo_offset;
    unsigned int vbo_capacity;
    unsigned int ubo_base;
@@ -216,6 +215,5 @@
 
 void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo,
-                  map<ObjectType, ShaderModelGroup>& modelGroups, GLuint ubo,
-                  GLuint laser_sp, GLuint laser_vao);
+                  map<ObjectType, ShaderModelGroup>& modelGroups, GLuint ubo);
 
 void renderSceneGui();
@@ -460,8 +458,4 @@
    map<ObjectType, ShaderModelGroup> modelGroups;
 
-   GLuint laser_sp = loadShaderProgram("./laser.vert", "./laser.frag");
-
-   shaderBufferInfo[laser_sp] = BufferInfo();
-
    modelGroups[TYPE_SHIP] = createModelGroup(
       loadShaderProgram("./ship.vert", "./ship.frag"));
@@ -471,4 +465,8 @@
       loadShaderProgram("./asteroid.vert", "./asteroid.frag"));
    shaderBufferInfo[modelGroups[TYPE_ASTEROID].shaderProgram] = BufferInfo(); // temporary
+
+   modelGroups[TYPE_LASER] = createModelGroup(
+      loadShaderProgram("./laser.vert", "./laser.frag"));
+   shaderBufferInfo[modelGroups[TYPE_LASER].shaderProgram] = BufferInfo(); // temporary
 
    modelGroups[TYPE_EXPLOSION] = createModelGroup(
@@ -544,7 +542,5 @@
    glVertexAttribIPointer(3, 1, GL_UNSIGNED_INT, 0, NULL);
 
-   GLuint laser_vao = 0;
-   glGenVertexArrays(1, &laser_vao);
-   glBindVertexArray(laser_vao);
+   glBindVertexArray(modelGroups[TYPE_LASER].vao);
 
    glEnableVertexAttribArray(0);
@@ -647,8 +643,8 @@
    GLuint asteroid_sp_models_ub_index = glGetUniformBlockIndex(modelGroups[TYPE_ASTEROID].shaderProgram, "models");
 
-   GLuint laser_view_mat_loc = glGetUniformLocation(laser_sp, "view");
-   GLuint laser_proj_mat_loc = glGetUniformLocation(laser_sp, "proj");
-   GLuint laser_color_loc = glGetUniformLocation(laser_sp, "laser_color");
-   GLuint laser_sp_models_ub_index = glGetUniformBlockIndex(laser_sp, "models");
+   GLuint laser_view_mat_loc = glGetUniformLocation(modelGroups[TYPE_LASER].shaderProgram, "view");
+   GLuint laser_proj_mat_loc = glGetUniformLocation(modelGroups[TYPE_LASER].shaderProgram, "proj");
+   GLuint laser_color_loc = glGetUniformLocation(modelGroups[TYPE_LASER].shaderProgram, "laser_color");
+   GLuint laser_sp_models_ub_index = glGetUniformBlockIndex(modelGroups[TYPE_LASER].shaderProgram, "models");
 
    GLuint explosion_start_time_loc = glGetUniformLocation(modelGroups[TYPE_EXPLOSION].shaderProgram, "explosion_start_time");
@@ -673,10 +669,10 @@
 
 
-   glUseProgram(laser_sp);
+   glUseProgram(modelGroups[TYPE_LASER].shaderProgram);
    glUniformMatrix4fv(laser_view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
    glUniformMatrix4fv(laser_proj_mat_loc, 1, GL_FALSE, value_ptr(proj_mat));
    glUniform3f(laser_color_loc, 0.2f, 1.0f, 0.2f);
 
-   glUniformBlockBinding(laser_sp, laser_sp_models_ub_index, ub_binding_point);
+   glUniformBlockBinding(modelGroups[TYPE_LASER].shaderProgram, laser_sp_models_ub_index, ub_binding_point);
    glBindBufferRange(GL_UNIFORM_BUFFER, ub_binding_point, ubo, 0, GL_MAX_UNIFORM_BLOCK_SIZE);
 
@@ -812,5 +808,5 @@
 
             leftLaser = createLaser(vec3(-0.21f, -1.19f, 1.76f)+offset, vec3(-0.21f, -1.19f, -3.0f)+offset,
-               vec3(0.0f, 1.0f, 0.0f), 0.03f, laser_sp);
+               vec3(0.0f, 1.0f, 0.0f), 0.03f, modelGroups[TYPE_LASER].shaderProgram);
             addObjectToScene(leftLaser, shaderBufferInfo, modelGroups,
                points_vbo,
@@ -828,5 +824,5 @@
 
             rightLaser = createLaser(vec3(0.21f, -1.19f, 1.76f) + offset, vec3(0.21f, -1.19f, -3.0f) + offset,
-               vec3(0.0f, 1.0f, 0.0f), 0.03f, laser_sp);
+               vec3(0.0f, 1.0f, 0.0f), 0.03f, modelGroups[TYPE_LASER].shaderProgram);
             addObjectToScene(rightLaser, shaderBufferInfo, modelGroups,
                points_vbo,
@@ -953,5 +949,5 @@
          glUniformMatrix4fv(ship_view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
 
-         glUseProgram(laser_sp);
+         glUseProgram(modelGroups[TYPE_LASER].shaderProgram);
          glUniformMatrix4fv(laser_view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
 
@@ -972,6 +968,5 @@
             break;
          case STATE_GAME:
-            renderScene(shaderBufferInfo, modelGroups, ubo,
-               laser_sp, laser_vao);
+            renderScene(shaderBufferInfo, modelGroups, ubo);
             renderSceneGui();
             break;
@@ -1336,14 +1331,7 @@
    BufferInfo* bufferInfo = &shaderBufferInfo[obj->shader_program];
 
-   unsigned int numPoints =
-      obj->type == TYPE_SHIP ||
-      obj->type == TYPE_ASTEROID ||
-      obj->type == TYPE_EXPLOSION ?
-      modelGroups[obj->type].numPoints :
-      bufferInfo->vbo_offset;
-
    // Check if the buffers aren't large enough to fit the new object and, if so, call
    // populateBuffers() to resize and repopupulate them
-   if (bufferInfo->vbo_capacity < (numPoints + obj->num_points) ||
+   if (bufferInfo->vbo_capacity < (modelGroups[obj->type].numPoints + obj->num_points) ||
       bufferInfo->ubo_capacity < (bufferInfo->ubo_offset + 1)) {
 
@@ -2089,9 +2077,4 @@
       shaderBufferInfo[shaderCountIt->first].ubo_base = lastShaderUboCount * 2;
 
-      if (shaderCountIt->first != modelGroups[TYPE_SHIP].shaderProgram &&
-         shaderCountIt->first != modelGroups[TYPE_ASTEROID].shaderProgram &&
-         shaderCountIt->first != modelGroups[TYPE_EXPLOSION].shaderProgram) {
-         shaderBufferInfo[shaderCountIt->first].vbo_offset = 0;
-      }
       shaderBufferInfo[shaderCountIt->first].ubo_offset = 0;
 
@@ -2105,9 +2088,5 @@
    map<ObjectType, ShaderModelGroup>::iterator modelGroupIt;
    for (modelGroupIt = modelGroups.begin(); modelGroupIt != modelGroups.end(); modelGroupIt++) {
-      if (modelGroupIt->first == TYPE_SHIP ||
-         modelGroupIt->first == TYPE_ASTEROID ||
-         modelGroupIt->first == TYPE_EXPLOSION) {
-         modelGroups[modelGroupIt->first].numPoints = 0;
-      }
+      modelGroups[modelGroupIt->first].numPoints = 0;
    }
 
@@ -2154,12 +2133,5 @@
    BufferInfo* bufferInfo = &shaderBufferInfo[obj.shader_program];
 
-   if (obj.type == TYPE_SHIP ||
-      obj.type == TYPE_ASTEROID ||
-      obj.type == TYPE_EXPLOSION) {
-      obj.vertex_vbo_offset = bufferInfo->vbo_base + modelGroups[obj.type].numPoints;
-   } else {
-      obj.vertex_vbo_offset = bufferInfo->vbo_base + bufferInfo->vbo_offset;
-   }
-   
+   obj.vertex_vbo_offset = bufferInfo->vbo_base + modelGroups[obj.type].numPoints;
    obj.ubo_offset = bufferInfo->ubo_base + bufferInfo->ubo_offset;
 
@@ -2201,11 +2173,5 @@
    }
 
-   if (obj.type == TYPE_SHIP ||
-      obj.type == TYPE_ASTEROID ||
-      obj.type == TYPE_EXPLOSION) {
-      modelGroups[obj.type].numPoints += obj.num_points;
-   } else {
-      bufferInfo->vbo_offset += obj.num_points;
-   }
+   modelGroups[obj.type].numPoints += obj.num_points;
    bufferInfo->ubo_offset++;
 }
@@ -2372,6 +2338,5 @@
 
 void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo,
-                  map<ObjectType, ShaderModelGroup>& modelGroups, GLuint ubo,
-                  GLuint laser_sp, GLuint laser_vao) {
+                  map<ObjectType, ShaderModelGroup>& modelGroups, GLuint ubo) {
 
    glUseProgram(modelGroups[TYPE_SHIP].shaderProgram);
@@ -2387,8 +2352,8 @@
    glEnable(GL_BLEND);
 
-   glUseProgram(laser_sp);
-   glBindVertexArray(laser_vao);
-
-   glDrawArrays(GL_TRIANGLES, shaderBufferInfo[laser_sp].vbo_base, shaderBufferInfo[laser_sp].vbo_offset);
+   glUseProgram(modelGroups[TYPE_LASER].shaderProgram);
+   glBindVertexArray(modelGroups[TYPE_LASER].vao);
+
+   glDrawArrays(GL_TRIANGLES, shaderBufferInfo[modelGroups[TYPE_LASER].shaderProgram].vbo_base, modelGroups[TYPE_LASER].numPoints);
 
    glUseProgram(modelGroups[TYPE_EXPLOSION].shaderProgram);
