Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision ae0c7f4870f1d82a4472bdc465e2178b68cf8a90)
+++ new-game.cpp	(revision 7a55b499c14cd197b42fc3ab9e4ea6b1f2663edb)
@@ -109,4 +109,10 @@
 };
 
+struct ShaderModelGroup {
+   GLuint shaderProgram;
+   GLuint vao;
+   unsigned int numPoints;
+};
+
 void glfw_error_callback(int error, const char* description);
 
@@ -146,4 +152,8 @@
 void removeObjectFromScene(SceneObject& obj, GLuint ubo);
 
+ShaderModelGroup createModelGroup(GLuint shaderProgram);
+void removeModelFromGroup(ShaderModelGroup& modelGroup, SceneObject& model);
+void addModelToGroup(ShaderModelGroup& modelGroup, SceneObject& model);
+
 void calculateObjectBoundingBox(SceneObject* obj);
 
@@ -156,5 +166,5 @@
                   GLuint* model_mat_idx_vbo);
 
-GLuint initializeParticleEffectBuffers(vec3 origin, mat4 proj, mat4 view, GLuint explosion_sp,
+ShaderModelGroup initializeParticleEffectBuffers(vec3 origin, mat4 proj, mat4 view, GLuint explosion_sp,
                   map<GLuint, BufferInfo>& shaderBufferInfo,
                   GLuint points_vbo,
@@ -200,8 +210,8 @@
 void renderMainMenuGui();
 
-void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo,
-                  GLuint ship_sp, GLuint asteroid_sp, GLuint laser_sp, GLuint explosion_sp,
-                  GLuint ship_vao, GLuint asteroid_vao, GLuint laser_vao, GLuint explosion_vao,
-                  GLuint colors_vbo, GLuint ubo, SceneObject* selectedObject);
+void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo, GLuint ubo,
+                  GLuint ship_sp, GLuint asteroid_sp, GLuint laser_sp,
+                  GLuint ship_vao, GLuint asteroid_vao, GLuint laser_vao,
+                  ShaderModelGroup& explosion_group);
 
 void renderSceneGui();
@@ -577,5 +587,5 @@
    proj_mat = make_mat4(proj_arr);
 
-   GLuint explosion_vao = initializeParticleEffectBuffers(vec3(0.0f, -1.2f, 0.65f), proj_mat, view_mat,
+   ShaderModelGroup explosion_group = initializeParticleEffectBuffers(vec3(0.0f, -1.2f, 0.65f), proj_mat, view_mat,
       explosion_sp,
       shaderBufferInfo,
@@ -959,8 +969,8 @@
             break;
          case STATE_GAME:
-            renderScene(shaderBufferInfo,
-               ship_sp, asteroid_sp, laser_sp, explosion_sp,
-               ship_vao, asteroid_vao, laser_vao, explosion_vao,
-               colors_vbo, ubo, selectedObject);
+            renderScene(shaderBufferInfo, ubo,
+               ship_sp, asteroid_sp, laser_sp,
+               ship_vao, asteroid_vao, laser_vao,
+               explosion_group);
             renderSceneGui();
             break;
@@ -1894,4 +1904,20 @@
 }
 
+ShaderModelGroup createModelGroup(GLuint shaderProgram) {
+   ShaderModelGroup smg;
+
+   smg.shaderProgram = shaderProgram;
+
+   return smg;
+}
+
+void removeModelFromGroup(ShaderModelGroup& modelGroup, SceneObject& model) {
+   // TODO: Implement
+}
+
+void addModelToGroup(ShaderModelGroup& modelGroup, SceneObject& model) {
+   // TODO: Implement
+}
+
 void initializeBuffers(
                   GLuint* points_vbo,
@@ -1920,5 +1946,5 @@
 }
 
-GLuint initializeParticleEffectBuffers(vec3 origin, mat4 proj, mat4 view, GLuint explosion_sp,
+ShaderModelGroup initializeParticleEffectBuffers(vec3 origin, mat4 proj, mat4 view, GLuint explosion_sp,
                   map<GLuint, BufferInfo>& shaderBufferInfo,
                   GLuint points_vbo,
@@ -1945,5 +1971,8 @@
    mat4 model_mat = translate(mat4(1.0f), origin);
 
-   glUseProgram(explosion_sp);
+   ShaderModelGroup modelGroup;
+   modelGroup.shaderProgram = explosion_sp;
+
+   glUseProgram(modelGroup.shaderProgram);
 
    GLuint proj_mat_loc = glGetUniformLocation(explosion_sp, "proj");
@@ -1967,7 +1996,6 @@
    glBufferData(GL_ARRAY_BUFFER, sizeof(vt), vt, GL_STATIC_DRAW);
 
-   GLuint vao;
-   glGenVertexArrays(1, &vao);
-   glBindVertexArray(vao);
+   glGenVertexArrays(1, &modelGroup.vao);
+   glBindVertexArray(modelGroup.vao);
 
    glEnableVertexAttribArray(0);
@@ -1980,5 +2008,5 @@
    glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, NULL);
 
-   objExplosion = createExplosion(explosion_sp);
+   objExplosion = createExplosion(modelGroup.shaderProgram);
    addObjectToScene(objExplosion, shaderBufferInfo,
       points_vbo,
@@ -1990,5 +2018,5 @@
       0);
 
-   return vao;
+   return modelGroup;
 }
 
@@ -2316,8 +2344,8 @@
 }
 
-void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo,
-                  GLuint ship_sp, GLuint asteroid_sp, GLuint laser_sp, GLuint explosion_sp,
-                  GLuint ship_vao, GLuint asteroid_vao, GLuint laser_vao, GLuint explosion_vao,
-                  GLuint colors_vbo, GLuint ubo, SceneObject* selectedObject) {
+void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo, GLuint ubo,
+                  GLuint ship_sp, GLuint asteroid_sp, GLuint laser_sp,
+                  GLuint ship_vao, GLuint asteroid_vao, GLuint laser_vao,
+                  ShaderModelGroup& explosion_group) {
 
    glUseProgram(ship_sp);
@@ -2338,16 +2366,16 @@
    glDrawArrays(GL_TRIANGLES, shaderBufferInfo[laser_sp].vbo_base, shaderBufferInfo[laser_sp].vbo_offset);
 
-   // To render explosions, my new shader descriptor object needs to have a refernece to the shader and the vao
+   // To render explosions, my new shader descriptor object needs to have a reference to the shader and the vao
    // and know the number of points to render.
 
-   glUseProgram(explosion_sp);
+   glUseProgram(explosion_group.shaderProgram);
 
    glEnable(GL_PROGRAM_POINT_SIZE);
-   glBindVertexArray(explosion_vao);
+   glBindVertexArray(explosion_group.vao);
 
    glBindBuffer(GL_UNIFORM_BUFFER, ubo);
    glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(mat4), value_ptr(objExplosion->model_mat));
 
-   glDrawArrays(GL_POINTS, 0, shaderBufferInfo[explosion_sp].vbo_offset);
+   glDrawArrays(GL_POINTS, 0, shaderBufferInfo[explosion_group.shaderProgram].vbo_offset);
 
    glBindBuffer(GL_UNIFORM_BUFFER, ubo);
