Changes in new-game.cpp [39ac76d:bebfd5c] in opengl-game


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • new-game.cpp

    r39ac76d rbebfd5c  
    7070   vector<GLfloat> texcoords;
    7171   vector<GLfloat> normals;
     72   vector<GLfloat> selected_colors;
    7273   bool deleted;
    7374   vec3 bounding_center;
     
    9192   SceneObject* effectedObject;
    9293
    93    // TODO: Why not just use an initializer list for all the instance variables
    9494   EffectOverTime(float& effectedValue, float changePerSecond, SceneObject* object)
    9595      : effectedValue(effectedValue), changePerSecond(changePerSecond), effectedObject(object) {
     
    139139                  GLuint points_vbo,
    140140                  GLuint colors_vbo,
     141                  GLuint selected_colors_vbo,
     142                  GLuint texcoords_vbo,
     143                  GLuint normals_vbo,
     144                  GLuint ubo,
     145                  GLuint model_mat_idx_vbo,
     146                  GLuint asteroid_sp,
     147                  GLuint explosion_sp);
     148void removeObjectFromScene(SceneObject& obj, GLuint ubo);
     149
     150void calculateObjectBoundingBox(SceneObject* obj);
     151
     152void initializeBuffers(
     153                  GLuint* points_vbo,
     154                  GLuint* colors_vbo,
     155                  GLuint* selected_colors_vbo,
     156                  GLuint* texcoords_vbo,
     157                  GLuint* normals_vbo,
     158                  GLuint* ubo,
     159                  GLuint* model_mat_idx_vbo);
     160
     161GLuint initializeParticleEffectBuffers(vec3 origin, mat4 proj, mat4 view, GLuint explosion_sp,
     162                  map<GLuint, BufferInfo>& shaderBufferInfo,
     163                  GLuint points_vbo,
     164                  GLuint colors_vbo,
     165                  GLuint selected_colors_vbo,
     166                  GLuint texcoords_vbo,
     167                  GLuint normals_vbo,
     168                  GLuint ubo,
     169                  GLuint model_mat_idx_vbo);
     170
     171void populateBuffers(vector<SceneObject*>& objects,
     172                  map<GLuint, BufferInfo>& shaderBufferInfo,
     173                  GLuint points_vbo,
     174                  GLuint colors_vbo,
     175                  GLuint selected_colors_vbo,
     176                  GLuint texcoords_vbo,
     177                  GLuint normals_vbo,
     178                  GLuint ubo,
     179                  GLuint model_mat_idx_vbo,
     180                  GLuint asteroid_sp,
     181                  GLuint explosion_sp);
     182
     183void copyObjectDataToBuffers(SceneObject& obj,
     184                  map<GLuint, BufferInfo>& shaderBufferInfo,
     185                  GLuint points_vbo,
     186                  GLuint colors_vbo,
     187                  GLuint selected_colors_vbo,
    141188                  GLuint texcoords_vbo,
    142189                  GLuint normals_vbo,
     
    144191                  GLuint model_mat_idx_vbo,
    145192                  GLuint asteroid_sp);
    146 void removeObjectFromScene(SceneObject& obj, GLuint ubo);
    147 
    148 void calculateObjectBoundingBox(SceneObject* obj);
    149 
    150 void initializeBuffers(
    151                   GLuint* points_vbo,
    152                   GLuint* colors_vbo,
    153                   GLuint* texcoords_vbo,
    154                   GLuint* normals_vbo,
    155                   GLuint* ubo,
    156                   GLuint* model_mat_idx_vbo);
    157 
    158 GLuint initializeParticleEffectBuffers(vec3 origin, mat4 proj, mat4 view, GLuint explosion_sp,
    159                   map<GLuint, BufferInfo>& shaderBufferInfo,
    160                   GLuint points_vbo,
    161                   GLuint colors_vbo,
    162                   GLuint texcoords_vbo,
    163                   GLuint normals_vbo,
    164                   GLuint ubo,
    165                   GLuint model_mat_idx_vbo);
    166 
    167 void populateBuffers(vector<SceneObject*>& objects,
    168                   map<GLuint, BufferInfo>& shaderBufferInfo,
    169                   GLuint points_vbo,
    170                   GLuint colors_vbo,
    171                   GLuint texcoords_vbo,
    172                   GLuint normals_vbo,
    173                   GLuint ubo,
    174                   GLuint model_mat_idx_vbo,
    175                   GLuint asteroid_sp);
    176 
    177 void copyObjectDataToBuffers(SceneObject& obj,
    178                   map<GLuint, BufferInfo>& shaderBufferInfo,
    179                   GLuint points_vbo,
    180                   GLuint colors_vbo,
    181                   GLuint texcoords_vbo,
    182                   GLuint normals_vbo,
    183                   GLuint ubo,
    184                   GLuint model_mat_idx_vbo,
    185                   GLuint asteroid_sp);
    186193
    187194void transformObject(SceneObject& obj, const mat4& transform, GLuint ubo);
    188195
    189 // TODO: instead of using these methods, create constructors for these
     196// instead of using these methods, create constructors for these
    190197SceneObject* createShip(GLuint shader);
    191198Asteroid* createAsteroid(vec3 pos, GLuint shader);
     
    201208
    202209void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo,
    203                   GLuint ship_sp, GLuint asteroid_sp, GLuint laser_sp, GLuint explosion_sp,
    204                   GLuint ship_vao, GLuint asteroid_vao, GLuint laser_vao, GLuint explosion_vao,
    205                   GLuint colors_vbo, GLuint ubo, SceneObject* selectedObject);
     210                  GLuint color_sp, GLuint asteroid_sp, GLuint texture_sp, GLuint laser_sp, GLuint explosion_sp,
     211                  GLuint color_vao, GLuint asteroid_vao, GLuint texture_vao, GLuint laser_vao, GLuint explosion_vao,
     212                  GLuint colors_vbo, GLuint selected_colors_vbo,
     213                  SceneObject* selectedObject);
    206214
    207215void renderSceneGui();
     
    254262
    255263SceneObject* objExplosion;
    256 SceneObject* objFirst;
     264SceneObject* objFirst; // TODO: Set this, probably in populateBuffers and wherever else is appropriate.
    257265
    258266/*
     
    445453   map<GLuint, BufferInfo> shaderBufferInfo;
    446454
    447    GLuint ship_sp = loadShaderProgram("./ship.vert", "./ship.frag");
     455   // TODO: Rename color_sp to ship_sp and comment out texture_sp)
     456
     457   GLuint color_sp = loadShaderProgram("./ship.vert", "./ship.frag");
    448458   GLuint asteroid_sp = loadShaderProgram("./asteroid.vert", "./asteroid.frag");
     459   GLuint texture_sp = loadShaderProgram("./texture.vert", "./texture.frag");
    449460   GLuint laser_sp = loadShaderProgram("./laser.vert", "./laser.frag");
    450461   GLuint explosion_sp = loadShaderProgram("./explosion.vert", "./explosion.frag");
    451462
    452    shaderBufferInfo[ship_sp] = BufferInfo();
     463   shaderBufferInfo[color_sp] = BufferInfo();
    453464   shaderBufferInfo[asteroid_sp] = BufferInfo();
     465   shaderBufferInfo[texture_sp] = BufferInfo();
    454466   shaderBufferInfo[laser_sp] = BufferInfo();
    455467   shaderBufferInfo[explosion_sp] = BufferInfo();
     
    460472
    461473   // player ship
    462    SceneObject* ship = createShip(ship_sp);
     474   SceneObject* ship = createShip(color_sp);
    463475   objects.push_back(ship);
    464476
    465477   vector<SceneObject>::iterator obj_it;
    466478
    467    GLuint points_vbo, colors_vbo, texcoords_vbo, normals_vbo, ubo, model_mat_idx_vbo;
     479   GLuint points_vbo, colors_vbo, selected_colors_vbo, texcoords_vbo,
     480      normals_vbo, ubo, model_mat_idx_vbo;
    468481
    469482   initializeBuffers(
    470483      &points_vbo,
    471484      &colors_vbo,
     485      &selected_colors_vbo,
    472486      &texcoords_vbo,
    473487      &normals_vbo,
     
    479493      points_vbo,
    480494      colors_vbo,
     495      selected_colors_vbo,
    481496      texcoords_vbo,
    482497      normals_vbo,
    483498      ubo,
    484499      model_mat_idx_vbo,
    485       asteroid_sp);
    486 
    487    GLuint ship_vao = 0;
    488    glGenVertexArrays(1, &ship_vao);
    489    glBindVertexArray(ship_vao);
     500      asteroid_sp,
     501      explosion_sp);
     502
     503   GLuint color_vao = 0;
     504   glGenVertexArrays(1, &color_vao);
     505   glBindVertexArray(color_vao);
    490506
    491507   glEnableVertexAttribArray(0);
     
    521537   glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
    522538   glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
     539
     540   glBindBuffer(GL_ARRAY_BUFFER, normals_vbo);
     541   glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, NULL);
     542
     543   glBindBuffer(GL_ARRAY_BUFFER, model_mat_idx_vbo);
     544   glVertexAttribIPointer(3, 1, GL_UNSIGNED_INT, 0, NULL);
     545
     546   GLuint texture_vao = 0;
     547   glGenVertexArrays(1, &texture_vao);
     548   glBindVertexArray(texture_vao);
     549
     550   glEnableVertexAttribArray(0);
     551   glEnableVertexAttribArray(1);
     552   glEnableVertexAttribArray(2);
     553   glEnableVertexAttribArray(3);
     554
     555   glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
     556   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
     557
     558   glBindBuffer(GL_ARRAY_BUFFER, texcoords_vbo);
     559   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
    523560
    524561   glBindBuffer(GL_ARRAY_BUFFER, normals_vbo);
     
    582619      points_vbo,
    583620      colors_vbo,
     621      selected_colors_vbo,
    584622      texcoords_vbo,
    585623      normals_vbo,
     
    587625      model_mat_idx_vbo);
    588626
     627   /* TODO: Fix the UBO binding code based on the following forum post (in order to support multiple ubos):
     628
     629      No, you're misunderstanding how this works. UBO binding works exactly like texture object binding.
     630
     631      The OpenGL context has a number of slots for binding UBOs. There are GL_MAX_UNIFORM_BUFFER_BINDINGS number of
     632      slots for UBO binding.
     633
     634      Uniform Blocks in a program can be set to use one of the slots in the context. You do this by first querying
     635      the block index using the block name (glGetUniformBlockIndex). This is similar to how you need to use
     636      glGetUniformLocation in order to set a uniform's value with glUniform. Block indices, like uniform locations,
     637      are specific to a program.
     638
     639      Once you have the block index, you use glUniformBlockBinding to set that specific program to use a particular
     640      uniform buffer slot in the context.
     641
     642      Let's say you have a global UBO that you want to use for every program. To make using it easier, you want to
     643      bind it just once.
     644
     645      So first, you pick a uniform buffer slot in the context, one that always will refer to this UBO. Let's say
     646      you pick slot 8.
     647
     648      When you build a program object that may use this global uniform buffer, what you do is quite simple. First,
     649      after linking the program, call glGetUniformBlockIndex(program, "NameOfGlobalUniformBlock"). If you get back
     650      GL_INVALID_INDEX, then you know that the global uniform block isn't used in that program. Otherwise you get
     651      back a block index.
     652
     653      If you got a valid block index, then you call glUniformBlockBinding(program, uniformBlockIndex, 8). Remember
     654      that 8 is the uniform buffer context slot that we selected earlier. This causes this particular program to
     655      use uniform buffer slot #8 to find the buffer for "NameOfGlobalUniformBlock".
     656
     657      Finally, to set the actual buffer in the context, call glBindBufferRange(GL_UNIFORM_BUFFER, 8,
     658      bufferObjectName, offset, size);
     659   */
     660
    589661   GLuint ub_binding_point = 0;
    590662
    591    GLuint ship_view_mat_loc = glGetUniformLocation(ship_sp, "view");
    592    GLuint ship_proj_mat_loc = glGetUniformLocation(ship_sp, "proj");
    593    GLuint ship_sp_models_ub_index = glGetUniformBlockIndex(ship_sp, "models");
     663   // TODO: Replace test_loc and mat_loc with more descriptive names
     664   GLuint view_test_loc = glGetUniformLocation(color_sp, "view");
     665   GLuint proj_test_loc = glGetUniformLocation(color_sp, "proj");
     666   GLuint color_sp_models_ub_index = glGetUniformBlockIndex(color_sp, "models");
    594667
    595668   GLuint asteroid_view_mat_loc = glGetUniformLocation(asteroid_sp, "view");
    596669   GLuint asteroid_proj_mat_loc = glGetUniformLocation(asteroid_sp, "proj");
    597670   GLuint asteroid_sp_models_ub_index = glGetUniformBlockIndex(asteroid_sp, "models");
     671
     672   GLuint view_mat_loc = glGetUniformLocation(texture_sp, "view");
     673   GLuint proj_mat_loc = glGetUniformLocation(texture_sp, "proj");
     674   GLuint texture_sp_models_ub_index = glGetUniformBlockIndex(texture_sp, "models");
    598675
    599676   GLuint laser_view_mat_loc = glGetUniformLocation(laser_sp, "view");
     
    607684
    608685
    609    glUseProgram(ship_sp);
    610    glUniformMatrix4fv(ship_view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
    611    glUniformMatrix4fv(ship_proj_mat_loc, 1, GL_FALSE, value_ptr(proj_mat));
    612 
    613    glUniformBlockBinding(ship_sp, ship_sp_models_ub_index, ub_binding_point);
     686   glUseProgram(color_sp);
     687   glUniformMatrix4fv(view_test_loc, 1, GL_FALSE, value_ptr(view_mat));
     688   glUniformMatrix4fv(proj_test_loc, 1, GL_FALSE, value_ptr(proj_mat));
     689
     690   glUniformBlockBinding(color_sp, color_sp_models_ub_index, ub_binding_point);
    614691   glBindBufferRange(GL_UNIFORM_BUFFER, ub_binding_point, ubo, 0, GL_MAX_UNIFORM_BLOCK_SIZE);
    615692
     
    620697
    621698   glUniformBlockBinding(asteroid_sp, asteroid_sp_models_ub_index, ub_binding_point);
     699   glBindBufferRange(GL_UNIFORM_BUFFER, ub_binding_point, ubo, 0, GL_MAX_UNIFORM_BLOCK_SIZE);
     700
     701
     702   glUseProgram(texture_sp);
     703   glUniformMatrix4fv(view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
     704   glUniformMatrix4fv(proj_mat_loc, 1, GL_FALSE, value_ptr(proj_mat));
     705
     706   glUniformBlockBinding(texture_sp, texture_sp_models_ub_index, ub_binding_point);
    622707   glBindBufferRange(GL_UNIFORM_BUFFER, ub_binding_point, ubo, 0, GL_MAX_UNIFORM_BLOCK_SIZE);
    623708
     
    708793               points_vbo,
    709794               colors_vbo,
     795               selected_colors_vbo,
    710796               texcoords_vbo,
    711797               normals_vbo,
    712798               ubo,
    713799               model_mat_idx_vbo,
    714                asteroid_sp);
     800               asteroid_sp,
     801               explosion_sp);
    715802
    716803            elapsed_seconds_spawn -= 0.5f;
     
    767854               points_vbo,
    768855               colors_vbo,
     856               selected_colors_vbo,
    769857               texcoords_vbo,
    770858               normals_vbo,
    771859               ubo,
    772860               model_mat_idx_vbo,
    773                asteroid_sp);
     861               asteroid_sp,
     862               explosion_sp);
    774863         } else if (key_state[GLFW_KEY_Z] == GLFW_RELEASE) {
    775864            removeObjectFromScene(*leftLaser, ubo);
     
    784873               points_vbo,
    785874               colors_vbo,
     875               selected_colors_vbo,
    786876               texcoords_vbo,
    787877               normals_vbo,
    788878               ubo,
    789879               model_mat_idx_vbo,
    790                asteroid_sp);
     880               asteroid_sp,
     881               explosion_sp);
    791882         } else if (key_state[GLFW_KEY_X] == GLFW_RELEASE) {
    792883            removeObjectFromScene(*rightLaser, ubo);
     
    803894                  removeObjectFromScene(*objects[i], ubo);
    804895               }
    805                // MARKER: Continue code review from here
    806896               if (((Asteroid*)objects[i])->hp <= 0) {
     897                  printVector("center", objects[i]->bounding_center);
     898
    807899                  // TODO: Optimize this so I don't recalculate the camera rotation every time
    808900                  float cam_pitch = -50.0f * 2.0f * 3.14159f / 360.0f;
     
    817909                  // initiate an explosion
    818910                  glUseProgram(explosion_sp);
    819 
     911                 
    820912                  GLuint model_mat_loc = glGetUniformLocation(explosion_sp, "model_mat");
    821913                  glUniformMatrix4fv(model_mat_loc, 1, GL_FALSE, value_ptr(objExplosion->model_mat));
    822914
     915                  // TODO: To get ubos working for the explosion,
     916                  // I need to calculate the correct ubo index for the model matrix
     917                  // Then I need to copy the matrix into the right place in the ubo and
     918                  // copy the index into the correct uniform
     919
     920                  // STEP 1: Make sure the UBO offset for the explosion shader is correct
     921
     922                  cout << "UBO OFFSET: " << objExplosion->ubo_offset << endl;
     923                  //glBindBuffer(GL_UNIFORM_BUFFER, ubo);
     924                  //glBufferSubData(GL_UNIFORM_BUFFER, objExplosion->ubo_offset * sizeof(mat4), sizeof(mat4), value_ptr(objExplosion->model_mat));
     925
    823926                  glUniform1f(explosion_start_time_loc, (GLfloat)glfwGetTime());
     927
     928                  // generic code used to change a matrix in the ubo
     929                  // we need to know the matrix of the first object in the ubo so we can save it and move it back
     930                  // after the explosion is rendered
     931                  // However, that should be done in the render loop, not here
     932                  // Here, we are already saving the explosion model mat in objExplosion->model_mat, so that is all we need
     933                  glBindBuffer(GL_UNIFORM_BUFFER, ubo);
     934                  glBufferSubData(GL_UNIFORM_BUFFER, obj.ubo_offset * sizeof(mat4), sizeof(mat4), value_ptr(obj.model_mat));
    824935               }
    825936            }
     
    9041015         //printVector("cam pos", cam_pos);
    9051016
    906          glUseProgram(ship_sp);
    907          glUniformMatrix4fv(ship_view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
     1017         glUseProgram(color_sp);
     1018         glUniformMatrix4fv(view_test_loc, 1, GL_FALSE, value_ptr(view_mat));
     1019
     1020         glUseProgram(texture_sp);
     1021         glUniformMatrix4fv(view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
    9081022
    9091023         glUseProgram(laser_sp);
     
    9271041         case STATE_GAME:
    9281042            renderScene(shaderBufferInfo,
    929                ship_sp, asteroid_sp, laser_sp, explosion_sp,
    930                ship_vao, asteroid_vao, laser_vao, explosion_vao,
    931                colors_vbo, ubo, selectedObject);
     1043               color_sp, asteroid_sp, texture_sp, laser_sp, explosion_sp,
     1044               color_vao, asteroid_vao, texture_vao, laser_vao, explosion_vao,
     1045               colors_vbo, selected_colors_vbo,
     1046               selectedObject);
    9321047            renderSceneGui();
    9331048            break;
     
    12831398   GLuint points_vbo,
    12841399   GLuint colors_vbo,
     1400   GLuint selected_colors_vbo,
    12851401   GLuint texcoords_vbo,
    12861402   GLuint normals_vbo,
    12871403   GLuint ubo,
    12881404   GLuint model_mat_idx_vbo,
    1289    GLuint asteroid_sp) {
     1405   GLuint asteroid_sp,
     1406   GLuint explosion_sp) {
    12901407   objects.push_back(obj);
    12911408
     
    13071424         points_vbo,
    13081425         colors_vbo,
     1426         selected_colors_vbo,
    13091427         texcoords_vbo,
    13101428         normals_vbo,
    13111429         ubo,
    13121430         model_mat_idx_vbo,
    1313          asteroid_sp);
     1431         asteroid_sp,
     1432         explosion_sp);
    13141433   } else {
    13151434      copyObjectDataToBuffers(*objects.back(), shaderBufferInfo,
    13161435         points_vbo,
    13171436         colors_vbo,
     1437         selected_colors_vbo,
    13181438         texcoords_vbo,
    13191439         normals_vbo,
     
    17601880   };
    17611881   ship->texcoords = { 0.0f };
     1882   ship->selected_colors = { 0.0f };
    17621883
    17631884   mat4 T_model = translate(mat4(1.0f), vec3(0.0f, -1.2f, 1.65f));
     
    18641985                  GLuint* points_vbo,
    18651986                  GLuint* colors_vbo,
     1987                  GLuint* selected_colors_vbo,
    18661988                  GLuint* texcoords_vbo,
    18671989                  GLuint* normals_vbo,
     
    18741996   glGenBuffers(1, colors_vbo);
    18751997
     1998   *selected_colors_vbo = 0;
     1999   glGenBuffers(1, selected_colors_vbo);
     2000
    18762001   *texcoords_vbo = 0;
    18772002   glGenBuffers(1, texcoords_vbo);
     
    18912016                  GLuint points_vbo,
    18922017                  GLuint colors_vbo,
     2018                  GLuint selected_colors_vbo,
    18932019                  GLuint texcoords_vbo,
    18942020                  GLuint normals_vbo,
    18952021                  GLuint ubo,
    18962022                  GLuint model_mat_idx_vbo) {
     2023   //unsigned int num_explosions = 1;
     2024
    18972025   float vv[EXPLOSION_PARTICLE_COUNT * 3]; // initial velocities vec3
    18982026   float vt[EXPLOSION_PARTICLE_COUNT]; // initial times
     
    19242052   glUniformMatrix4fv(model_mat_loc, 1, GL_FALSE, value_ptr(model_mat));
    19252053
     2054   /*
     2055   GLuint model_ubo = 0;
     2056   glGenBuffers(1, &model_ubo);
     2057
     2058   glBindBuffer(GL_UNIFORM_BUFFER, model_ubo);
     2059   glBufferData(GL_UNIFORM_BUFFER, num_explosions * sizeof(mat4), NULL, GL_DYNAMIC_DRAW);
     2060
     2061   //glBindBuffer(GL_UNIFORM_BUFFER, ubo);
     2062   glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(mat4), value_ptr(model_mat));
     2063   */
     2064
    19262065   GLuint velocity_vbo;
    19272066   glGenBuffers(1, &velocity_vbo);
     
    19402079   glEnableVertexAttribArray(0);
    19412080   glEnableVertexAttribArray(1);
     2081   glEnableVertexAttribArray(2);
    19422082
    19432083   glBindBuffer(GL_ARRAY_BUFFER, velocity_vbo);
     
    19472087   glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, NULL);
    19482088
     2089   // TODO: I think I can call glVertexAttribIPointer whenever the vbo_base changes
     2090   // to rebind the ubo index vbo
     2091   glBindBuffer(GL_ARRAY_BUFFER, model_mat_idx_vbo);
     2092   glVertexAttribIPointer(2, 1, GL_UNSIGNED_INT, 0, NULL);
     2093
    19492094   objExplosion = createExplosion(explosion_sp);
     2095   objExplosion->num_points = EXPLOSION_PARTICLE_COUNT;
    19502096   addObjectToScene(objExplosion, shaderBufferInfo,
    19512097      points_vbo,
    19522098      colors_vbo,
     2099      selected_colors_vbo,
    19532100      texcoords_vbo,
    19542101      normals_vbo,
    19552102      ubo,
    19562103      model_mat_idx_vbo,
    1957       0);
     2104      0,
     2105      explosion_sp);
    19582106
    19592107   return vao;
     
    19642112                  GLuint points_vbo,
    19652113                  GLuint colors_vbo,
     2114                  GLuint selected_colors_vbo,
    19662115                  GLuint texcoords_vbo,
    19672116                  GLuint normals_vbo,
    19682117                  GLuint ubo,
    19692118                  GLuint ubo_idx_vbo,
    1970                   GLuint asteroid_sp) {
     2119                  GLuint asteroid_sp,
     2120                  GLuint explosion_sp) {
    19712121   GLsizeiptr num_points = 0;
    19722122   GLsizeiptr num_objects = 0;
     
    20262176      shaderBufferInfo[shaderCountIt->first].ubo_base = lastShaderUboCount * 2;
    20272177
     2178      if (shaderCountIt->first == explosion_sp) {
     2179         cout << "EXPLOSION VBO_BASE: " << shaderBufferInfo[shaderCountIt->first].vbo_base << endl;
     2180      }
     2181
     2182      /*
     2183      cout << "shader: " << shaderCountIt->first << endl;
     2184      cout << "point counts: " << shaderCounts[shaderCountIt->first] << endl;
     2185      cout << "object counts: " << shaderUboCounts[shaderCountIt->first] << endl;
     2186      cout << "vbo_base: " << shaderBufferInfo[shaderCountIt->first].vbo_base << endl;
     2187      cout << "ubo_base: " << shaderBufferInfo[shaderCountIt->first].ubo_base << endl;
     2188      */
     2189
    20282190      shaderBufferInfo[shaderCountIt->first].vbo_offset = 0;
    20292191      shaderBufferInfo[shaderCountIt->first].ubo_offset = 0;
     
    20422204
    20432205   glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
     2206   glBufferData(GL_ARRAY_BUFFER, num_points * sizeof(GLfloat) * 3, NULL, GL_DYNAMIC_DRAW);
     2207
     2208   glBindBuffer(GL_ARRAY_BUFFER, selected_colors_vbo);
    20442209   glBufferData(GL_ARRAY_BUFFER, num_points * sizeof(GLfloat) * 3, NULL, GL_DYNAMIC_DRAW);
    20452210
     
    20602225         points_vbo,
    20612226         colors_vbo,
     2227         selected_colors_vbo,
    20622228         texcoords_vbo,
    20632229         normals_vbo,
     
    20722238                  GLuint points_vbo,
    20732239                  GLuint colors_vbo,
     2240                  GLuint selected_colors_vbo,
    20742241                  GLuint texcoords_vbo,
    20752242                  GLuint normals_vbo,
     
    20822249   obj.ubo_offset = bufferInfo->ubo_base + bufferInfo->ubo_offset;
    20832250
    2084    if (obj.ubo_offset == 0) {
    2085       objFirst = &obj;
     2251   if (obj.type == TYPE_EXPLOSION) {
     2252      cout << "UBO OFFSET: " << obj.ubo_offset << endl;
     2253   }
     2254   glBindBuffer(GL_ARRAY_BUFFER, model_mat_idx_vbo);
     2255   for (unsigned int i = 0; i < obj.num_points; i++) {
     2256      glBufferSubData(GL_ARRAY_BUFFER, (obj.vertex_vbo_offset + i) * sizeof(GLuint), sizeof(GLuint), &obj.ubo_offset);
    20862257   }
    20872258
    20882259   if (obj.type != TYPE_EXPLOSION) {
    2089       glBindBuffer(GL_ARRAY_BUFFER, model_mat_idx_vbo);
    2090       for (unsigned int i = 0; i < obj.num_points; i++) {
    2091          glBufferSubData(GL_ARRAY_BUFFER, (obj.vertex_vbo_offset + i) * sizeof(GLuint), sizeof(GLuint), &obj.ubo_offset);
    2092       }
    2093 
    20942260      glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
    20952261      glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.points.size() * sizeof(GLfloat), &obj.points[0]);
     
    21012267         glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
    21022268         glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.colors.size() * sizeof(GLfloat), &obj.colors[0]);
     2269
     2270         glBindBuffer(GL_ARRAY_BUFFER, selected_colors_vbo);
     2271         glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.selected_colors.size() * sizeof(GLfloat), &obj.selected_colors[0]);
    21032272
    21042273         glBindBuffer(GL_ARRAY_BUFFER, normals_vbo);
     
    22842453
    22852454void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo,
    2286                   GLuint ship_sp, GLuint asteroid_sp, GLuint laser_sp, GLuint explosion_sp,
    2287                   GLuint ship_vao, GLuint asteroid_vao, GLuint laser_vao, GLuint explosion_vao,
    2288                   GLuint colors_vbo, GLuint ubo, SceneObject* selectedObject) {
    2289 
    2290    glUseProgram(ship_sp);
    2291    glBindVertexArray(ship_vao);
    2292 
    2293    glDrawArrays(GL_TRIANGLES, shaderBufferInfo[ship_sp].vbo_base, shaderBufferInfo[ship_sp].vbo_offset);
     2455                  GLuint color_sp, GLuint asteroid_sp, GLuint texture_sp, GLuint laser_sp, GLuint explosion_sp,
     2456                  GLuint color_vao, GLuint asteroid_vao, GLuint texture_vao, GLuint laser_vao, GLuint explosion_vao,
     2457                  GLuint colors_vbo, GLuint selected_colors_vbo,
     2458                  SceneObject* selectedObject) {
     2459
     2460   glUseProgram(color_sp);
     2461   glBindVertexArray(color_vao);
     2462
     2463   /*
     2464   if (selectedObject != NULL) {
     2465      glBindBuffer(GL_ARRAY_BUFFER, selected_colors_vbo);
     2466      glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
     2467
     2468      glDrawArrays(GL_TRIANGLES, selectedObject->vertex_vbo_offset, selectedObject->num_points);
     2469   }
     2470   */
     2471
     2472   // Uncomment this code when I want to use selected colors again
     2473   // glBindBuffer(GL_ARRAY_BUFFER, colors_vbo);
     2474   // glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
     2475
     2476   glDrawArrays(GL_TRIANGLES, shaderBufferInfo[color_sp].vbo_base, shaderBufferInfo[color_sp].vbo_offset);
    22942477
    22952478   glUseProgram(asteroid_sp);
     
    22982481   glDrawArrays(GL_TRIANGLES, shaderBufferInfo[asteroid_sp].vbo_base, shaderBufferInfo[asteroid_sp].vbo_offset);
    22992482
     2483   glUseProgram(texture_sp);
     2484   glBindVertexArray(texture_vao);
     2485
     2486   glDrawArrays(GL_TRIANGLES, shaderBufferInfo[texture_sp].vbo_base, shaderBufferInfo[texture_sp].vbo_offset);
     2487
    23002488   glEnable(GL_BLEND);
    23012489
     
    23052493   glDrawArrays(GL_TRIANGLES, shaderBufferInfo[laser_sp].vbo_base, shaderBufferInfo[laser_sp].vbo_offset);
    23062494
    2307    // To render explosions, my new shader descriptor object needs to have a refernece to the shader and the vao
    2308    // and know the number of points to render.
    2309 
    23102495   glUseProgram(explosion_sp);
     2496
     2497   //glActiveTexture(GL_TEXTURE1);
     2498   //glBindTexture(GL_TEXTURE_2D, tex); // tex is 0 here
    23112499
    23122500   glEnable(GL_PROGRAM_POINT_SIZE);
    23132501   glBindVertexArray(explosion_vao);
    23142502
    2315    glBindBuffer(GL_UNIFORM_BUFFER, ubo);
    2316    glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(mat4), value_ptr(objExplosion->model_mat));
    2317 
    23182503   glDrawArrays(GL_POINTS, 0, shaderBufferInfo[explosion_sp].vbo_offset);
    2319 
    2320    glBindBuffer(GL_UNIFORM_BUFFER, ubo);
    2321    glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(mat4), value_ptr(objFirst->model_mat));
     2504   //glDrawArrays(GL_POINTS, shaderBufferInfo[explosion_sp].vbo_base, shaderBufferInfo[explosion_sp].vbo_offset);
     2505   //cout << shaderBufferInfo[explosion_sp].vbo_base << ", " << shaderBufferInfo[explosion_sp].vbo_offset << endl;
    23222506
    23232507   glDisable(GL_PROGRAM_POINT_SIZE);
     
    25262710   };
    25272711   obj->texcoords = { 0.0f };
     2712   obj->selected_colors = { 0.0f };
    25282713
    25292714   mat4 T = translate(mat4(1.0f), pos);
     
    25532738
    25542739   initObject(obj);
    2555    obj->num_points = EXPLOSION_PARTICLE_COUNT;
    25562740
    25572741   return obj;
Note: See TracChangeset for help on using the changeset viewer.