Changeset 4c7cd57 in opengl-game for new-game.cpp


Ignore:
Timestamp:
Feb 6, 2019, 5:50:56 AM (6 years ago)
Author:
Dmitry Portnoy <dmp1488@…>
Branches:
feature/imgui-sdl, master, points-test
Children:
b62c109
Parents:
0414306
Message:

Use a ShaderModelGroup for the ship

File:
1 edited

Legend:

Unmodified
Added
Removed
  • new-game.cpp

    r0414306 r4c7cd57  
    5353};
    5454
     55// TODO: Once all object types use ShaderModelGroup objects,, I should be able to remove the
     56// shader_program field since it would be available via modelGroups[type].shaderProgram
    5557struct SceneObject {
    5658   unsigned int id;
     
    6062   // they need to be done when the object is at the origin. I should change this to have separate scale, rotate, and translate
    6163   // matrices for each object that can be updated independently and then applied to the object in that order.
     64   // TODO: Actually, to make this as generic as possible, each object should have a matrix stack to support,
     65   // for instance, applying a rotate, then a translate, then another rotate. Think about and implement the best approach.
    6266   mat4 model_mat, model_base, model_transform;
    6367   mat4 translate_mat; // beginning of doing what's mentioned above
     
    213217void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo,
    214218                  map<ObjectType, ShaderModelGroup>& modelGroups, GLuint ubo,
    215                   GLuint ship_sp, GLuint laser_sp,
    216                   GLuint ship_vao, GLuint laser_vao);
     219                  GLuint laser_sp, GLuint laser_vao);
    217220
    218221void renderSceneGui();
     
    457460   map<ObjectType, ShaderModelGroup> modelGroups;
    458461
    459    GLuint ship_sp = loadShaderProgram("./ship.vert", "./ship.frag");
    460462   GLuint laser_sp = loadShaderProgram("./laser.vert", "./laser.frag");
    461463
    462    shaderBufferInfo[ship_sp] = BufferInfo();
    463464   shaderBufferInfo[laser_sp] = BufferInfo();
     465
     466   modelGroups[TYPE_SHIP] = createModelGroup(
     467      loadShaderProgram("./ship.vert", "./ship.frag"));
     468   shaderBufferInfo[modelGroups[TYPE_SHIP].shaderProgram] = BufferInfo(); // temporary
    464469
    465470   modelGroups[TYPE_ASTEROID] = createModelGroup(
    466471      loadShaderProgram("./asteroid.vert", "./asteroid.frag"));
    467472   shaderBufferInfo[modelGroups[TYPE_ASTEROID].shaderProgram] = BufferInfo(); // temporary
     473
    468474   modelGroups[TYPE_EXPLOSION] = createModelGroup(
    469475      loadShaderProgram("./explosion.vert", "./explosion.frag"));
     
    475481
    476482   // player ship
    477    SceneObject* ship = createShip(ship_sp);
     483   SceneObject* ship = createShip(modelGroups[TYPE_SHIP].shaderProgram);
    478484   objects.push_back(ship);
    479485
     
    499505      model_mat_idx_vbo);
    500506
    501    GLuint ship_vao = 0;
    502    glGenVertexArrays(1, &ship_vao);
    503    glBindVertexArray(ship_vao);
     507   glBindVertexArray(modelGroups[TYPE_SHIP].vao);
    504508
    505509   glEnableVertexAttribArray(0);
     
    635639   GLuint ub_binding_point = 0;
    636640
    637    GLuint ship_view_mat_loc = glGetUniformLocation(ship_sp, "view");
    638    GLuint ship_proj_mat_loc = glGetUniformLocation(ship_sp, "proj");
    639    GLuint ship_sp_models_ub_index = glGetUniformBlockIndex(ship_sp, "models");
     641   GLuint ship_view_mat_loc = glGetUniformLocation(modelGroups[TYPE_SHIP].shaderProgram, "view");
     642   GLuint ship_proj_mat_loc = glGetUniformLocation(modelGroups[TYPE_SHIP].shaderProgram, "proj");
     643   GLuint ship_sp_models_ub_index = glGetUniformBlockIndex(modelGroups[TYPE_SHIP].shaderProgram, "models");
    640644
    641645   GLuint asteroid_view_mat_loc = glGetUniformLocation(modelGroups[TYPE_ASTEROID].shaderProgram, "view");
     
    653657
    654658
    655    glUseProgram(ship_sp);
     659   glUseProgram(modelGroups[TYPE_SHIP].shaderProgram);
    656660   glUniformMatrix4fv(ship_view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
    657661   glUniformMatrix4fv(ship_proj_mat_loc, 1, GL_FALSE, value_ptr(proj_mat));
    658662
    659    glUniformBlockBinding(ship_sp, ship_sp_models_ub_index, ub_binding_point);
     663   glUniformBlockBinding(modelGroups[TYPE_SHIP].shaderProgram, ship_sp_models_ub_index, ub_binding_point);
    660664   glBindBufferRange(GL_UNIFORM_BUFFER, ub_binding_point, ubo, 0, GL_MAX_UNIFORM_BLOCK_SIZE);
    661665
     
    946950         //printVector("cam pos", cam_pos);
    947951
    948          glUseProgram(ship_sp);
     952         glUseProgram(modelGroups[TYPE_SHIP].shaderProgram);
    949953         glUniformMatrix4fv(ship_view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
    950954
     
    969973         case STATE_GAME:
    970974            renderScene(shaderBufferInfo, modelGroups, ubo,
    971                ship_sp, laser_sp,
    972                ship_vao, laser_vao);
     975               laser_sp, laser_vao);
    973976            renderSceneGui();
    974977            break;
     
    13331336   BufferInfo* bufferInfo = &shaderBufferInfo[obj->shader_program];
    13341337
    1335    unsigned int numPoints = obj->type == TYPE_ASTEROID || obj->type == TYPE_EXPLOSION ?
     1338   unsigned int numPoints =
     1339      obj->type == TYPE_SHIP ||
     1340      obj->type == TYPE_ASTEROID ||
     1341      obj->type == TYPE_EXPLOSION ?
    13361342      modelGroups[obj->type].numPoints :
    13371343      bufferInfo->vbo_offset;
     
    20832089      shaderBufferInfo[shaderCountIt->first].ubo_base = lastShaderUboCount * 2;
    20842090
    2085       if (shaderCountIt->first != modelGroups[TYPE_ASTEROID].shaderProgram &&
     2091      if (shaderCountIt->first != modelGroups[TYPE_SHIP].shaderProgram &&
     2092         shaderCountIt->first != modelGroups[TYPE_ASTEROID].shaderProgram &&
    20862093         shaderCountIt->first != modelGroups[TYPE_EXPLOSION].shaderProgram) {
    20872094         shaderBufferInfo[shaderCountIt->first].vbo_offset = 0;
     
    20962103   }
    20972104
    2098    modelGroups[TYPE_ASTEROID].numPoints = 0;
    2099    modelGroups[TYPE_EXPLOSION].numPoints = 0;
     2105   map<ObjectType, ShaderModelGroup>::iterator modelGroupIt;
     2106   for (modelGroupIt = modelGroups.begin(); modelGroupIt != modelGroups.end(); modelGroupIt++) {
     2107      if (modelGroupIt->first == TYPE_SHIP ||
     2108         modelGroupIt->first == TYPE_ASTEROID ||
     2109         modelGroupIt->first == TYPE_EXPLOSION) {
     2110         modelGroups[modelGroupIt->first].numPoints = 0;
     2111      }
     2112   }
    21002113
    21012114   // Allocate all the buffers using the counts calculated above
     
    21412154   BufferInfo* bufferInfo = &shaderBufferInfo[obj.shader_program];
    21422155
    2143    if (obj.type == TYPE_ASTEROID || obj.type == TYPE_EXPLOSION) {
     2156   if (obj.type == TYPE_SHIP ||
     2157      obj.type == TYPE_ASTEROID ||
     2158      obj.type == TYPE_EXPLOSION) {
    21442159      obj.vertex_vbo_offset = bufferInfo->vbo_base + modelGroups[obj.type].numPoints;
    21452160   } else {
     
    21862201   }
    21872202
    2188    if (obj.type == TYPE_ASTEROID || obj.type == TYPE_EXPLOSION) {
     2203   if (obj.type == TYPE_SHIP ||
     2204      obj.type == TYPE_ASTEROID ||
     2205      obj.type == TYPE_EXPLOSION) {
    21892206      modelGroups[obj.type].numPoints += obj.num_points;
    21902207   } else {
     
    23562373void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo,
    23572374                  map<ObjectType, ShaderModelGroup>& modelGroups, GLuint ubo,
    2358                   GLuint ship_sp, GLuint laser_sp,
    2359                   GLuint ship_vao, GLuint laser_vao) {
    2360 
    2361    glUseProgram(ship_sp);
    2362    glBindVertexArray(ship_vao);
    2363 
    2364    glDrawArrays(GL_TRIANGLES, shaderBufferInfo[ship_sp].vbo_base, shaderBufferInfo[ship_sp].vbo_offset);
     2375                  GLuint laser_sp, GLuint laser_vao) {
     2376
     2377   glUseProgram(modelGroups[TYPE_SHIP].shaderProgram);
     2378   glBindVertexArray(modelGroups[TYPE_SHIP].vao);
     2379
     2380   glDrawArrays(GL_TRIANGLES, shaderBufferInfo[modelGroups[TYPE_SHIP].shaderProgram].vbo_base, modelGroups[TYPE_SHIP].numPoints);
    23652381
    23662382   glUseProgram(modelGroups[TYPE_ASTEROID].shaderProgram);
Note: See TracChangeset for help on using the changeset viewer.