Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision 05e43cfaad1e2aa6e293a3c0313b5f939192ce71)
+++ new-game.cpp	(revision 07ed460186797228b4f4cd8aa9d995371846395f)
@@ -43,6 +43,11 @@
    mat4 model_mat;
    GLuint shader_program;
-   GLvoid* vbo_offset;
    unsigned int num_points;
+   GLvoid* vertex_vbo_offset;
+   GLvoid* texture_vbo_offset;
+   vector<GLfloat> points;
+   vector<GLfloat> colors;
+   vector<GLfloat> texcoords;
+   vector<GLfloat> selected_colors;
 };
 
@@ -208,5 +213,12 @@
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 
-   GLfloat points[] = {
+   mat4 T_model, R_model;
+
+   // triangle
+   objects.push_back(SceneObject());
+   objects[0].shader_program = 0;
+   objects[0].vertex_vbo_offset = (GLvoid*) (0 * sizeof(float) * 3);
+   objects[0].texture_vbo_offset = (GLvoid*)(0 * sizeof(float) * 2);
+   objects[0].points = {
        0.0f,  0.5f,  0.0f,
       -0.5f, -0.5f,  0.0f,
@@ -216,24 +228,40 @@
        0.0f,  0.5f,  0.0f,
    };
-
-   GLfloat colors[] = {
-      1.0, 0.0, 0.0,
-      0.0, 0.0, 1.0,
-      0.0, 1.0, 0.0,
-      0.0, 1.0, 0.0,
-      0.0, 0.0, 1.0,
-      1.0, 0.0, 0.0,
-   };
-
-   GLfloat colors_new[] = {
-      0.0, 1.0, 0.0,
-      0.0, 1.0, 0.0,
-      0.0, 1.0, 0.0,
-      0.0, 1.0, 0.0,
-      0.0, 1.0, 0.0,
-      0.0, 1.0, 0.0,
-   };
-
-   GLfloat points2[] = {
+   objects[0].colors = {
+      1.0f, 0.0f, 0.0f,
+      0.0f, 0.0f, 1.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 0.0f, 1.0f,
+      1.0f, 0.0f, 0.0f,
+   };
+   objects[0].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
+   };
+   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;
+
+   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;
+
+   // square
+   objects.push_back(SceneObject());
+   objects[1].shader_program = 0;
+   objects[1].vertex_vbo_offset = (GLvoid*) (6 * sizeof(float) * 3);
+   objects[1].texture_vbo_offset = (GLvoid*)(6 * sizeof(float) * 2);
+   objects[1].points = {
        0.5f,  0.5f,  0.0f,
       -0.5f,  0.5f,  0.0f,
@@ -243,48 +271,29 @@
        0.5f, -0.5f,  0.0f,
    };
-
-   GLfloat colors2[] = {
-      0.0, 0.9, 0.9,
-      0.0, 0.9, 0.9,
-      0.0, 0.9, 0.9,
-      0.0, 0.9, 0.9,
-      0.0, 0.9, 0.9,
-      0.0, 0.9, 0.9,
-   };
-
-   GLfloat texcoords[] = {
+   objects[1].colors = {
+      1.0f, 0.0f, 0.0f,
+      0.0f, 0.0f, 1.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 1.0f, 0.0f,
+      0.0f, 0.0f, 1.0f,
+      1.0f, 0.0f, 0.0f,
+   };
+   objects[1].texcoords = {
       1.0f, 1.0f,
       0.0f, 1.0f,
-      0.0, 0.0,
-      1.0, 1.0,
-      0.0, 0.0,
-      1.0, 0.0
-   };
-
-   mat4 T_model, R_model;
-
-   // triangle
-   objects.push_back(SceneObject());
-   objects[0].shader_program = 0;
-   objects[0].vbo_offset = (GLvoid*) (0 * sizeof(float) * 3);
-   objects[0].num_points = 6;
-
-   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;
-
-   faces.push_back(ObjectFace());
-   faces[0].object_id = 0;
-   faces[0].points = {
-      vec3(points[0], points[1], points[2]),
-      vec3(points[3], points[4], points[5]),
-      vec3(points[6], points[7], points[8]),
-   };
-
-   // square
-   objects.push_back(SceneObject());
-   objects[1].shader_program = 0;
-   objects[1].vbo_offset = (GLvoid*) (6 * sizeof(float) * 3);
-   objects[1].num_points = 6;
+      0.0f, 0.0f,
+      1.0f, 1.0f,
+      0.0f, 0.0f,
+      1.0f, 0.0f
+   };
+   objects[1].selected_colors = {
+      0.0f, 0.9f, 0.9f,
+      0.0f, 0.9f, 0.9f,
+      0.0f, 0.9f, 0.9f,
+      0.0f, 0.9f, 0.9f,
+      0.0f, 0.9f, 0.9f,
+      0.0f, 0.9f, 0.9f,
+   };
+   objects[1].num_points = objects[1].points.size() / 3;
 
    T_model = translate(mat4(), vec3(-0.5f, 0.0f, -1.00f));
@@ -292,32 +301,73 @@
    objects[1].model_mat = T_model*R_model;
 
-   faces.push_back(ObjectFace());
-   faces[1].object_id = 1;
-   faces[1].points = {
-      vec3(points2[0], points2[1], points2[2]),
-      vec3(points2[3], points2[4], points2[5]),
-      vec3(points2[6], points2[7], points2[8]),
-   };
-
-   faces.push_back(ObjectFace());
-   faces[2].object_id = 1;
-   faces[2].points = {
-      vec3(points2[9], points2[10], points2[11]),
-      vec3(points2[12], points2[13], points2[14]),
-      vec3(points2[15], points2[16], points2[17]),
-   };
+   vector<SceneObject>::iterator obj_it;
+   GLsizeiptr offset;
+
+   GLsizeiptr points_buffer_size = 0;
+   GLsizeiptr textures_buffer_size = 0;
+
+   faces.clear();
+
+   unsigned int object_id = 0;
+   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
+      points_buffer_size += obj_it->points.size() * sizeof(GLfloat);
+      textures_buffer_size += obj_it->texcoords.size() * sizeof(GLfloat);
+
+      for (int p_idx = 0; p_idx < obj_it->points.size(); p_idx += 9) {
+         faces.push_back(ObjectFace());
+         faces.back().object_id = object_id;
+         faces.back().points = {
+            vec3(obj_it->points[p_idx], obj_it->points[p_idx + 1], obj_it->points[p_idx + 2]),
+            vec3(obj_it->points[p_idx + 3], obj_it->points[p_idx + 4], obj_it->points[p_idx + 5]),
+            vec3(obj_it->points[p_idx + 6], obj_it->points[p_idx + 7], obj_it->points[p_idx + 8]),
+         };
+      }
+
+      object_id++;
+   }
 
    GLuint points_vbo = 0;
    glGenBuffers(1, &points_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
-   glBufferData(GL_ARRAY_BUFFER, sizeof(points) + sizeof(points2), NULL, GL_DYNAMIC_DRAW);
-
-   glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(points), points);
-   glBufferSubData(GL_ARRAY_BUFFER, sizeof(points), sizeof(points2), points2);
+   glBufferData(GL_ARRAY_BUFFER, points_buffer_size, NULL, GL_DYNAMIC_DRAW);
+
+   offset = 0;
+   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
+      glBufferSubData(GL_ARRAY_BUFFER, offset, obj_it->points.size() * sizeof(GLfloat), &obj_it->points[0]);
+      offset += obj_it->points.size() * sizeof(GLfloat);
+   }
 
    GLuint colors_vbo = 0;
    glGenBuffers(1, &colors_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
-   glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
+   glBufferData(GL_ARRAY_BUFFER, points_buffer_size, NULL, GL_DYNAMIC_DRAW);
+
+   offset = 0;
+   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
+      glBufferSubData(GL_ARRAY_BUFFER, offset, obj_it->colors.size() * sizeof(GLfloat), &obj_it->colors[0]);
+      offset += obj_it->colors.size() * sizeof(GLfloat);
+   }
+
+   GLuint selected_colors_vbo = 0;
+   glGenBuffers(1, &selected_colors_vbo);
+   glBindBuffer(GL_ARRAY_BUFFER, selected_colors_vbo);
+   glBufferData(GL_ARRAY_BUFFER, points_buffer_size, NULL, GL_DYNAMIC_DRAW);
+
+   offset = 0;
+   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
+      glBufferSubData(GL_ARRAY_BUFFER, offset, obj_it->selected_colors.size() * sizeof(GLfloat), &obj_it->selected_colors[0]);
+      offset += obj_it->selected_colors.size() * sizeof(GLfloat);
+   }
+
+   GLuint texcoords_vbo = 0;
+   glGenBuffers(1, &texcoords_vbo);
+   glBindBuffer(GL_ARRAY_BUFFER, texcoords_vbo);
+   glBufferData(GL_ARRAY_BUFFER, textures_buffer_size, NULL, GL_DYNAMIC_DRAW);
+
+   offset = 0;
+   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
+      glBufferSubData(GL_ARRAY_BUFFER, offset, obj_it->texcoords.size() * sizeof(GLfloat), &obj_it->texcoords[0]);
+      offset += obj_it->texcoords.size() * sizeof(GLfloat);
+   }
 
    GLuint vao = 0;
@@ -327,14 +377,4 @@
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
-
-   GLuint colors2_vbo = 0;
-   glGenBuffers(1, &colors2_vbo);
-   glBindBuffer(GL_ARRAY_BUFFER, colors2_vbo);
-   glBufferData(GL_ARRAY_BUFFER, sizeof(colors2), colors2, GL_STATIC_DRAW);
-
-   GLuint vt_vbo;
-   glGenBuffers(1, &vt_vbo);
-   glBindBuffer(GL_ARRAY_BUFFER, vt_vbo);
-   glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords, GL_STATIC_DRAW);
 
    GLuint vao2 = 0;
@@ -504,19 +544,12 @@
 
          glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
-         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, objects[*it].vbo_offset);
+         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, objects[*it].vertex_vbo_offset);
 
          if (selectedObject == &objects[*it]) {
-            if (*it == 1) {
-               glBindBuffer(GL_ARRAY_BUFFER, colors2_vbo);
-            } else {
-               glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
-               glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors_new, GL_STATIC_DRAW);
-            }
+            glBindBuffer(GL_ARRAY_BUFFER, selected_colors_vbo);
          } else {
             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);
+         glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, objects[*it].vertex_vbo_offset);
 
          glDrawArrays(GL_TRIANGLES, 0, objects[*it].num_points);
@@ -530,8 +563,8 @@
 
          glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
-         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, objects[*it].vbo_offset);
-
-         glBindBuffer(GL_ARRAY_BUFFER, vt_vbo);
-         glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
+         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, objects[*it].vertex_vbo_offset);
+
+         glBindBuffer(GL_ARRAY_BUFFER, texcoords_vbo);
+         glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, objects[*it].texture_vbo_offset);
 
          glDrawArrays(GL_TRIANGLES, 0, objects[*it].num_points);
