Advertisement
Guest User

Untitled

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