Advertisement
kr3mil

Untitled

Mar 19th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "MyView.hpp"
  2. #include <sponza/sponza.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()
  10. {
  11. }
  12.  
  13. MyView::~MyView() {
  14. }
  15.  
  16. void MyView::setScene(const sponza::Context * scene)
  17. {
  18.     scene_ = scene;
  19. }
  20.  
  21. void MyView::windowViewWillStart(tygra::Window * window)
  22. {
  23.     assert(scene_ != nullptr);
  24.  
  25.     // STEP 1
  26.     // Compile sponza_vs.glsl
  27.     GLint compile_status = GL_FALSE;
  28.  
  29.     GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
  30.     std::string vertex_shader_string = tygra::createStringFromFile("resource:///sponza_vs.glsl");
  31.     const char * vertex_shader_code = vertex_shader_string.c_str();
  32.     glShaderSource(vertex_shader, 1, (const GLchar **)&vertex_shader_code, NULL);
  33.     glCompileShader(vertex_shader);
  34.     glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &compile_status);
  35.     if (compile_status != GL_TRUE) {
  36.         const int string_length = 1024;
  37.         GLchar log[string_length] = "";
  38.         glGetShaderInfoLog(vertex_shader, string_length, NULL, log);
  39.         std::cerr << log << std::endl;
  40.     }
  41.     else
  42.         std::cout << "COMPILED VS" << std::endl;
  43.  
  44.     // Compile sponza_fs.glsl
  45.     GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
  46.     std::string fragment_shader_string = tygra::createStringFromFile("resource:///sponza_fs.glsl");
  47.     const char * fragment_shader_code = fragment_shader_string.c_str();
  48.     glShaderSource(fragment_shader, 1,
  49.         (const GLchar **)&fragment_shader_code, NULL);
  50.     glCompileShader(fragment_shader);
  51.     glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &compile_status);
  52.     if (compile_status != GL_TRUE) {
  53.         const int string_length = 1024;
  54.         GLchar log[string_length] = "";
  55.         glGetShaderInfoLog(fragment_shader, string_length, NULL, log);
  56.         std::cerr << log << std::endl;
  57.     }
  58.     else
  59.         std::cout << "COMPILED FS" << std::endl;
  60.  
  61.     // Linking
  62.     sponza_program_ = glCreateProgram();
  63.     glAttachShader(sponza_program_, vertex_shader);
  64.     glBindAttribLocation(sponza_program_, kVertexPosition, "vertex_position");
  65.     glBindAttribLocation(sponza_program_, kVertexNormal, "vertex_normal");
  66.     glBindAttribLocation(sponza_program_, kVertexTexCoord, "tex_coord");
  67.     glDeleteShader(vertex_shader);
  68.     glAttachShader(sponza_program_, fragment_shader);
  69.     glBindFragDataLocation(sponza_program_, kFragmentColour, "fragment_colour");
  70.     glDeleteShader(fragment_shader);
  71.     glLinkProgram(sponza_program_);
  72.  
  73.     // Check link
  74.     GLint link_status = GL_FALSE;
  75.     glGetProgramiv(sponza_program_, GL_LINK_STATUS, &link_status);
  76.     if (link_status != GL_TRUE) {
  77.         const int string_length = 1024;
  78.         GLchar log[string_length] = "";
  79.         glGetProgramInfoLog(sponza_program_, string_length, NULL, log);
  80.         std::cerr << log << std::endl;
  81.     }
  82.  
  83.     // STEP 2
  84.     // Create GL mesh
  85.     sponza::GeometryBuilder builder;
  86.  
  87.     for (int i = 0; i < builder.getAllMeshes().size(); i++) {
  88.         MeshGL mesh_;
  89.  
  90.         auto meshes = builder.getAllMeshes();
  91.  
  92.         const auto& source_mesh = builder.getMeshById(meshes[i].getId());
  93.         const auto& positions = source_mesh.getPositionArray();
  94.         const auto& normals = source_mesh.getNormalArray();
  95.         const auto& elements = source_mesh.getElementArray();
  96.         const auto& tex_coords = source_mesh.getTextureCoordinateArray();
  97.  
  98.         glGenBuffers(1, &mesh_.position_vbo);
  99.         glBindBuffer(GL_ARRAY_BUFFER, mesh_.position_vbo);
  100.         glBufferData(GL_ARRAY_BUFFER,
  101.             positions.size() * sizeof(glm::vec3), // size of data in bytes
  102.             positions.data(), // pointer to the data
  103.             GL_STATIC_DRAW);
  104.         glBindBuffer(GL_ARRAY_BUFFER, kNullId);
  105.  
  106.         glGenBuffers(1, &mesh_.normal_vbo);
  107.         glBindBuffer(GL_ARRAY_BUFFER, mesh_.normal_vbo);
  108.         glBufferData(GL_ARRAY_BUFFER,
  109.             normals.size() * sizeof(glm::vec3), // size of data in bytes
  110.             normals.data(), // pointer to the data
  111.             GL_STATIC_DRAW);
  112.         glBindBuffer(GL_ARRAY_BUFFER, kNullId);
  113.  
  114.         glGenBuffers(1, &mesh_.element_vbo);
  115.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh_.element_vbo);
  116.         glBufferData(GL_ELEMENT_ARRAY_BUFFER,
  117.             elements.size() * sizeof(unsigned int),
  118.             elements.data(),
  119.             GL_STATIC_DRAW);
  120.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, kNullId);
  121.         mesh_.element_count = elements.size();
  122.  
  123.         glGenBuffers(1, &mesh_.textcoords_vbo);
  124.         glBindBuffer(GL_ARRAY_BUFFER, mesh_.textcoords_vbo);
  125.         glBufferData(GL_ARRAY_BUFFER,
  126.             tex_coords.size() * sizeof(glm::vec2), // size of data in bytes
  127.             tex_coords.data(), // pointer to the data
  128.             GL_STATIC_DRAW);
  129.         glBindBuffer(GL_ARRAY_BUFFER, kNullId);
  130.  
  131.         glGenVertexArrays(1, &mesh_.vao);
  132.         glBindVertexArray(mesh_.vao);
  133.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh_.element_vbo);
  134.         glBindBuffer(GL_ARRAY_BUFFER, mesh_.position_vbo);
  135.         glEnableVertexAttribArray(kVertexPosition);
  136.         glVertexAttribPointer(kVertexPosition, 3, GL_FLOAT, GL_FALSE,
  137.             sizeof(glm::vec3), TGL_BUFFER_OFFSET(0));
  138.         glBindBuffer(GL_ARRAY_BUFFER, mesh_.normal_vbo);
  139.         glEnableVertexAttribArray(kVertexNormal);
  140.         glVertexAttribPointer(kVertexNormal, 3, GL_FLOAT, GL_FALSE,
  141.             sizeof(glm::vec3), TGL_BUFFER_OFFSET(0));
  142.         glBindBuffer(GL_ARRAY_BUFFER, mesh_.textcoords_vbo);
  143.         glEnableVertexAttribArray(kVertexTexCoord);
  144.         glVertexAttribPointer(kVertexTexCoord, 3, GL_FLOAT, GL_FALSE, sizeof(glm::vec2), TGL_BUFFER_OFFSET(0));
  145.         glBindBuffer(GL_ARRAY_BUFFER, kNullId);
  146.         glBindVertexArray(kNullId);
  147.  
  148.         meshMap[meshes[i].getId()] = mesh_;
  149.  
  150.         glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
  151.  
  152.         tygra::Image texture_image = tygra::createImageFromPngFile("resource:///diff0.png");
  153.         if (texture_image.doesContainData())
  154.         {
  155.             glGenTextures(1, &textureTest);
  156.             glBindTexture(GL_TEXTURE_2D, textureTest);
  157.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  158.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  159.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  160.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  161.             GLenum pixel_formats[] = { 0, GL_RED, GL_RG, GL_RGB, GL_RGBA };
  162.             glTexImage2D(GL_TEXTURE_2D,
  163.                 0,
  164.                 GL_RGBA,
  165.                 texture_image.width(),
  166.                 texture_image.height(),
  167.                 0,
  168.                 pixel_formats[texture_image.componentsPerPixel()],
  169.                 texture_image.bytesPerComponent() == 1
  170.                 ? GL_UNSIGNED_BYTE : GL_UNSIGNED_SHORT,
  171.                 texture_image.pixelData());
  172.             glGenerateMipmap(GL_TEXTURE_2D);
  173.             glBindTexture(GL_TEXTURE_2D, kNullId);
  174.         }
  175.     }
  176. }
  177.  
  178. void MyView::windowViewDidReset(tygra::Window * window,
  179.     int width,
  180.     int height)
  181. {
  182.     glViewport(0, 0, width, height);
  183. }
  184.  
  185. void MyView::windowViewDidStop(tygra::Window * window)
  186. {
  187.     glDeleteProgram(sponza_program_);
  188. }
  189.  
  190. void MyView::windowViewRender(tygra::Window * window)
  191. {
  192.     assert(scene_ != nullptr);
  193.  
  194.     glEnable(GL_DEPTH_TEST);
  195.     glEnable(GL_CULL_FACE);
  196.  
  197.     glClearColor(0.f, 0.f, 0.25f, 0.f);
  198.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  199.  
  200.     GLint viewport_size[4];
  201.     glGetIntegerv(GL_VIEWPORT, viewport_size);
  202.     const float aspect_ratio = viewport_size[2] / (float)viewport_size[3];
  203.  
  204.     auto cam = scene_->getCamera();
  205.     glm::vec3 up = glm::vec3(scene_->getUpDirection().x, scene_->getUpDirection().y, scene_->getUpDirection().z);
  206.     glm::vec3 CamDirection = glm::vec3(cam.getDirection().x, cam.getDirection().y, cam.getDirection().z);
  207.     glm::vec3 camPos = glm::vec3(cam.getPosition().x, cam.getPosition().y, cam.getPosition().z);
  208.  
  209.     glm::vec3 camAtPos = camPos + CamDirection;
  210.  
  211.     glm::mat4 projection_xform = glm::perspective(glm::radians(cam.getVerticalFieldOfViewInDegrees()), aspect_ratio, cam.getNearPlaneDistance(), cam.getFarPlaneDistance());
  212.     glm::mat4 view_xform = glm::lookAt(camPos, camAtPos, up);
  213.     glm::mat4 model_xform = glm::translate(glm::mat4(1.0), camPos);
  214.  
  215.     glm::mat4 combined_xform = projection_xform * view_xform;
  216.  
  217.     glUseProgram(sponza_program_);
  218.  
  219.     GLuint pv_xform_id = glGetUniformLocation(sponza_program_, "projection_view_xform");
  220.     glUniformMatrix4fv(pv_xform_id, 1, GL_FALSE, glm::value_ptr(combined_xform));
  221.  
  222.     glActiveTexture(GL_TEXTURE0);
  223.     glBindTexture(GL_TEXTURE_2D, textureTest);
  224.     glUniform1i(glGetUniformLocation(sponza_program_, "mystery_sampler"), 0);
  225.  
  226.     GLuint mystery_sampler_id = glGetUniformLocation(sponza_program_, "mystery_sampler");
  227.     glUniform1i(mystery_sampler_id, kTextureTest);
  228.  
  229.  
  230.     for (const auto& instance : scene_->getAllInstances())
  231.     {
  232.         glm::mat4 model_xform = (const glm::mat4x3&)instance.getTransformationMatrix();
  233.         const MeshGL& mesh = meshMap[instance.getMeshId()];
  234.  
  235.         GLuint m_xform_id = glGetUniformLocation(sponza_program_, "model_xform");
  236.         glUniformMatrix4fv(m_xform_id, 1, GL_FALSE, glm::value_ptr(model_xform));
  237.  
  238.         glBindVertexArray(meshMap.at(instance.getMeshId()).vao);
  239.         glDrawElements(GL_TRIANGLES, meshMap.at(instance.getMeshId()).element_count, GL_UNSIGNED_INT, 0);
  240.     }
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement