drackiseries

MyView.cpp

Nov 14th, 2014
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.13 KB | None | 0 0
  1. #include "MyView.hpp"
  2. #include <SceneModel/SceneModel.hpp>
  3. #include <tygra/FileHelper.hpp>
  4. #include <glm/gtc/matrix_transform.hpp>
  5. #include <glm/gtc/type_ptr.hpp>
  6. #include <iostream>
  7. #include <cassert>
  8.  
  9. MyView::MyView() : shaderProgram_(0)
  10. {
  11.  
  12. }
  13.  
  14. MyView::~MyView()
  15. {
  16. }
  17.  
  18. void MyView::setScene(std::shared_ptr<const SceneModel::Context> par1Scene)
  19. {
  20.     scene_ = par1Scene;
  21. }
  22.  
  23. void MyView::windowViewWillStart(std::shared_ptr<tygra::Window> par1Window)
  24. {
  25.     assert(scene_ != nullptr);
  26.  
  27.     start_time_ = std::chrono::system_clock::now();
  28.  
  29.     GLuint vertex_shader = createAndCompileShader("sponza_vs.glsl", "VERTEX_SHADER");
  30.     GLuint fragment_shader = createAndCompileShader("sponza_fs.glsl", "FRAGMENT_SHADER");
  31.  
  32.     setupProgram(vertex_shader, fragment_shader);
  33.  
  34.     checkProgramLinkStatus();
  35.  
  36.     SceneModel::GeometryBuilder builder;
  37.     const auto& source_mesh = builder.getMeshById(309);
  38.     const auto& positions = source_mesh.getPositionArray();
  39.     const auto& elements = source_mesh.getElementArray();
  40.     const auto& normals = source_mesh.getNormalArray();
  41.  
  42.     glGenBuffers(1, &sponzaMesh_.position_vbo);
  43.     glBindBuffer(GL_ARRAY_BUFFER, sponzaMesh_.position_vbo);
  44.     glBufferData(GL_ARRAY_BUFFER,
  45.                  positions.size() * sizeof(glm::vec3), // size of data in bytes
  46.                  positions.data(), // pointer to the data
  47.                  GL_STATIC_DRAW);
  48.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  49.  
  50.     glGenBuffers(1, &sponzaMesh_.colourvbo_);
  51.     glBindBuffer(GL_ARRAY_BUFFER, sponzaMesh_.colourvbo_);
  52.     glBufferData(GL_ARRAY_BUFFER, positions.size() * sizeof(glm::vec3), positions.data(), GL_STATIC_DRAW);
  53.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  54.  
  55.     glGenBuffers(1, &sponzaMesh_.normalvbo_);
  56.     glBindBuffer(GL_ARRAY_BUFFER, sponzaMesh_.normalvbo_);
  57.     glBufferData(GL_ARRAY_BUFFER, positions.size() * sizeof(glm::vec3), positions.data(), GL_STATIC_DRAW);
  58.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  59.  
  60.     glGenBuffers(1, &sponzaMesh_.element_vbo);
  61.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, sponzaMesh_.element_vbo);
  62.     glBufferData(GL_ELEMENT_ARRAY_BUFFER,
  63.         elements.size() * sizeof(unsigned int),
  64.         elements.data(),
  65.         GL_STATIC_DRAW);
  66.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  67.     sponzaMesh_.element_count = elements.size();
  68.  
  69.     glGenVertexArrays(1, &sponzaMesh_.vao);
  70.     glBindVertexArray(sponzaMesh_.vao);
  71.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, sponzaMesh_.element_vbo);
  72.     glBindBuffer(GL_ARRAY_BUFFER, sponzaMesh_.position_vbo);
  73.     glBindBuffer(GL_ARRAY_BUFFER, sponzaMesh_.colourvbo_);
  74.     glBindBuffer(GL_ARRAY_BUFFER, sponzaMesh_.normalvbo_);
  75.     glEnableVertexAttribArray(0);
  76.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
  77.         sizeof(glm::vec3), TGL_BUFFER_OFFSET(0));
  78.     glEnableVertexAttribArray(1);
  79.     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE,
  80.         sizeof(glm::vec3), TGL_BUFFER_OFFSET(0));
  81.     glEnableVertexAttribArray(2);
  82.     glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE,
  83.         sizeof(glm::vec3), TGL_BUFFER_OFFSET(0));
  84.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  85.     glBindVertexArray(0);
  86.  
  87.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  88. }
  89.  
  90. void MyView::windowViewDidReset(std::shared_ptr<tygra::Window> par1Window, int par2Width, int par3Height)
  91. {
  92.     glViewport(0, 0, par2Width, par3Height);
  93. }
  94.  
  95. void MyView::windowViewDidStop(std::shared_ptr<tygra::Window> par1Window)
  96. {
  97.     cleanupBeforeClosing();
  98. }
  99.  
  100. void MyView::windowViewRender(std::shared_ptr<tygra::Window> par1Window)
  101. {
  102.     assert(scene_ != nullptr);
  103.  
  104.     //glEnable(GL_DEPTH_TEST);
  105.     //glEnable(GL_CULL_FACE);
  106.  
  107.     glClearColor(0.f, 0.f, 0.25f, 0.f);
  108.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  109.  
  110.     GLint viewport_size[4];
  111.     glGetIntegerv(GL_VIEWPORT, viewport_size);
  112.     const float aspect_ratio = viewport_size[2] / (float)viewport_size[3];
  113.  
  114.     glm::mat4 projection_xform = glm::perspective(75.f, aspect_ratio, 1.0f, 1000.f);
  115.     glm::mat4 view_xform = glm::lookAt(scene_->getCamera().getPosition(), scene_->getCamera().getDirection(), glm::vec3(0, 1, 0));
  116.     glm::mat4 model_xform = glm::translate(glm::mat4(1.0),glm::vec3(0, 0, 0));
  117.  
  118.     glm::mat4 combined_xform = projection_xform * view_xform * model_xform;
  119.     //glm::mat4 combined_xform = model_xform * view_xform * projection_xform;
  120.  
  121.     //Uniforms
  122.  
  123.     GLuint model_xform_id = glGetUniformLocation(shaderProgram_,"model_xform");
  124.     glUniformMatrix4fv(model_xform_id, 1, GL_FALSE, glm::value_ptr(combined_xform));
  125.  
  126.     glUseProgram(shaderProgram_);
  127.  
  128.     glBindVertexArray(sponzaMesh_.vao);
  129.  
  130.     glDrawElements(GL_TRIANGLES, sponzaMesh_.element_count, GL_UNSIGNED_INT, 0);
  131. }
  132.  
  133. GLuint MyView::createAndCompileShader(std::string par1ShaderFileName, std::string par2Type)
  134. {
  135.     GLint compile_status = 0;
  136.     GLuint result;
  137.  
  138.     if (par2Type == "VERTEX_SHADER")
  139.     {
  140.         GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
  141.         std::string vertex_shader_string = tygra::stringFromFile(par1ShaderFileName); //"first_vs.glsl"
  142.         const char* vertex_shader_code = vertex_shader_string.c_str();
  143.         glShaderSource(vertex_shader, 1, (const GLchar **)&vertex_shader_code, NULL);
  144.         glCompileShader(vertex_shader);
  145.         glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &compile_status);
  146.         if (compile_status != GL_TRUE)
  147.         {
  148.             const int string_length = 1024;
  149.             GLchar log[string_length] = "";
  150.             glGetShaderInfoLog(vertex_shader, string_length, NULL, log);
  151.             std::cerr << log << std::endl;
  152.         }
  153.  
  154.         result = vertex_shader;
  155.     }
  156.  
  157.     if (par2Type == "FRAGMENT_SHADER")
  158.     {
  159.         GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
  160.         std::string fragment_shader_string = tygra::stringFromFile(par1ShaderFileName); //"first_fs.glsl"
  161.         const char* fragment_shader_code = fragment_shader_string.c_str();
  162.         glShaderSource(fragment_shader, 1, (const GLchar **)&fragment_shader_code, NULL);
  163.         glCompileShader(fragment_shader);
  164.         glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &compile_status);
  165.  
  166.         if (compile_status != GL_TRUE)
  167.         {
  168.             const int string_length = 1024;
  169.             GLchar log[string_length] = "";
  170.             glGetShaderInfoLog(fragment_shader, string_length, NULL, log);
  171.             std::cerr << log << std::endl;
  172.         }
  173.  
  174.         result = fragment_shader;
  175.     }
  176.  
  177.     return result;
  178. }
  179.  
  180. void MyView::setupProgram(GLuint par1VertexShader, GLuint par2FragmentShader)
  181. {
  182.     shaderProgram_ = glCreateProgram();
  183.  
  184.     glAttachShader(shaderProgram_, par1VertexShader);
  185.  
  186.     glBindAttribLocation(shaderProgram_, 0, "vertex_position");
  187.     glBindAttribLocation(shaderProgram_, 1, "vertex_colour");
  188.     glBindAttribLocation(shaderProgram_, 2, "vertex_normal");
  189.  
  190.     glDeleteShader(par1VertexShader);
  191.  
  192.     glAttachShader(shaderProgram_, par2FragmentShader);
  193.     glBindFragDataLocation(shaderProgram_, 0, "fragment_colour");
  194.     glDeleteShader(par2FragmentShader);
  195.  
  196.     glLinkProgram(shaderProgram_);
  197. }
  198.  
  199. void MyView::checkProgramLinkStatus()
  200. {
  201.     GLint link_status = 0;
  202.     glGetProgramiv(shaderProgram_, GL_LINK_STATUS, &link_status);
  203.     if (link_status != GL_TRUE)
  204.     {
  205.         const int string_length = 1024;
  206.         GLchar log[string_length] = "";
  207.         glGetProgramInfoLog(shaderProgram_, string_length, NULL, log);
  208.         std::cerr << log << std::endl;
  209.     }
  210. }
  211.  
  212. void MyView::cleanupBeforeClosing()
  213. {
  214.     glDeleteProgram(shaderProgram_);
  215.     glDeleteBuffers(1, &sponzaMesh_.position_vbo);
  216.     glDeleteBuffers(1, &sponzaMesh_.element_vbo);
  217.     glDeleteBuffers(1, &sponzaMesh_.colourvbo_);
  218.     glDeleteVertexArrays(1, &sponzaMesh_.vao);
  219. }
Advertisement
Add Comment
Please, Sign In to add comment