Changes in new-game.cpp [bebfd5c:39ac76d] in opengl-game
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
new-game.cpp
rbebfd5c r39ac76d 70 70 vector<GLfloat> texcoords; 71 71 vector<GLfloat> normals; 72 vector<GLfloat> selected_colors;73 72 bool deleted; 74 73 vec3 bounding_center; … … 92 91 SceneObject* effectedObject; 93 92 93 // TODO: Why not just use an initializer list for all the instance variables 94 94 EffectOverTime(float& effectedValue, float changePerSecond, SceneObject* object) 95 95 : effectedValue(effectedValue), changePerSecond(changePerSecond), effectedObject(object) { … … 139 139 GLuint points_vbo, 140 140 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);148 void removeObjectFromScene(SceneObject& obj, GLuint ubo);149 150 void calculateObjectBoundingBox(SceneObject* obj);151 152 void 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 161 GLuint 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 171 void 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 183 void copyObjectDataToBuffers(SceneObject& obj,184 map<GLuint, BufferInfo>& shaderBufferInfo,185 GLuint points_vbo,186 GLuint colors_vbo,187 GLuint selected_colors_vbo,188 141 GLuint texcoords_vbo, 189 142 GLuint normals_vbo, … … 191 144 GLuint model_mat_idx_vbo, 192 145 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); 193 186 194 187 void transformObject(SceneObject& obj, const mat4& transform, GLuint ubo); 195 188 196 // instead of using these methods, create constructors for these189 // TODO: instead of using these methods, create constructors for these 197 190 SceneObject* createShip(GLuint shader); 198 191 Asteroid* createAsteroid(vec3 pos, GLuint shader); … … 208 201 209 202 void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo, 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); 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); 214 206 215 207 void renderSceneGui(); … … 262 254 263 255 SceneObject* objExplosion; 264 SceneObject* objFirst; // TODO: Set this, probably in populateBuffers and wherever else is appropriate.256 SceneObject* objFirst; 265 257 266 258 /* … … 453 445 map<GLuint, BufferInfo> shaderBufferInfo; 454 446 455 // TODO: Rename color_sp to ship_sp and comment out texture_sp) 456 457 GLuint color_sp = loadShaderProgram("./ship.vert", "./ship.frag"); 447 GLuint ship_sp = loadShaderProgram("./ship.vert", "./ship.frag"); 458 448 GLuint asteroid_sp = loadShaderProgram("./asteroid.vert", "./asteroid.frag"); 459 GLuint texture_sp = loadShaderProgram("./texture.vert", "./texture.frag");460 449 GLuint laser_sp = loadShaderProgram("./laser.vert", "./laser.frag"); 461 450 GLuint explosion_sp = loadShaderProgram("./explosion.vert", "./explosion.frag"); 462 451 463 shaderBufferInfo[ color_sp] = BufferInfo();452 shaderBufferInfo[ship_sp] = BufferInfo(); 464 453 shaderBufferInfo[asteroid_sp] = BufferInfo(); 465 shaderBufferInfo[texture_sp] = BufferInfo();466 454 shaderBufferInfo[laser_sp] = BufferInfo(); 467 455 shaderBufferInfo[explosion_sp] = BufferInfo(); … … 472 460 473 461 // player ship 474 SceneObject* ship = createShip( color_sp);462 SceneObject* ship = createShip(ship_sp); 475 463 objects.push_back(ship); 476 464 477 465 vector<SceneObject>::iterator obj_it; 478 466 479 GLuint points_vbo, colors_vbo, selected_colors_vbo, texcoords_vbo, 480 normals_vbo, ubo, model_mat_idx_vbo; 467 GLuint points_vbo, colors_vbo, texcoords_vbo, normals_vbo, ubo, model_mat_idx_vbo; 481 468 482 469 initializeBuffers( 483 470 &points_vbo, 484 471 &colors_vbo, 485 &selected_colors_vbo,486 472 &texcoords_vbo, 487 473 &normals_vbo, … … 493 479 points_vbo, 494 480 colors_vbo, 495 selected_colors_vbo,496 481 texcoords_vbo, 497 482 normals_vbo, 498 483 ubo, 499 484 model_mat_idx_vbo, 500 asteroid_sp, 501 explosion_sp); 502 503 GLuint color_vao = 0; 504 glGenVertexArrays(1, &color_vao); 505 glBindVertexArray(color_vao); 485 asteroid_sp); 486 487 GLuint ship_vao = 0; 488 glGenVertexArrays(1, &ship_vao); 489 glBindVertexArray(ship_vao); 506 490 507 491 glEnableVertexAttribArray(0); … … 537 521 glBindBuffer(GL_ARRAY_BUFFER, colors_vbo); 538 522 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);560 523 561 524 glBindBuffer(GL_ARRAY_BUFFER, normals_vbo); … … 619 582 points_vbo, 620 583 colors_vbo, 621 selected_colors_vbo,622 584 texcoords_vbo, 623 585 normals_vbo, … … 625 587 model_mat_idx_vbo); 626 588 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 of632 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 querying635 the block index using the block name (glGetUniformBlockIndex). This is similar to how you need to use636 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 particular640 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 to643 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 say646 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 back650 GL_INVALID_INDEX, then you know that the global uniform block isn't used in that program. Otherwise you get651 back a block index.652 653 If you got a valid block index, then you call glUniformBlockBinding(program, uniformBlockIndex, 8). Remember654 that 8 is the uniform buffer context slot that we selected earlier. This causes this particular program to655 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 661 589 GLuint ub_binding_point = 0; 662 590 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"); 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"); 667 594 668 595 GLuint asteroid_view_mat_loc = glGetUniformLocation(asteroid_sp, "view"); 669 596 GLuint asteroid_proj_mat_loc = glGetUniformLocation(asteroid_sp, "proj"); 670 597 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");675 598 676 599 GLuint laser_view_mat_loc = glGetUniformLocation(laser_sp, "view"); … … 684 607 685 608 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);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); 691 614 glBindBufferRange(GL_UNIFORM_BUFFER, ub_binding_point, ubo, 0, GL_MAX_UNIFORM_BLOCK_SIZE); 692 615 … … 697 620 698 621 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);707 622 glBindBufferRange(GL_UNIFORM_BUFFER, ub_binding_point, ubo, 0, GL_MAX_UNIFORM_BLOCK_SIZE); 708 623 … … 793 708 points_vbo, 794 709 colors_vbo, 795 selected_colors_vbo,796 710 texcoords_vbo, 797 711 normals_vbo, 798 712 ubo, 799 713 model_mat_idx_vbo, 800 asteroid_sp, 801 explosion_sp); 714 asteroid_sp); 802 715 803 716 elapsed_seconds_spawn -= 0.5f; … … 854 767 points_vbo, 855 768 colors_vbo, 856 selected_colors_vbo,857 769 texcoords_vbo, 858 770 normals_vbo, 859 771 ubo, 860 772 model_mat_idx_vbo, 861 asteroid_sp, 862 explosion_sp); 773 asteroid_sp); 863 774 } else if (key_state[GLFW_KEY_Z] == GLFW_RELEASE) { 864 775 removeObjectFromScene(*leftLaser, ubo); … … 873 784 points_vbo, 874 785 colors_vbo, 875 selected_colors_vbo,876 786 texcoords_vbo, 877 787 normals_vbo, 878 788 ubo, 879 789 model_mat_idx_vbo, 880 asteroid_sp, 881 explosion_sp); 790 asteroid_sp); 882 791 } else if (key_state[GLFW_KEY_X] == GLFW_RELEASE) { 883 792 removeObjectFromScene(*rightLaser, ubo); … … 894 803 removeObjectFromScene(*objects[i], ubo); 895 804 } 805 // MARKER: Continue code review from here 896 806 if (((Asteroid*)objects[i])->hp <= 0) { 897 printVector("center", objects[i]->bounding_center);898 899 807 // TODO: Optimize this so I don't recalculate the camera rotation every time 900 808 float cam_pitch = -50.0f * 2.0f * 3.14159f / 360.0f; … … 909 817 // initiate an explosion 910 818 glUseProgram(explosion_sp); 911 819 912 820 GLuint model_mat_loc = glGetUniformLocation(explosion_sp, "model_mat"); 913 821 glUniformMatrix4fv(model_mat_loc, 1, GL_FALSE, value_ptr(objExplosion->model_mat)); 914 822 915 // TODO: To get ubos working for the explosion,916 // I need to calculate the correct ubo index for the model matrix917 // Then I need to copy the matrix into the right place in the ubo and918 // copy the index into the correct uniform919 920 // STEP 1: Make sure the UBO offset for the explosion shader is correct921 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 926 823 glUniform1f(explosion_start_time_loc, (GLfloat)glfwGetTime()); 927 928 // generic code used to change a matrix in the ubo929 // we need to know the matrix of the first object in the ubo so we can save it and move it back930 // after the explosion is rendered931 // However, that should be done in the render loop, not here932 // Here, we are already saving the explosion model mat in objExplosion->model_mat, so that is all we need933 glBindBuffer(GL_UNIFORM_BUFFER, ubo);934 glBufferSubData(GL_UNIFORM_BUFFER, obj.ubo_offset * sizeof(mat4), sizeof(mat4), value_ptr(obj.model_mat));935 824 } 936 825 } … … 1015 904 //printVector("cam pos", cam_pos); 1016 905 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)); 906 glUseProgram(ship_sp); 907 glUniformMatrix4fv(ship_view_mat_loc, 1, GL_FALSE, value_ptr(view_mat)); 1022 908 1023 909 glUseProgram(laser_sp); … … 1041 927 case STATE_GAME: 1042 928 renderScene(shaderBufferInfo, 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); 929 ship_sp, asteroid_sp, laser_sp, explosion_sp, 930 ship_vao, asteroid_vao, laser_vao, explosion_vao, 931 colors_vbo, ubo, selectedObject); 1047 932 renderSceneGui(); 1048 933 break; … … 1398 1283 GLuint points_vbo, 1399 1284 GLuint colors_vbo, 1400 GLuint selected_colors_vbo,1401 1285 GLuint texcoords_vbo, 1402 1286 GLuint normals_vbo, 1403 1287 GLuint ubo, 1404 1288 GLuint model_mat_idx_vbo, 1405 GLuint asteroid_sp, 1406 GLuint explosion_sp) { 1289 GLuint asteroid_sp) { 1407 1290 objects.push_back(obj); 1408 1291 … … 1424 1307 points_vbo, 1425 1308 colors_vbo, 1426 selected_colors_vbo,1427 1309 texcoords_vbo, 1428 1310 normals_vbo, 1429 1311 ubo, 1430 1312 model_mat_idx_vbo, 1431 asteroid_sp, 1432 explosion_sp); 1313 asteroid_sp); 1433 1314 } else { 1434 1315 copyObjectDataToBuffers(*objects.back(), shaderBufferInfo, 1435 1316 points_vbo, 1436 1317 colors_vbo, 1437 selected_colors_vbo,1438 1318 texcoords_vbo, 1439 1319 normals_vbo, … … 1880 1760 }; 1881 1761 ship->texcoords = { 0.0f }; 1882 ship->selected_colors = { 0.0f };1883 1762 1884 1763 mat4 T_model = translate(mat4(1.0f), vec3(0.0f, -1.2f, 1.65f)); … … 1985 1864 GLuint* points_vbo, 1986 1865 GLuint* colors_vbo, 1987 GLuint* selected_colors_vbo,1988 1866 GLuint* texcoords_vbo, 1989 1867 GLuint* normals_vbo, … … 1996 1874 glGenBuffers(1, colors_vbo); 1997 1875 1998 *selected_colors_vbo = 0;1999 glGenBuffers(1, selected_colors_vbo);2000 2001 1876 *texcoords_vbo = 0; 2002 1877 glGenBuffers(1, texcoords_vbo); … … 2016 1891 GLuint points_vbo, 2017 1892 GLuint colors_vbo, 2018 GLuint selected_colors_vbo,2019 1893 GLuint texcoords_vbo, 2020 1894 GLuint normals_vbo, 2021 1895 GLuint ubo, 2022 1896 GLuint model_mat_idx_vbo) { 2023 //unsigned int num_explosions = 1;2024 2025 1897 float vv[EXPLOSION_PARTICLE_COUNT * 3]; // initial velocities vec3 2026 1898 float vt[EXPLOSION_PARTICLE_COUNT]; // initial times … … 2052 1924 glUniformMatrix4fv(model_mat_loc, 1, GL_FALSE, value_ptr(model_mat)); 2053 1925 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 2065 1926 GLuint velocity_vbo; 2066 1927 glGenBuffers(1, &velocity_vbo); … … 2079 1940 glEnableVertexAttribArray(0); 2080 1941 glEnableVertexAttribArray(1); 2081 glEnableVertexAttribArray(2);2082 1942 2083 1943 glBindBuffer(GL_ARRAY_BUFFER, velocity_vbo); … … 2087 1947 glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, NULL); 2088 1948 2089 // TODO: I think I can call glVertexAttribIPointer whenever the vbo_base changes2090 // to rebind the ubo index vbo2091 glBindBuffer(GL_ARRAY_BUFFER, model_mat_idx_vbo);2092 glVertexAttribIPointer(2, 1, GL_UNSIGNED_INT, 0, NULL);2093 2094 1949 objExplosion = createExplosion(explosion_sp); 2095 objExplosion->num_points = EXPLOSION_PARTICLE_COUNT;2096 1950 addObjectToScene(objExplosion, shaderBufferInfo, 2097 1951 points_vbo, 2098 1952 colors_vbo, 2099 selected_colors_vbo,2100 1953 texcoords_vbo, 2101 1954 normals_vbo, 2102 1955 ubo, 2103 1956 model_mat_idx_vbo, 2104 0, 2105 explosion_sp); 1957 0); 2106 1958 2107 1959 return vao; … … 2112 1964 GLuint points_vbo, 2113 1965 GLuint colors_vbo, 2114 GLuint selected_colors_vbo,2115 1966 GLuint texcoords_vbo, 2116 1967 GLuint normals_vbo, 2117 1968 GLuint ubo, 2118 1969 GLuint ubo_idx_vbo, 2119 GLuint asteroid_sp, 2120 GLuint explosion_sp) { 1970 GLuint asteroid_sp) { 2121 1971 GLsizeiptr num_points = 0; 2122 1972 GLsizeiptr num_objects = 0; … … 2176 2026 shaderBufferInfo[shaderCountIt->first].ubo_base = lastShaderUboCount * 2; 2177 2027 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 2190 2028 shaderBufferInfo[shaderCountIt->first].vbo_offset = 0; 2191 2029 shaderBufferInfo[shaderCountIt->first].ubo_offset = 0; … … 2204 2042 2205 2043 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);2209 2044 glBufferData(GL_ARRAY_BUFFER, num_points * sizeof(GLfloat) * 3, NULL, GL_DYNAMIC_DRAW); 2210 2045 … … 2225 2060 points_vbo, 2226 2061 colors_vbo, 2227 selected_colors_vbo,2228 2062 texcoords_vbo, 2229 2063 normals_vbo, … … 2238 2072 GLuint points_vbo, 2239 2073 GLuint colors_vbo, 2240 GLuint selected_colors_vbo,2241 2074 GLuint texcoords_vbo, 2242 2075 GLuint normals_vbo, … … 2249 2082 obj.ubo_offset = bufferInfo->ubo_base + bufferInfo->ubo_offset; 2250 2083 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); 2084 if (obj.ubo_offset == 0) { 2085 objFirst = &obj; 2257 2086 } 2258 2087 2259 2088 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 2260 2094 glBindBuffer(GL_ARRAY_BUFFER, points_vbo); 2261 2095 glBufferSubData(GL_ARRAY_BUFFER, obj.vertex_vbo_offset * sizeof(GLfloat) * 3, obj.points.size() * sizeof(GLfloat), &obj.points[0]); … … 2267 2101 glBindBuffer(GL_ARRAY_BUFFER, colors_vbo); 2268 2102 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]);2272 2103 2273 2104 glBindBuffer(GL_ARRAY_BUFFER, normals_vbo); … … 2453 2284 2454 2285 void renderScene(map<GLuint, BufferInfo>& shaderBufferInfo, 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); 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); 2477 2294 2478 2295 glUseProgram(asteroid_sp); … … 2481 2298 glDrawArrays(GL_TRIANGLES, shaderBufferInfo[asteroid_sp].vbo_base, shaderBufferInfo[asteroid_sp].vbo_offset); 2482 2299 2483 glUseProgram(texture_sp);2484 glBindVertexArray(texture_vao);2485 2486 glDrawArrays(GL_TRIANGLES, shaderBufferInfo[texture_sp].vbo_base, shaderBufferInfo[texture_sp].vbo_offset);2487 2488 2300 glEnable(GL_BLEND); 2489 2301 … … 2493 2305 glDrawArrays(GL_TRIANGLES, shaderBufferInfo[laser_sp].vbo_base, shaderBufferInfo[laser_sp].vbo_offset); 2494 2306 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 2495 2310 glUseProgram(explosion_sp); 2496 2497 //glActiveTexture(GL_TEXTURE1);2498 //glBindTexture(GL_TEXTURE_2D, tex); // tex is 0 here2499 2311 2500 2312 glEnable(GL_PROGRAM_POINT_SIZE); 2501 2313 glBindVertexArray(explosion_vao); 2502 2314 2315 glBindBuffer(GL_UNIFORM_BUFFER, ubo); 2316 glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(mat4), value_ptr(objExplosion->model_mat)); 2317 2503 2318 glDrawArrays(GL_POINTS, 0, shaderBufferInfo[explosion_sp].vbo_offset); 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; 2319 2320 glBindBuffer(GL_UNIFORM_BUFFER, ubo); 2321 glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(mat4), value_ptr(objFirst->model_mat)); 2506 2322 2507 2323 glDisable(GL_PROGRAM_POINT_SIZE); … … 2710 2526 }; 2711 2527 obj->texcoords = { 0.0f }; 2712 obj->selected_colors = { 0.0f };2713 2528 2714 2529 mat4 T = translate(mat4(1.0f), pos); … … 2738 2553 2739 2554 initObject(obj); 2555 obj->num_points = EXPLOSION_PARTICLE_COUNT; 2740 2556 2741 2557 return obj;
Note:
See TracChangeset
for help on using the changeset viewer.