Advertisement
Guest User

Untitled

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