Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2020
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.54 KB | None | 0 0
  1. // Link statically with GLEW
  2. #define GLEW_STATIC
  3.  
  4. // Headers
  5. #include <GL/glew.h>
  6. #include <iostream>
  7. //#include <SOIL.h>
  8. #include <SFML/Window.hpp>
  9. #include <SFML/Graphics.hpp>
  10. #include <glm/glm.hpp>
  11. #include <glm/gtc/matrix_transform.hpp>
  12. #include <glm/gtc/type_ptr.hpp>
  13. #include <array>
  14. #include <iostream>
  15. // Shader sources
  16. const GLchar* vertexSource = R"glsl(
  17.    #version 330 core
  18.    in vec3 position;
  19.    in vec3 color;
  20.    in vec2 texcoord;
  21.    out vec3 Color;
  22.    out vec2 Texcoord;
  23.    uniform mat4 transform;
  24.    uniform mat4 rotation;
  25.    uniform mat4 view;
  26.    void main()
  27.    {
  28.        Color = color;
  29.        Texcoord = texcoord;
  30.        gl_Position = view * rotation * transform * vec4(position, 1.0);
  31.    }
  32. )glsl";
  33. const GLchar* fragmentSource = R"glsl(
  34.    #version 330 core
  35.    in vec3 Color;
  36.    in vec2 Texcoord;
  37.    out vec4 outColor;
  38.    uniform sampler2D tex;
  39.    void main()
  40.    {
  41.        outColor = texture(tex, Texcoord);  //vec4(Color, 1.0);
  42.    }
  43. )glsl";
  44.  
  45. glm::vec3 cubePositions[] = {
  46.     glm::vec3( 0.0f,   0.0f,  0.0f),
  47.     glm::vec3( 0.5f,  0.5f, 0.5f),
  48.     glm::vec3( -0.5f, -0.5f, -0.5f),
  49.     glm::vec3( -0.5f,  0.5f, 0.5f),
  50.     glm::vec3( 0.5f,  -0.5f, 0.5f),
  51.     glm::vec3( 0.5f,  0.5f, -0.5f),
  52.     glm::vec3( 0.5f,  -0.5f, -0.5f),
  53.     glm::vec3( -0.5f,  -0.5f, 0.5f),
  54.     glm::vec3(-0.5f,  0.5f, -0.5f),
  55. };
  56. /*
  57. glm::vec3 cubePositions[] = {
  58.   glm::vec3( 0.0f,  0.0f,  0.0f),
  59.   glm::vec3( 2.0f,  5.0f, 15.0f),
  60.   glm::vec3(1.5f, 2.2f, 2.5f),
  61.   glm::vec3(3.8f, 2.0f, 12.3f),
  62.   glm::vec3( 2.4f, 0.4f, 3.5f),
  63.   glm::vec3(1.7f,  3.0f, 7.5f),
  64.   glm::vec3( 1.3f, 2.0f, 2.5f),
  65.   glm::vec3( 1.5f,  2.0f, 2.5f),
  66.   glm::vec3( 1.5f,  0.2f, 1.5f),
  67.   glm::vec3(1.3f,  1.0f, 1.5f)
  68. };
  69. */
  70. int main()
  71. {
  72.     sf::ContextSettings settings;
  73.     settings.depthBits = 24;
  74.     settings.stencilBits = 8;
  75.     settings.majorVersion = 4;
  76.     settings.minorVersion = 2;
  77.  
  78.     sf::Window window(sf::VideoMode(800, 600, 32), "OpenGL", sf::Style::Titlebar | sf::Style::Close, settings);
  79.  
  80.     // Initialize GLEW
  81.     glewExperimental = GL_TRUE;
  82.     glewInit();
  83.  
  84.     // Create Vertex Array Object
  85.     GLuint vao;
  86.     glGenVertexArrays(1, &vao);
  87.     glBindVertexArray(vao);
  88.  
  89.  
  90.     // Create a Vertex Buffer Object and copy the vertex data to it
  91.     GLuint vbo;
  92.     glGenBuffers(1, &vbo);
  93.  
  94.    /*     GLfloat vertices[] = {
  95.     //  Position       Color              Texcoords
  96.         -0.5f,  0.5f,  1.0f, 0.0f, 0.0f,  0.0f, 0.0f, // Top-left
  97.          0.5f,  0.5f,  0.0f, 1.0f, 0.0f,  1.0f, 0.0f, // Top-right
  98.          0.5f, -0.5f,  0.0f, 0.0f, 1.0f,  1.0f, 1.0f, // Bottom-right
  99.         -0.5f, -0.5f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f  // Bottom-left
  100.     };*/
  101.     glEnable(GL_DEPTH_TEST);
  102.         GLfloat vertices[] = {
  103.         -0.15f, -0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 0.0f,
  104.          0.15f, -0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,
  105.          0.15f,  0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 1.0f,
  106.          0.15f,  0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 1.0f,
  107.         -0.15f,  0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f,
  108.         -0.15f, -0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 0.0f,
  109.  
  110.         -0.15f, -0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 0.0f,
  111.          0.15f, -0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,
  112.          0.15f,  0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 1.0f,
  113.          0.15f,  0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 1.0f,
  114.         -0.15f,  0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f,
  115.         -0.15f, -0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 0.0f,
  116.  
  117.         -0.15f,  0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,
  118.         -0.15f,  0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 1.0f,
  119.         -0.15f, -0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f,
  120.         -0.15f, -0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f,
  121.         -0.15f, -0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 0.0f,
  122.         -0.15f,  0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,
  123.  
  124.          0.15f,  0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,
  125.          0.15f,  0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 1.0f,
  126.          0.15f, -0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f,
  127.          0.15f, -0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f,
  128.          0.15f, -0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 0.0f,
  129.          0.15f,  0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,
  130.  
  131.         -0.15f, -0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f,
  132.          0.15f, -0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 1.0f,
  133.          0.15f, -0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,
  134.          0.15f, -0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,
  135.         -0.15f, -0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 0.0f,
  136.         -0.15f, -0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f,
  137.  
  138.         -0.15f,  0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f,
  139.          0.15f,  0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 1.0f,
  140.          0.15f,  0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,
  141.          0.15f,  0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,
  142.         -0.15f,  0.15f,  0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 0.0f,
  143.         -0.15f,  0.15f, -0.15f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f
  144.     };
  145.     glBindBuffer(GL_ARRAY_BUFFER, vbo);
  146.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  147.  
  148.     // Create an element array
  149.    // GLuint ebo;
  150.    // glGenBuffers(1, &ebo);
  151. /*
  152.     GLuint elements[] = {
  153.         0, 1, 2,
  154.         2, 3, 0
  155.     };
  156.  
  157.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
  158.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
  159. */
  160.     // Create and compile the vertex shader
  161.     GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  162.     glShaderSource(vertexShader, 1, &vertexSource, NULL);
  163.     glCompileShader(vertexShader);
  164.  
  165.     // Create and compile the fragment shader
  166.     GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  167.     glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
  168.     glCompileShader(fragmentShader);
  169.  
  170.     // Link the vertex and fragment shader into a shader program
  171.     GLuint shaderProgram = glCreateProgram();
  172.     glAttachShader(shaderProgram, vertexShader);
  173.     glAttachShader(shaderProgram, fragmentShader);
  174.     glBindFragDataLocation(shaderProgram, 0, "outColor");
  175.     glLinkProgram(shaderProgram);
  176.     glUseProgram(shaderProgram);
  177.  
  178.  // Specify the layout of the vertex data
  179.     GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
  180.     glEnableVertexAttribArray(posAttrib);
  181.     glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);
  182.  
  183.     GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
  184.     glEnableVertexAttribArray(colAttrib);
  185.     glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));
  186.  
  187.     GLint texAttrib = glGetAttribLocation(shaderProgram, "texcoord");
  188.     glEnableVertexAttribArray(texAttrib);
  189.     glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(6 * sizeof(GLfloat)));
  190.  
  191.  
  192.     //camera stuff
  193.     glm::vec3 cameraPos   = glm::vec3(0.0f, 0.0f,  3.0f);
  194.     glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
  195.     glm::vec3 cameraUp    = glm::vec3(0.0f, 1.0f,  0.0f);
  196.  
  197.     glm::mat4 view (1.0f);
  198.     view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
  199.  
  200.  
  201.     // Load texture
  202.     GLuint tex;
  203.     glGenTextures(1, &tex);
  204.     glBindTexture(GL_TEXTURE_2D, tex);
  205.  
  206.     int width, height;
  207.     sf::Image i;
  208.     if(!i.loadFromFile("test.jpg"))
  209.     {
  210.         std::cout << "Couldn't load image!";
  211.     }
  212.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, i.getSize().x, i.getSize().y, 0,GL_RGBA, GL_UNSIGNED_BYTE, i.getPixelsPtr());
  213.  
  214.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  215.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  216.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  217.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  218.  
  219.  
  220.  
  221.  
  222.     // move the model
  223.     //glm::mat4 rot{1.0f};
  224.     glm::mat4 rot[100]  (glm::mat4(1.0f));
  225.     float delta = 0;
  226.     bool running = true;
  227.     while (running)
  228.     {
  229.  
  230.         glViewport(0,0,800,600);
  231.         GLint modelLocation = glGetUniformLocation(shaderProgram, "transform"); //get the shader mat4
  232.         GLint rotationLocation = glGetUniformLocation(shaderProgram, "rotation"); //get the shader mat4
  233.         GLint viewLocation = glGetUniformLocation(shaderProgram, "view"); //get the shader mat4
  234.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
  235.         {
  236.              cameraPos += 1.0f * cameraFront;
  237.         }
  238.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
  239.         {
  240.              cameraPos -= 1.0f * cameraFront;
  241.         }
  242.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
  243.         {
  244.             cameraPos -= glm::normalize(glm::cross(cameraFront, cameraUp)) * 1.0f;
  245.         }
  246.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
  247.         {
  248.             cameraPos += glm::normalize(glm::cross(cameraFront, cameraUp)) * 1.0f;
  249.         }
  250.  
  251.         view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
  252.  
  253.  
  254.  
  255.         sf::Event windowEvent;
  256.         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  257.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  258.  
  259.         delta += 0.001;
  260.  
  261.  
  262.         glm::mat4 model[100]  (glm::mat4(1.0f));
  263.  
  264.         for(int i=1;i<=5;i++)
  265.         {
  266.  
  267.             model[i] = glm::translate(model[i], cubePositions[i]); //modify the mat4
  268.             //rot[i] = glm::rotate(model[i], (float)delta * glm::radians(50.0f), glm::vec3(1.0f, 0.0f, 1.0f));
  269.  
  270.  
  271.             glUniformMatrix4fv(modelLocation, 1, GL_FALSE, glm::value_ptr(model[i])); //set the mat4 to our modified one
  272.             glUniformMatrix4fv(rotationLocation, 1, GL_FALSE, glm::value_ptr(rot[i]));
  273.             glUniformMatrix4fv(viewLocation, 1, GL_FALSE, glm::value_ptr(view));//set the mat4 to our modified one
  274.             glDrawArrays(GL_TRIANGLES, 0, 36);
  275.         }
  276.  
  277.         while (window.pollEvent(windowEvent))
  278.         {
  279.             switch (windowEvent.type)
  280.             {
  281.             case sf::Event::Closed:
  282.                 running = false;
  283.                 break;
  284.             }
  285.         }
  286.  
  287.         // Clear the screen to black
  288.  
  289.  
  290.         // Draw a rectangle from the 2 triangles using 6 indices
  291.         //glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
  292.  
  293.         // Swap buffers
  294.  
  295.         window.display();
  296.     }
  297.  
  298.     glDeleteProgram(shaderProgram);
  299.     glDeleteShader(fragmentShader);
  300.     glDeleteShader(vertexShader);
  301.  
  302. //    glDeleteBuffers(1, &ebo);
  303.     glDeleteBuffers(1, &vbo);
  304.  
  305.     glDeleteVertexArrays(1, &vao);
  306.  
  307.     window.close();
  308.  
  309.     return 0;
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement