Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision b155f13e5e3eb9d802f665238cf7e834b23e953d)
+++ new-game.cpp	(revision 92b1e905717bfee4d6224c425a682082b6309252)
@@ -34,6 +34,34 @@
 using namespace glm;
 
+/* LASERS TODO:
+ * -Allow lasers that face any direction
+ * -Make the lasers rotate to always face the camera
+ * -Use textures to draw lasers
+ *    -The textures should be grayscale and have transparency
+ *    -The laser shader should take an input color to blend with the texture to give the lasers color
+ * -The lasers should be SceneObjects and drawn like all other objects
+ * -Make lasers shoot from the ends of the ship's wings when the user presses a button and disappear after a second or so
+ */
+
+enum State {
+   STATE_MAIN_MENU,
+   STATE_GAME,
+};
+
+enum Event {
+   EVENT_GO_TO_MAIN_MENU,
+   EVENT_GO_TO_GAME,
+   EVENT_QUIT,
+};
+
+enum ObjectType {
+   TYPE_SHIP,
+   TYPE_ASTEROID,
+   TYPE_LASER,
+};
+
 struct SceneObject {
    unsigned int id;
+   ObjectType type;
 
    // Currently, model_transform should only have translate, and rotation and scale need to be done in model_base since
@@ -65,15 +93,4 @@
 };
 
-enum State {
-   STATE_MAIN_MENU,
-   STATE_GAME,
-};
-
-enum Event {
-   EVENT_GO_TO_MAIN_MENU,
-   EVENT_GO_TO_GAME,
-   EVENT_QUIT,
-};
-
 void glfw_error_callback(int error, const char* description);
 
@@ -99,14 +116,12 @@
                   GLuint normals_vbo,
                   GLuint ubo,
-                  GLuint model_mat_idx_vbo);
-void removeObjectFromScene(SceneObject& obj, GLuint ubo);
-
-void calculateObjectBoundingBox(SceneObject& obj);
-
-void addLaserToScene(vec3 start, vec3 end, vec3 color,
-                  GLfloat width,
-                  unsigned int& num_lasers,
+                  GLuint model_mat_idx_vbo,
                   GLuint laser_points_vbo,
                   GLuint laser_colors_vbo);
+void removeObjectFromScene(SceneObject& obj, GLuint ubo);
+
+void calculateObjectBoundingBox(SceneObject& obj);
+
+void addLaserToScene(SceneObject& obj, vec3 start, vec3 end, vec3 color, GLfloat width);
 
 void initializeBuffers(
@@ -117,5 +132,7 @@
                   GLuint* normals_vbo,
                   GLuint* ubo,
-                  GLuint* model_mat_idx_vbo);
+                  GLuint* model_mat_idx_vbo,
+                  GLuint* laser_points_vbo,
+                  GLuint* laser_colors_vbo);
 
 void populateBuffers(vector<SceneObject>& objects,
@@ -127,5 +144,7 @@
                   GLuint normals_vbo,
                   GLuint ubo,
-                  GLuint model_mat_idx_vbo);
+                  GLuint model_mat_idx_vbo,
+                  GLuint laser_points_vbo,
+                  GLuint laser_colors_vbo);
 
 void copyObjectDataToBuffers(SceneObject& obj,
@@ -137,5 +156,7 @@
                   GLuint normals_vbo,
                   GLuint ubo,
-                  GLuint model_mat_idx_vbo);
+                  GLuint model_mat_idx_vbo,
+                  GLuint laser_points_vbo,
+                  GLuint laser_colors_vbo);
 
 void transformObject(SceneObject& obj, const mat4& transform, GLuint ubo);
@@ -144,11 +165,9 @@
 void renderMainMenuGui();
 
-void renderScene(vector<SceneObject>& objects,
-                  GLuint color_sp, GLuint texture_sp,
-                  GLuint vao1, GLuint vao2,
+void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo,
+                  GLuint color_sp, GLuint texture_sp, GLuint laser_sp,
+                  GLuint color_vao, GLuint texture_vao, GLuint laser_vao,
                   GLuint colors_vbo, GLuint selected_colors_vbo,
-                  SceneObject* selectedObject,
-                  map<GLuint, BufferInfo>& shaderBufferInfo);
-void renderLasers(GLuint sp, GLuint vao, unsigned int numLasers);
+                  SceneObject* selectedObject);
 void renderSceneGui();
 
@@ -161,5 +180,7 @@
                   GLuint normals_vbo,
                   GLuint ubo,
-                  GLuint model_mat_idx_vbo);
+                  GLuint model_mat_idx_vbo,
+                  GLuint laser_points_vbo,
+                  GLuint laser_colors_vbo);
 
 float getRandomNum(float low, float high);
@@ -359,4 +380,7 @@
    SceneObject obj;
    mat4 T_model, R_model;
+
+   // TODO: Confirm there's nothing I need from the commented out models and delete them
+   // (Check to make sure the textured square is drawn correctly)
 
    /*
@@ -434,4 +458,5 @@
    // player ship
    obj = SceneObject();
+   obj.type = TYPE_SHIP;
    obj.shader_program = color_sp;
    obj.points = {
@@ -812,8 +837,18 @@
    addObjectToSceneDuringInit(obj);
 
+   obj = SceneObject();
+   obj.shader_program = laser_sp;
+
+   addLaserToScene(obj, vec3(0.34f, -2.0f, 1.6f), vec3(0.34f, -2.0f, -3.0f), vec3(0.0f, 1.0f, 0.0f), 0.04f);
+
+   obj = SceneObject();
+   obj.shader_program = laser_sp;
+
+   addLaserToScene(obj, vec3(-0.34f, -2.0f, 1.6f), vec3(-0.34f, -2.0f, -3.0f), vec3(0.0f, 1.0f, 0.0f), 0.04f);
+
    vector<SceneObject>::iterator obj_it;
 
    GLuint points_vbo, colors_vbo, selected_colors_vbo, texcoords_vbo,
-      normals_vbo, ubo, model_mat_idx_vbo;
+      normals_vbo, ubo, model_mat_idx_vbo, laser_points_vbo, laser_colors_vbo;
 
    initializeBuffers(
@@ -824,5 +859,7 @@
       &normals_vbo,
       &ubo,
-      &model_mat_idx_vbo);
+      &model_mat_idx_vbo,
+      &laser_points_vbo,
+      &laser_colors_vbo);
 
    populateBuffers(objects,
@@ -834,27 +871,11 @@
       normals_vbo,
       ubo,
-      model_mat_idx_vbo);
-
-   unsigned int max_num_lasers = 20;
-   unsigned int num_lasers = 0;
-
-   GLuint laser_points_vbo = 0;
-   glGenBuffers(1, &laser_points_vbo);
-   glBindBuffer(GL_ARRAY_BUFFER, laser_points_vbo);
-   glBufferData(GL_ARRAY_BUFFER, max_num_lasers * 18 * sizeof(GLfloat) * 3, NULL, GL_DYNAMIC_DRAW);
-
-   GLuint laser_colors_vbo = 0;
-   glGenBuffers(1, &laser_colors_vbo);
-   glBindBuffer(GL_ARRAY_BUFFER, laser_colors_vbo);
-   glBufferData(GL_ARRAY_BUFFER, max_num_lasers * 18 * sizeof(GLfloat) * 3, NULL, GL_DYNAMIC_DRAW);
-
-   addLaserToScene(vec3(0.34f, -2.0f, 1.6f), vec3(0.34f, -2.0f, -3.0f), vec3(0.0f, 1.0f, 0.0f), 0.04f,
-      num_lasers, laser_points_vbo, laser_colors_vbo);
-   addLaserToScene(vec3(-0.34f, -2.0f, 1.6f), vec3(-0.34f, -2.0f, -3.0f), vec3(0.0f, 1.0f, 0.0f), 0.04f,
-      num_lasers, laser_points_vbo, laser_colors_vbo);
-
-   GLuint vao = 0;
-   glGenVertexArrays(1, &vao);
-   glBindVertexArray(vao);
+      model_mat_idx_vbo,
+      laser_points_vbo,
+      laser_colors_vbo);
+
+   GLuint color_vao = 0;
+   glGenVertexArrays(1, &color_vao);
+   glBindVertexArray(color_vao);
 
    glEnableVertexAttribArray(0);
@@ -872,7 +893,7 @@
    glVertexAttribIPointer(3, 1, GL_UNSIGNED_INT, 0, 0);
 
-   GLuint vao2 = 0;
-   glGenVertexArrays(1, &vao2);
-   glBindVertexArray(vao2);
+   GLuint texture_vao = 0;
+   glGenVertexArrays(1, &texture_vao);
+   glBindVertexArray(texture_vao);
 
    glEnableVertexAttribArray(0);
@@ -1045,5 +1066,7 @@
                normals_vbo,
                ubo,
-               model_mat_idx_vbo);
+               model_mat_idx_vbo,
+               laser_points_vbo,
+               laser_colors_vbo);
 
             elapsed_seconds_spawn -= 0.5f;
@@ -1078,6 +1101,7 @@
          }
 
-         for (int i = 1; i < objects.size(); i++) {
-            if (!objects[i].deleted) {
+         // this code moves the asteroids
+         for (int i = 0; i < objects.size(); i++) {
+            if (objects[i].type == TYPE_ASTEROID && !objects[i].deleted) {
                transformObject(objects[i], translate(mat4(1.0f), vec3(0.0f, 0.0f, 0.04f)), ubo);
 
@@ -1175,11 +1199,9 @@
             break;
          case STATE_GAME:
-            renderScene(objects,
-               color_sp, texture_sp,
-               vao, vao2,
+            renderScene(shaderBufferInfo,
+               color_sp, texture_sp, laser_sp,
+               color_vao, texture_vao, laser_vao,
                colors_vbo, selected_colors_vbo,
-               selectedObject,
-               shaderBufferInfo);
-            renderLasers(laser_sp, laser_vao, num_lasers);
+               selectedObject);
             renderSceneGui();
             break;
@@ -1227,4 +1249,5 @@
 
       for (vector<SceneObject>::iterator it = objects.begin(); it != objects.end(); it++) {
+         if (it->type == TYPE_LASER) continue;
          for (unsigned int p_idx = 0; p_idx < it->points.size(); p_idx += 9) {
             if (faceClicked(
@@ -1434,5 +1457,7 @@
                   GLuint normals_vbo,
                   GLuint ubo,
-                  GLuint model_mat_idx_vbo) {
+                  GLuint model_mat_idx_vbo,
+                  GLuint laser_points_vbo,
+                  GLuint laser_colors_vbo) {
    addObjectToSceneDuringInit(obj);
 
@@ -1450,5 +1475,7 @@
          normals_vbo,
          ubo,
-         model_mat_idx_vbo);
+         model_mat_idx_vbo,
+         laser_points_vbo,
+         laser_colors_vbo);
    } else {
       copyObjectDataToBuffers(objects.back(), shaderBufferInfo,
@@ -1459,5 +1486,7 @@
          normals_vbo,
          ubo,
-         model_mat_idx_vbo);
+         model_mat_idx_vbo,
+         laser_points_vbo,
+         laser_colors_vbo);
    }
 }
@@ -1527,7 +1556,8 @@
 
 // currently only works correctly for lasers oriented along the z axis
-void addLaserToScene(vec3 start, vec3 end, vec3 color, GLfloat width, unsigned int& num_lasers,
-                  GLuint laser_points_vbo, GLuint laser_colors_vbo) {
-   GLuint size_in_buffer = 18 * sizeof(GLfloat) * 3;
+void addLaserToScene(SceneObject& obj, vec3 start, vec3 end, vec3 color, GLfloat width) {
+   obj.id = objects.size(); // currently unused
+   obj.type = TYPE_LASER;
+   obj.deleted = false;
 
    // I really need to create a direction vector and add/subtract that from start and end
@@ -1536,9 +1566,9 @@
    vec3 dir = end - start;
 
-   vector<GLfloat> laser_points = {
-      end.x + width / 2,   end.y,   start.z - width,
-      end.x - width / 2,   end.y,   start.z - width,
+   obj.points = {
+      start.x + width / 2, start.y, start.z - width,
+      start.x - width / 2, start.y, start.z - width,
       start.x - width / 2, start.y, start.z,
-      end.x + width / 2,   end.y,   start.z - width,
+      start.x + width / 2, start.y, start.z - width,
       start.x - width / 2, start.y, start.z,
       start.x + width / 2, start.y, start.z,
@@ -1551,12 +1581,12 @@
       end.x + width / 2,   end.y,   end.z,
       end.x - width / 2,   end.y,   end.z,
-      start.x - width / 2, start.y, end.z + width,
+      end.x - width / 2,   end.y,   end.z + width,
       end.x + width / 2,   end.y,   end.z,
-      start.x - width / 2, start.y, end.z + width,
-      start.x + width / 2, start.y, end.z + width,
+      end.x - width / 2,   end.y,   end.z + width,
+      end.x + width / 2,   end.y,   end.z + width,
    };
 
    vec3 end_color = vec3(1.0f, 0.0f, 0.0f); // temporary
-   vector<GLfloat> laser_colors = {
+   obj.colors = {
       end_color.x, end_color.y, end_color.z,
       end_color.x, end_color.y, end_color.z,
@@ -1579,11 +1609,7 @@
    };
 
-   glBindBuffer(GL_ARRAY_BUFFER, laser_points_vbo);
-   glBufferSubData(GL_ARRAY_BUFFER, num_lasers * size_in_buffer, size_in_buffer, &laser_points[0]);
-
-   glBindBuffer(GL_ARRAY_BUFFER, laser_colors_vbo);
-   glBufferSubData(GL_ARRAY_BUFFER, num_lasers * size_in_buffer, size_in_buffer, &laser_colors[0]);
-
-   num_lasers++;
+   obj.num_points = obj.points.size() / 3;
+
+   objects.push_back(obj);
 }
 
@@ -1595,5 +1621,7 @@
                   GLuint* normals_vbo,
                   GLuint* ubo,
-                  GLuint* model_mat_idx_vbo) {
+                  GLuint* model_mat_idx_vbo,
+                  GLuint* laser_points_vbo,
+                  GLuint* laser_colors_vbo) {
    *points_vbo = 0;
    glGenBuffers(1, points_vbo);
@@ -1616,4 +1644,10 @@
    *model_mat_idx_vbo = 0;
    glGenBuffers(1, model_mat_idx_vbo);
+
+   *laser_points_vbo = 0;
+   glGenBuffers(1, laser_points_vbo);
+
+   *laser_colors_vbo = 0;
+   glGenBuffers(1, laser_colors_vbo);
 }
 
@@ -1626,5 +1660,7 @@
                   GLuint normals_vbo,
                   GLuint ubo,
-                  GLuint model_mat_idx_vbo) {
+                  GLuint model_mat_idx_vbo,
+                  GLuint laser_points_vbo,
+                  GLuint laser_colors_vbo) {
    GLsizeiptr points_buffer_size = 0;
    GLsizeiptr textures_buffer_size = 0;
@@ -1637,5 +1673,5 @@
    vector<SceneObject>::iterator it;
 
-   /* Find all shaders that need to be used and  the number of objects and
+   /* Find all shaders that need to be used and the number of objects and
    * number of points for each shader. Construct a map from shader id to count
    * of points being drawn using that shader (for thw model matrix ubo, we
@@ -1684,4 +1720,10 @@
       shaderBufferInfo[shaderIt->first].vbo_base = lastShaderCount * 2;
       shaderBufferInfo[shaderIt->first].ubo_base = lastShaderUboCount * 2;
+
+      if (shaderIt->first == 9) { // hack to check for laser_sp
+         shaderBufferInfo[shaderIt->first].vbo_base = 0;
+         shaderBufferInfo[shaderIt->first].ubo_base = 0; // unused now anyway
+      }
+
       cout << "shader: " << shaderIt->first << endl;
       cout << "point counts: " << shaderCounts[shaderIt->first] << endl;
@@ -1722,4 +1764,12 @@
    glBindBuffer(GL_ARRAY_BUFFER, model_mat_idx_vbo);
    glBufferData(GL_ARRAY_BUFFER, model_mat_idx_buffer_size, NULL, GL_DYNAMIC_DRAW);
+
+   unsigned int max_num_lasers = 20;
+
+   glBindBuffer(GL_ARRAY_BUFFER, laser_points_vbo);
+   glBufferData(GL_ARRAY_BUFFER, max_num_lasers * 18 * sizeof(GLfloat) * 3, NULL, GL_DYNAMIC_DRAW);
+
+   glBindBuffer(GL_ARRAY_BUFFER, laser_colors_vbo);
+   glBufferData(GL_ARRAY_BUFFER, max_num_lasers * 18 * sizeof(GLfloat) * 3, NULL, GL_DYNAMIC_DRAW);
 
    for (it = objects.begin(); it != objects.end(); it++) {
@@ -1731,5 +1781,7 @@
          normals_vbo,
          ubo,
-         model_mat_idx_vbo);
+         model_mat_idx_vbo,
+         laser_points_vbo,
+         laser_colors_vbo);
    }
 }
@@ -1743,5 +1795,7 @@
                   GLuint normals_vbo,
                   GLuint ubo,
-                  GLuint model_mat_idx_vbo) {
+                  GLuint model_mat_idx_vbo,
+                  GLuint laser_points_vbo,
+                  GLuint laser_colors_vbo) {
    BufferInfo* bufferInfo = &shaderBufferInfo[obj.shader_program];
 
@@ -1749,27 +1803,35 @@
    obj.ubo_offset = bufferInfo->ubo_base + bufferInfo->ubo_offset;
 
-   glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
-   glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.points.size() * sizeof(GLfloat), &obj.points[0]);
-
-   glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
-   glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.colors.size() * sizeof(GLfloat), &obj.colors[0]);
-
-   glBindBuffer(GL_ARRAY_BUFFER, selected_colors_vbo);
-   glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.selected_colors.size() * sizeof(GLfloat), &obj.selected_colors[0]);
-
-   glBindBuffer(GL_ARRAY_BUFFER, texcoords_vbo);
-   glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 2, obj.texcoords.size() * sizeof(GLfloat), &obj.texcoords[0]);
-
-   glBindBuffer(GL_ARRAY_BUFFER, normals_vbo);
-   glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.normals.size() * sizeof(GLfloat), &obj.normals[0]);
-
-   glBindBuffer(GL_ARRAY_BUFFER, model_mat_idx_vbo);
-   for (int i = 0; i < obj.num_points; i++) {
-      glBufferSubData(GL_ARRAY_BUFFER, (obj.vertex_vbo_offset + i) * sizeof(GLuint), sizeof(GLuint), &obj.ubo_offset);
-   }
-
-   obj.model_mat = obj.model_transform * obj.model_base;
-   glBindBuffer(GL_UNIFORM_BUFFER, ubo);
-   glBufferSubData(GL_UNIFORM_BUFFER, obj.ubo_offset * sizeof(mat4), sizeof(mat4), value_ptr(obj.model_mat));
+   if (obj.type == TYPE_LASER) {
+      glBindBuffer(GL_ARRAY_BUFFER, laser_points_vbo);
+      glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.points.size() * sizeof(GLfloat), &obj.points[0]);
+
+      glBindBuffer(GL_ARRAY_BUFFER, laser_colors_vbo);
+      glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.points.size() * sizeof(GLfloat), &obj.colors[0]);
+   } else {
+      glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
+      glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.points.size() * sizeof(GLfloat), &obj.points[0]);
+
+      glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
+      glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.colors.size() * sizeof(GLfloat), &obj.colors[0]);
+
+      glBindBuffer(GL_ARRAY_BUFFER, selected_colors_vbo);
+      glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.selected_colors.size() * sizeof(GLfloat), &obj.selected_colors[0]);
+
+      glBindBuffer(GL_ARRAY_BUFFER, texcoords_vbo);
+      glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 2, obj.texcoords.size() * sizeof(GLfloat), &obj.texcoords[0]);
+
+      glBindBuffer(GL_ARRAY_BUFFER, normals_vbo);
+      glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.normals.size() * sizeof(GLfloat), &obj.normals[0]);
+
+      glBindBuffer(GL_ARRAY_BUFFER, model_mat_idx_vbo);
+      for (int i = 0; i < obj.num_points; i++) {
+         glBufferSubData(GL_ARRAY_BUFFER, (obj.vertex_vbo_offset + i) * sizeof(GLuint), sizeof(GLuint), &obj.ubo_offset);
+      }
+
+      obj.model_mat = obj.model_transform * obj.model_base;
+      glBindBuffer(GL_UNIFORM_BUFFER, ubo);
+      glBufferSubData(GL_UNIFORM_BUFFER, obj.ubo_offset * sizeof(mat4), sizeof(mat4), value_ptr(obj.model_mat));
+   }
 
    bufferInfo->vbo_offset += obj.num_points;
@@ -1787,13 +1849,12 @@
 }
 
-void renderScene(vector<SceneObject>& objects,
-                  GLuint color_sp, GLuint texture_sp,
-                  GLuint vao1, GLuint vao2,
+void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo,
+                  GLuint color_sp, GLuint texture_sp, GLuint laser_sp,
+                  GLuint color_vao, GLuint texture_vao, GLuint laser_vao,
                   GLuint colors_vbo, GLuint selected_colors_vbo,
-                  SceneObject* selectedObject,
-                  map<GLuint, BufferInfo>& shaderBufferInfo) {
+                  SceneObject* selectedObject) {
 
    glUseProgram(color_sp);
-   glBindVertexArray(vao1);
+   glBindVertexArray(color_vao);
 
    if (selectedObject != NULL) {
@@ -1810,14 +1871,12 @@
 
    glUseProgram(texture_sp);
-   glBindVertexArray(vao2);
+   glBindVertexArray(texture_vao);
 
    glDrawArrays(GL_TRIANGLES, shaderBufferInfo[texture_sp].vbo_base, shaderBufferInfo[texture_sp].vbo_offset);
-}
-
-void renderLasers(GLuint sp, GLuint vao, unsigned int numLasers) {
-   glUseProgram(sp);
-   glBindVertexArray(vao);
-
-   glDrawArrays(GL_TRIANGLES, 0, numLasers * 18);
+
+   glUseProgram(laser_sp);
+   glBindVertexArray(laser_vao);
+
+   glDrawArrays(GL_TRIANGLES, shaderBufferInfo[laser_sp].vbo_base, shaderBufferInfo[laser_sp].vbo_offset);
 }
 
@@ -1921,6 +1980,9 @@
                   GLuint normals_vbo,
                   GLuint ubo,
-                  GLuint model_mat_idx_vbo) {
+                  GLuint model_mat_idx_vbo,
+                  GLuint laser_points_vbo,
+                  GLuint laser_colors_vbo) {
    SceneObject obj = SceneObject();
+   obj.type = TYPE_ASTEROID;
    obj.shader_program = shader;
 
@@ -2039,5 +2101,7 @@
                   normals_vbo,
                   ubo,
-                  model_mat_idx_vbo);
+                  model_mat_idx_vbo,
+                  laser_points_vbo,
+                  laser_colors_vbo);
 }
 
