Advertisement
Guest User

Untitled

a guest
Apr 20th, 2015
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. #include "Terrain.hpp"
  2. #include "../Util/Logger.hpp"
  3. #include <vector>
  4. using namespace Graphics;
  5.  
  6. Terrain::Terrain() : m_vbo(0),m_ibo(0)
  7. {
  8. glGenBuffers(1, &m_vbo);
  9. glGenBuffers(1, &m_ibo);
  10.  
  11. m_shader.LoadFromFile(Shader::VERTEX_SHADER, "./shader/terrain.vert");
  12. m_shader.LoadFromFile(Shader::FRAGMENT_SHADER, "./shader/terrain.frag");
  13. m_shader.Link();
  14.  
  15. m_shader.AddUniform("MVP");
  16. m_shader.AddAttribute("pos");
  17. m_shader.AddAttribute("color");
  18. }
  19.  
  20. Terrain::~Terrain()
  21. {
  22. glDeleteBuffers(1, &m_vbo);
  23. glDeleteBuffers(1, &m_ibo);
  24. }
  25.  
  26. void Terrain::Render(const glm::mat4& mvp)
  27. {
  28. m_shader.Use();
  29. glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
  30. glEnableVertexAttribArray(m_shader.Attribute("pos"));
  31. glEnableVertexAttribArray(m_shader.Attribute("color"));
  32.  
  33. glVertexAttribPointer(m_shader.Attribute("pos"),3,GL_FLOAT,
  34. GL_FALSE,sizeof(Vertex), (void*)offsetof(Vertex, pos));
  35.  
  36. glVertexAttribPointer(m_shader.Attribute("color"),3,GL_FLOAT,
  37. GL_FALSE,sizeof(Vertex),(void*)offsetof(Vertex,color));
  38.  
  39. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
  40. glUniformMatrix4fv(m_shader.Uniform("MVP"), 1, false, &mvp[0][0]);
  41.  
  42. glDrawElements(GL_TRIANGLES, m_indicecount,
  43. GL_UNSIGNED_SHORT,nullptr);
  44.  
  45.  
  46. glDisableVertexAttribArray(m_shader.Attribute("pos"));
  47. glDisableVertexAttribArray(m_shader.Attribute("color"));
  48. m_shader.UnUse();
  49. }
  50.  
  51. void Terrain::Create(const glm::ivec2& size)
  52. {
  53. //Create vertices first
  54. std::vector<Vertex> vertices;
  55.  
  56. for (auto y = 0; y < size.y; ++y)
  57. {
  58. for (auto x = 0; x < size.x; ++x)
  59. {
  60. auto offset = y*size.x + x;
  61. Vertex vert;
  62. vert.pos = glm::vec3(x, y, 0.0f);
  63. vert.color = glm::vec3(1.0f, 1.0f, 1.0f);
  64. vertices.push_back(vert);
  65. }
  66. }
  67.  
  68. m_vertexcount = vertices.size();
  69. glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
  70. glBufferData(GL_ARRAY_BUFFER, m_vertexcount * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW);
  71.  
  72. std::vector<uint16_t> indices;
  73. for (auto y = 0; y < size.y-1; ++y)
  74. {
  75. for (auto x = 0; x < size.x-1; ++x)
  76. {
  77. //lower left triangle
  78. indices.push_back((y + 1)*size.x + x);
  79. indices.push_back(y*size.x + x);
  80. indices.push_back(y*size.x + x+1);
  81. //upper right triangle
  82. indices.push_back((y + 1)*size.x + x);
  83. indices.push_back((y + 1)*size.x + x+1);
  84. indices.push_back(y*size.x + x + 1);
  85. }
  86. }
  87. m_indicecount = indices.size();
  88. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
  89. glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indicecount * sizeof(uint16_t), &indices[0], GL_STATIC_DRAW);
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement