Changeset 07ed460 in opengl-game


Ignore:
Timestamp:
Apr 26, 2018, 3:37:36 AM (6 years ago)
Author:
Dmitry Portnoy <dmp1488@…>
Branches:
feature/imgui-sdl, master, points-test
Children:
d9f99b2
Parents:
05e43cf
Message:

Move all the point and color data into the SceneObjects and populate all the different vbos by looping over all the SceneObjects.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • new-game.cpp

    r05e43cf r07ed460  
    4343   mat4 model_mat;
    4444   GLuint shader_program;
    45    GLvoid* vbo_offset;
    4645   unsigned int num_points;
     46   GLvoid* vertex_vbo_offset;
     47   GLvoid* texture_vbo_offset;
     48   vector<GLfloat> points;
     49   vector<GLfloat> colors;
     50   vector<GLfloat> texcoords;
     51   vector<GLfloat> selected_colors;
    4752};
    4853
     
    208213   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    209214
    210    GLfloat points[] = {
     215   mat4 T_model, R_model;
     216
     217   // triangle
     218   objects.push_back(SceneObject());
     219   objects[0].shader_program = 0;
     220   objects[0].vertex_vbo_offset = (GLvoid*) (0 * sizeof(float) * 3);
     221   objects[0].texture_vbo_offset = (GLvoid*)(0 * sizeof(float) * 2);
     222   objects[0].points = {
    211223       0.0f,  0.5f,  0.0f,
    212224      -0.5f, -0.5f,  0.0f,
     
    216228       0.0f,  0.5f,  0.0f,
    217229   };
    218 
    219    GLfloat colors[] = {
    220       1.0, 0.0, 0.0,
    221       0.0, 0.0, 1.0,
    222       0.0, 1.0, 0.0,
    223       0.0, 1.0, 0.0,
    224       0.0, 0.0, 1.0,
    225       1.0, 0.0, 0.0,
    226    };
    227 
    228    GLfloat colors_new[] = {
    229       0.0, 1.0, 0.0,
    230       0.0, 1.0, 0.0,
    231       0.0, 1.0, 0.0,
    232       0.0, 1.0, 0.0,
    233       0.0, 1.0, 0.0,
    234       0.0, 1.0, 0.0,
    235    };
    236 
    237    GLfloat points2[] = {
     230   objects[0].colors = {
     231      1.0f, 0.0f, 0.0f,
     232      0.0f, 0.0f, 1.0f,
     233      0.0f, 1.0f, 0.0f,
     234      0.0f, 1.0f, 0.0f,
     235      0.0f, 0.0f, 1.0f,
     236      1.0f, 0.0f, 0.0f,
     237   };
     238   objects[0].texcoords = {
     239      1.0f, 1.0f,
     240      0.0f, 1.0f,
     241      0.0f, 0.0f,
     242      1.0f, 1.0f,
     243      0.0f, 0.0f,
     244      1.0f, 0.0f
     245   };
     246   objects[0].selected_colors = {
     247      0.0f, 1.0f, 0.0f,
     248      0.0f, 1.0f, 0.0f,
     249      0.0f, 1.0f, 0.0f,
     250      0.0f, 1.0f, 0.0f,
     251      0.0f, 1.0f, 0.0f,
     252      0.0f, 1.0f, 0.0f,
     253   };
     254   objects[0].num_points = objects[0].points.size() / 3;
     255
     256   T_model = translate(mat4(), vec3(0.45f, 0.0f, 0.0f));
     257   R_model = rotate(mat4(), 0.0f, vec3(0.0f, 1.0f, 0.0f));
     258   objects[0].model_mat = T_model*R_model;
     259
     260   // square
     261   objects.push_back(SceneObject());
     262   objects[1].shader_program = 0;
     263   objects[1].vertex_vbo_offset = (GLvoid*) (6 * sizeof(float) * 3);
     264   objects[1].texture_vbo_offset = (GLvoid*)(6 * sizeof(float) * 2);
     265   objects[1].points = {
    238266       0.5f,  0.5f,  0.0f,
    239267      -0.5f,  0.5f,  0.0f,
     
    243271       0.5f, -0.5f,  0.0f,
    244272   };
    245 
    246    GLfloat colors2[] = {
    247       0.0, 0.9, 0.9,
    248       0.0, 0.9, 0.9,
    249       0.0, 0.9, 0.9,
    250       0.0, 0.9, 0.9,
    251       0.0, 0.9, 0.9,
    252       0.0, 0.9, 0.9,
    253    };
    254 
    255    GLfloat texcoords[] = {
     273   objects[1].colors = {
     274      1.0f, 0.0f, 0.0f,
     275      0.0f, 0.0f, 1.0f,
     276      0.0f, 1.0f, 0.0f,
     277      0.0f, 1.0f, 0.0f,
     278      0.0f, 0.0f, 1.0f,
     279      1.0f, 0.0f, 0.0f,
     280   };
     281   objects[1].texcoords = {
    256282      1.0f, 1.0f,
    257283      0.0f, 1.0f,
    258       0.0, 0.0,
    259       1.0, 1.0,
    260       0.0, 0.0,
    261       1.0, 0.0
    262    };
    263 
    264    mat4 T_model, R_model;
    265 
    266    // triangle
    267    objects.push_back(SceneObject());
    268    objects[0].shader_program = 0;
    269    objects[0].vbo_offset = (GLvoid*) (0 * sizeof(float) * 3);
    270    objects[0].num_points = 6;
    271 
    272    T_model = translate(mat4(), vec3(0.45f, 0.0f, 0.0f));
    273    R_model = rotate(mat4(), 0.0f, vec3(0.0f, 1.0f, 0.0f));
    274    objects[0].model_mat = T_model*R_model;
    275 
    276    faces.push_back(ObjectFace());
    277    faces[0].object_id = 0;
    278    faces[0].points = {
    279       vec3(points[0], points[1], points[2]),
    280       vec3(points[3], points[4], points[5]),
    281       vec3(points[6], points[7], points[8]),
    282    };
    283 
    284    // square
    285    objects.push_back(SceneObject());
    286    objects[1].shader_program = 0;
    287    objects[1].vbo_offset = (GLvoid*) (6 * sizeof(float) * 3);
    288    objects[1].num_points = 6;
     284      0.0f, 0.0f,
     285      1.0f, 1.0f,
     286      0.0f, 0.0f,
     287      1.0f, 0.0f
     288   };
     289   objects[1].selected_colors = {
     290      0.0f, 0.9f, 0.9f,
     291      0.0f, 0.9f, 0.9f,
     292      0.0f, 0.9f, 0.9f,
     293      0.0f, 0.9f, 0.9f,
     294      0.0f, 0.9f, 0.9f,
     295      0.0f, 0.9f, 0.9f,
     296   };
     297   objects[1].num_points = objects[1].points.size() / 3;
    289298
    290299   T_model = translate(mat4(), vec3(-0.5f, 0.0f, -1.00f));
     
    292301   objects[1].model_mat = T_model*R_model;
    293302
    294    faces.push_back(ObjectFace());
    295    faces[1].object_id = 1;
    296    faces[1].points = {
    297       vec3(points2[0], points2[1], points2[2]),
    298       vec3(points2[3], points2[4], points2[5]),
    299       vec3(points2[6], points2[7], points2[8]),
    300    };
    301 
    302    faces.push_back(ObjectFace());
    303    faces[2].object_id = 1;
    304    faces[2].points = {
    305       vec3(points2[9], points2[10], points2[11]),
    306       vec3(points2[12], points2[13], points2[14]),
    307       vec3(points2[15], points2[16], points2[17]),
    308    };
     303   vector<SceneObject>::iterator obj_it;
     304   GLsizeiptr offset;
     305
     306   GLsizeiptr points_buffer_size = 0;
     307   GLsizeiptr textures_buffer_size = 0;
     308
     309   faces.clear();
     310
     311   unsigned int object_id = 0;
     312   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
     313      points_buffer_size += obj_it->points.size() * sizeof(GLfloat);
     314      textures_buffer_size += obj_it->texcoords.size() * sizeof(GLfloat);
     315
     316      for (int p_idx = 0; p_idx < obj_it->points.size(); p_idx += 9) {
     317         faces.push_back(ObjectFace());
     318         faces.back().object_id = object_id;
     319         faces.back().points = {
     320            vec3(obj_it->points[p_idx], obj_it->points[p_idx + 1], obj_it->points[p_idx + 2]),
     321            vec3(obj_it->points[p_idx + 3], obj_it->points[p_idx + 4], obj_it->points[p_idx + 5]),
     322            vec3(obj_it->points[p_idx + 6], obj_it->points[p_idx + 7], obj_it->points[p_idx + 8]),
     323         };
     324      }
     325
     326      object_id++;
     327   }
    309328
    310329   GLuint points_vbo = 0;
    311330   glGenBuffers(1, &points_vbo);
    312331   glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
    313    glBufferData(GL_ARRAY_BUFFER, sizeof(points) + sizeof(points2), NULL, GL_DYNAMIC_DRAW);
    314 
    315    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(points), points);
    316    glBufferSubData(GL_ARRAY_BUFFER, sizeof(points), sizeof(points2), points2);
     332   glBufferData(GL_ARRAY_BUFFER, points_buffer_size, NULL, GL_DYNAMIC_DRAW);
     333
     334   offset = 0;
     335   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
     336      glBufferSubData(GL_ARRAY_BUFFER, offset, obj_it->points.size() * sizeof(GLfloat), &obj_it->points[0]);
     337      offset += obj_it->points.size() * sizeof(GLfloat);
     338   }
    317339
    318340   GLuint colors_vbo = 0;
    319341   glGenBuffers(1, &colors_vbo);
    320342   glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
    321    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
     343   glBufferData(GL_ARRAY_BUFFER, points_buffer_size, NULL, GL_DYNAMIC_DRAW);
     344
     345   offset = 0;
     346   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
     347      glBufferSubData(GL_ARRAY_BUFFER, offset, obj_it->colors.size() * sizeof(GLfloat), &obj_it->colors[0]);
     348      offset += obj_it->colors.size() * sizeof(GLfloat);
     349   }
     350
     351   GLuint selected_colors_vbo = 0;
     352   glGenBuffers(1, &selected_colors_vbo);
     353   glBindBuffer(GL_ARRAY_BUFFER, selected_colors_vbo);
     354   glBufferData(GL_ARRAY_BUFFER, points_buffer_size, NULL, GL_DYNAMIC_DRAW);
     355
     356   offset = 0;
     357   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
     358      glBufferSubData(GL_ARRAY_BUFFER, offset, obj_it->selected_colors.size() * sizeof(GLfloat), &obj_it->selected_colors[0]);
     359      offset += obj_it->selected_colors.size() * sizeof(GLfloat);
     360   }
     361
     362   GLuint texcoords_vbo = 0;
     363   glGenBuffers(1, &texcoords_vbo);
     364   glBindBuffer(GL_ARRAY_BUFFER, texcoords_vbo);
     365   glBufferData(GL_ARRAY_BUFFER, textures_buffer_size, NULL, GL_DYNAMIC_DRAW);
     366
     367   offset = 0;
     368   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
     369      glBufferSubData(GL_ARRAY_BUFFER, offset, obj_it->texcoords.size() * sizeof(GLfloat), &obj_it->texcoords[0]);
     370      offset += obj_it->texcoords.size() * sizeof(GLfloat);
     371   }
    322372
    323373   GLuint vao = 0;
     
    327377   glEnableVertexAttribArray(0);
    328378   glEnableVertexAttribArray(1);
    329 
    330    GLuint colors2_vbo = 0;
    331    glGenBuffers(1, &colors2_vbo);
    332    glBindBuffer(GL_ARRAY_BUFFER, colors2_vbo);
    333    glBufferData(GL_ARRAY_BUFFER, sizeof(colors2), colors2, GL_STATIC_DRAW);
    334 
    335    GLuint vt_vbo;
    336    glGenBuffers(1, &vt_vbo);
    337    glBindBuffer(GL_ARRAY_BUFFER, vt_vbo);
    338    glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords, GL_STATIC_DRAW);
    339379
    340380   GLuint vao2 = 0;
     
    504544
    505545         glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
    506          glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, objects[*it].vbo_offset);
     546         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, objects[*it].vertex_vbo_offset);
    507547
    508548         if (selectedObject == &objects[*it]) {
    509             if (*it == 1) {
    510                glBindBuffer(GL_ARRAY_BUFFER, colors2_vbo);
    511             } else {
    512                glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
    513                glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors_new, GL_STATIC_DRAW);
    514             }
     549            glBindBuffer(GL_ARRAY_BUFFER, selected_colors_vbo);
    515550         } else {
    516551            glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
    517             glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
    518552         }
    519 
    520          glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
     553         glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, objects[*it].vertex_vbo_offset);
    521554
    522555         glDrawArrays(GL_TRIANGLES, 0, objects[*it].num_points);
     
    530563
    531564         glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
    532          glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, objects[*it].vbo_offset);
    533 
    534          glBindBuffer(GL_ARRAY_BUFFER, vt_vbo);
    535          glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
     565         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, objects[*it].vertex_vbo_offset);
     566
     567         glBindBuffer(GL_ARRAY_BUFFER, texcoords_vbo);
     568         glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, objects[*it].texture_vbo_offset);
    536569
    537570         glDrawArrays(GL_TRIANGLES, 0, objects[*it].num_points);
Note: See TracChangeset for help on using the changeset viewer.