Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision f70ab758957ef6f00dba72a173dcf80ab53d2181)
+++ new-game.cpp	(revision baa5848ce50cfd870744e85ac0aeb99eb933ea15)
@@ -42,4 +42,5 @@
 struct SceneObject {
    mat4 model_mat;
+   GLuint shader_program;
 };
 
@@ -62,5 +63,5 @@
 
 SceneObject* clickedObject = NULL;
-SceneObject* selectedObject = NULL;
+SceneObject* selectedObject;
 
 double fps;
@@ -269,6 +270,7 @@
    // triangle
    objects.push_back(SceneObject());
-
-   T_model = translate(mat4(), vec3(0.25f, 0.0f, 0.0f));
+   objects[0].shader_program = 0;
+
+   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;
@@ -284,4 +286,5 @@
    // square
    objects.push_back(SceneObject());
+   objects[1].shader_program = 0;
 
    T_model = translate(mat4(), vec3(-0.5f, 0.0f, -1.00f));
@@ -459,4 +462,10 @@
    glBindBufferRange(GL_UNIFORM_BUFFER, ub_index2, ubo, sizeof(float) * 16, sizeof(float) * 16);
 
+   objects[0].shader_program = shader_program;
+   objects[1].shader_program = shader_program2;
+
+   vector<int> program1_objects, program2_objects;
+   vector<int>::iterator it;
+
    bool cam_moved = false;
 
@@ -485,15 +494,35 @@
       }
 
+      program1_objects.clear();
+      program2_objects.clear();
+
+      // Handle events (Ideally, move all event-handling code
+      // before the render code)
+
+      clickedObject = NULL;
+      glfwPollEvents();
+
       if (clickedObject == &objects[0]) {
          selectedObject = &objects[0];
       }
-
-      // At some point, I should change this to only rebind the buffer once per click, not once per frame
-      glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
-      if (selectedObject == &objects[0]) {
-         glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors_new, GL_STATIC_DRAW);
-      }
-      else {
-         glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
+      if (clickedObject == &objects[1]) {
+         selectedObject = &objects[1];
+      }
+
+      if (selectedObject == &objects[1] &&
+         objects[1].shader_program == shader_program2) {
+         objects[1].shader_program = shader_program;
+      } else if (selectedObject != &objects[1] &&
+         objects[1].shader_program == shader_program) {
+         objects[1].shader_program = shader_program2;
+      }
+
+      // group scene objects by shader
+      for (int i=0; i < objects.size(); i++) {
+         if (objects[i].shader_program == shader_program) {
+            program1_objects.push_back(i);
+         } else if (objects[i].shader_program == shader_program2) {
+            program2_objects.push_back(i);
+         }
       }
 
@@ -506,44 +535,49 @@
 
       glUseProgram(shader_program);
-
-      // Since every object will have a different model matrix, maybe it shouldn't be a uniform
-
-      // this is temporary.
-      // It's needed to offset the code for the recoloring of the square working during click detection
-      glUniformMatrix4fv(model_test_loc, 1, GL_FALSE, value_ptr(objects[0].model_mat));
-
       glBindVertexArray(vao);
 
-      glDrawArrays(GL_TRIANGLES, 0, numPoints);
-
-      if (clickedObject == &objects[1]) {
-         selectedObject = &objects[1];
-      }
-
-      if (selectedObject == &objects[1]) {
-         glUseProgram(shader_program);
-
-         // this is temporary.
-         // It's needed to get the recoloring of the square working during click detection
-         glUniformMatrix4fv(model_test_loc, 1, GL_FALSE, value_ptr(objects[1].model_mat));
-
-         glBindVertexArray(vao2);
-
-         glBindBuffer(GL_ARRAY_BUFFER, colors2_vbo);
-         glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
-      } else {
-         glUseProgram(shader_program2);
-
-         glBindVertexArray(vao2);
-
-         glBindBuffer(GL_ARRAY_BUFFER, vt_vbo);
-         glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
-      }
-
-      glDrawArrays(GL_TRIANGLES, 0, numPoints2);
-
-      clickedObject = NULL;
-
-      glfwPollEvents();
+      for (it=program1_objects.begin(); it != program1_objects.end(); it++) {
+         glUniformMatrix4fv(model_test_loc, 1, GL_FALSE, value_ptr(objects[*it].model_mat));
+
+         if (selectedObject == &objects[*it]) {
+            if (*it == 1) {
+               glBindBuffer(GL_ARRAY_BUFFER, points2_vbo);
+               glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
+
+               glBindBuffer(GL_ARRAY_BUFFER, colors2_vbo);
+               glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
+
+               glDrawArrays(GL_TRIANGLES, 0, numPoints2);
+            } else {
+               glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
+               glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
+
+               glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
+               glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors_new, GL_STATIC_DRAW);
+               glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
+
+               glDrawArrays(GL_TRIANGLES, 0, numPoints);
+            }
+         } else {
+            glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
+            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
+
+            glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
+            glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
+            glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
+
+            glDrawArrays(GL_TRIANGLES, 0, numPoints);
+         }
+      }
+
+      glUseProgram(shader_program2);
+      glBindVertexArray(vao2);
+
+      for (it = program2_objects.begin(); it != program2_objects.end(); it++) {
+         glUniformMatrix4fv(model_mat_loc, 1, GL_FALSE, value_ptr(objects[*it].model_mat));
+
+         glDrawArrays(GL_TRIANGLES, 0, numPoints2);
+      }
+
       glfwSwapBuffers(window);
 
