Changeset b155f13 in opengl-game for new-game.cpp


Ignore:
Timestamp:
Jul 12, 2018, 3:18:00 AM (6 years ago)
Author:
Dmitry Portnoy <dmp1488@…>
Branches:
feature/imgui-sdl, master, points-test
Children:
92b1e90
Parents:
5c02ddd
Message:

WIP: Start writing code for rendering lasers

File:
1 edited

Legend:

Unmodified
Added
Removed
  • new-game.cpp

    r5c02ddd rb155f13  
    104104void calculateObjectBoundingBox(SceneObject& obj);
    105105
     106void addLaserToScene(vec3 start, vec3 end, vec3 color,
     107                  GLfloat width,
     108                  unsigned int& num_lasers,
     109                  GLuint laser_points_vbo,
     110                  GLuint laser_colors_vbo);
     111
    106112void initializeBuffers(
    107113                  GLuint* points_vbo,
     
    141147                  GLuint color_sp, GLuint texture_sp,
    142148                  GLuint vao1, GLuint vao2,
    143                   GLuint points_vbo, GLuint normals_vbo,
    144                   GLuint colors_vbo, GLuint texcoords_vbo, GLuint selected_colors_vbo,
     149                  GLuint colors_vbo, GLuint selected_colors_vbo,
    145150                  SceneObject* selectedObject,
    146151                  map<GLuint, BufferInfo>& shaderBufferInfo);
     152void renderLasers(GLuint sp, GLuint vao, unsigned int numLasers);
    147153void renderSceneGui();
    148154
     
    345351   GLuint color_sp = loadShaderProgram("./color.vert", "./color.frag");
    346352   GLuint texture_sp = loadShaderProgram("./texture.vert", "./texture.frag");
     353   GLuint laser_sp = loadShaderProgram("./laser.vert", "./laser.frag");
    347354
    348355   shaderBufferInfo[color_sp] = BufferInfo();
    349356   shaderBufferInfo[texture_sp] = BufferInfo();
     357   shaderBufferInfo[laser_sp] = BufferInfo();
    350358
    351359   SceneObject obj;
     
    795803   obj.selected_colors = { 0.0f };
    796804
    797    T_model = translate(mat4(1.0f), vec3(0.0f, -1.2f, 1.8f));
     805   T_model = translate(mat4(1.0f), vec3(0.0f, -1.2f, 1.65f));
    798806   R_model = rotate(mat4(1.0f), 20.0f * (float)ONE_DEG_IN_RAD, vec3(1.0f, 0.0f, 0.0f));
    799807   R_model = mat4(1.0f);
     
    828836      model_mat_idx_vbo);
    829837
     838   unsigned int max_num_lasers = 20;
     839   unsigned int num_lasers = 0;
     840
     841   GLuint laser_points_vbo = 0;
     842   glGenBuffers(1, &laser_points_vbo);
     843   glBindBuffer(GL_ARRAY_BUFFER, laser_points_vbo);
     844   glBufferData(GL_ARRAY_BUFFER, max_num_lasers * 18 * sizeof(GLfloat) * 3, NULL, GL_DYNAMIC_DRAW);
     845
     846   GLuint laser_colors_vbo = 0;
     847   glGenBuffers(1, &laser_colors_vbo);
     848   glBindBuffer(GL_ARRAY_BUFFER, laser_colors_vbo);
     849   glBufferData(GL_ARRAY_BUFFER, max_num_lasers * 18 * sizeof(GLfloat) * 3, NULL, GL_DYNAMIC_DRAW);
     850
     851   addLaserToScene(vec3(0.34f, -2.0f, 1.6f), vec3(0.34f, -2.0f, -3.0f), vec3(0.0f, 1.0f, 0.0f), 0.04f,
     852      num_lasers, laser_points_vbo, laser_colors_vbo);
     853   addLaserToScene(vec3(-0.34f, -2.0f, 1.6f), vec3(-0.34f, -2.0f, -3.0f), vec3(0.0f, 1.0f, 0.0f), 0.04f,
     854      num_lasers, laser_points_vbo, laser_colors_vbo);
     855
    830856   GLuint vao = 0;
    831857   glGenVertexArrays(1, &vao);
     
    866892   glBindBuffer(GL_ARRAY_BUFFER, model_mat_idx_vbo);
    867893   glVertexAttribIPointer(3, 1, GL_UNSIGNED_INT, 0, 0);
     894
     895   GLuint laser_vao = 0;
     896   glGenVertexArrays(1, &laser_vao);
     897   glBindVertexArray(laser_vao);
     898
     899   glEnableVertexAttribArray(0);
     900   glEnableVertexAttribArray(1);
     901
     902   glBindBuffer(GL_ARRAY_BUFFER, laser_points_vbo);
     903   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
     904
     905   glBindBuffer(GL_ARRAY_BUFFER, laser_colors_vbo);
     906   glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    868907
    869908   float cam_speed = 1.0f;
     
    912951   GLuint texture_sp_ub_index = glGetUniformBlockIndex(texture_sp, "models");
    913952
     953   GLuint laser_view_mat_loc = glGetUniformLocation(laser_sp, "view");
     954   GLuint laser_proj_mat_loc = glGetUniformLocation(laser_sp, "proj");
     955
    914956   glUseProgram(color_sp);
    915957   glUniformMatrix4fv(view_test_loc, 1, GL_FALSE, value_ptr(view_mat));
     
    925967   glUniformBlockBinding(texture_sp, texture_sp_ub_index, ub_binding_point);
    926968   glBindBufferRange(GL_UNIFORM_BUFFER, ub_binding_point, ubo, 0, GL_MAX_UNIFORM_BLOCK_SIZE);
     969
     970   glUseProgram(laser_sp);
     971   glUniformMatrix4fv(laser_view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
     972   glUniformMatrix4fv(laser_proj_mat_loc, 1, GL_FALSE, value_ptr(proj_mat));
    927973
    928974   bool cam_moved = false;
     
    11131159         glUniformMatrix4fv(view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
    11141160
     1161         glUseProgram(laser_sp);
     1162         glUniformMatrix4fv(laser_view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
     1163
    11151164         cam_moved = false;
    11161165      }
     
    11291178               color_sp, texture_sp,
    11301179               vao, vao2,
    1131                points_vbo, normals_vbo,
    1132                colors_vbo, texcoords_vbo, selected_colors_vbo,
     1180               colors_vbo, selected_colors_vbo,
    11331181               selectedObject,
    11341182               shaderBufferInfo);
     1183            renderLasers(laser_sp, laser_vao, num_lasers);
    11351184            renderSceneGui();
    11361185            break;
     
    14771526}
    14781527
     1528// currently only works correctly for lasers oriented along the z axis
     1529void addLaserToScene(vec3 start, vec3 end, vec3 color, GLfloat width, unsigned int& num_lasers,
     1530                  GLuint laser_points_vbo, GLuint laser_colors_vbo) {
     1531   GLuint size_in_buffer = 18 * sizeof(GLfloat) * 3;
     1532
     1533   // I really need to create a direction vector and add/subtract that from start and end
     1534   // to get the right coords
     1535   // Also need to multiply the width times a vector perpendicular to it
     1536   vec3 dir = end - start;
     1537
     1538   vector<GLfloat> laser_points = {
     1539      end.x + width / 2,   end.y,   start.z - width,
     1540      end.x - width / 2,   end.y,   start.z - width,
     1541      start.x - width / 2, start.y, start.z,
     1542      end.x + width / 2,   end.y,   start.z - width,
     1543      start.x - width / 2, start.y, start.z,
     1544      start.x + width / 2, start.y, start.z,
     1545      end.x + width / 2,   end.y,   end.z + width,
     1546      end.x - width / 2,   end.y,   end.z + width,
     1547      start.x - width / 2, start.y, start.z - width,
     1548      end.x + width / 2,   end.y,   end.z + width,
     1549      start.x - width / 2, start.y, start.z - width,
     1550      start.x + width / 2, start.y, start.z - width,
     1551      end.x + width / 2,   end.y,   end.z,
     1552      end.x - width / 2,   end.y,   end.z,
     1553      start.x - width / 2, start.y, end.z + width,
     1554      end.x + width / 2,   end.y,   end.z,
     1555      start.x - width / 2, start.y, end.z + width,
     1556      start.x + width / 2, start.y, end.z + width,
     1557   };
     1558
     1559   vec3 end_color = vec3(1.0f, 0.0f, 0.0f); // temporary
     1560   vector<GLfloat> laser_colors = {
     1561      end_color.x, end_color.y, end_color.z,
     1562      end_color.x, end_color.y, end_color.z,
     1563      end_color.x, end_color.y, end_color.z,
     1564      end_color.x, end_color.y, end_color.z,
     1565      end_color.x, end_color.y, end_color.z,
     1566      end_color.x, end_color.y, end_color.z,
     1567      color.x, color.y, color.z,
     1568      color.x, color.y, color.z,
     1569      color.x, color.y, color.z,
     1570      color.x, color.y, color.z,
     1571      color.x, color.y, color.z,
     1572      color.x, color.y, color.z,
     1573      end_color.x, end_color.y, end_color.z,
     1574      end_color.x, end_color.y, end_color.z,
     1575      end_color.x, end_color.y, end_color.z,
     1576      end_color.x, end_color.y, end_color.z,
     1577      end_color.x, end_color.y, end_color.z,
     1578      end_color.x, end_color.y, end_color.z,
     1579   };
     1580
     1581   glBindBuffer(GL_ARRAY_BUFFER, laser_points_vbo);
     1582   glBufferSubData(GL_ARRAY_BUFFER, num_lasers * size_in_buffer, size_in_buffer, &laser_points[0]);
     1583
     1584   glBindBuffer(GL_ARRAY_BUFFER, laser_colors_vbo);
     1585   glBufferSubData(GL_ARRAY_BUFFER, num_lasers * size_in_buffer, size_in_buffer, &laser_colors[0]);
     1586
     1587   num_lasers++;
     1588}
     1589
    14791590void initializeBuffers(
    14801591                  GLuint* points_vbo,
     
    16791790                  GLuint color_sp, GLuint texture_sp,
    16801791                  GLuint vao1, GLuint vao2,
    1681                   GLuint points_vbo, GLuint normals_vbo,
    1682                   GLuint colors_vbo, GLuint texcoords_vbo, GLuint selected_colors_vbo,
     1792                  GLuint colors_vbo, GLuint selected_colors_vbo,
    16831793                  SceneObject* selectedObject,
    16841794                  map<GLuint, BufferInfo>& shaderBufferInfo) {
     
    17031813
    17041814   glDrawArrays(GL_TRIANGLES, shaderBufferInfo[texture_sp].vbo_base, shaderBufferInfo[texture_sp].vbo_offset);
     1815}
     1816
     1817void renderLasers(GLuint sp, GLuint vao, unsigned int numLasers) {
     1818   glUseProgram(sp);
     1819   glBindVertexArray(vao);
     1820
     1821   glDrawArrays(GL_TRIANGLES, 0, numLasers * 18);
    17051822}
    17061823
Note: See TracChangeset for help on using the changeset viewer.