Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Link statically with GLEW
- #define GLEW_STATIC
- // Headers
- #include <GL/glew.h>
- #include <iostream>
- //#include <SOIL.h>
- #include <SFML/Window.hpp>
- #include <SFML/Graphics.hpp>
- #include <glm/glm.hpp>
- #include <glm/gtc/matrix_transform.hpp>
- #include <glm/gtc/type_ptr.hpp>
- #include <array>
- #include <iostream>
- // Shader sources
- const GLchar* vertexSource = R"glsl(
- #version 330 core
- in vec3 position;
- in vec3 color;
- in vec2 texcoord;
- out vec3 Color;
- out vec2 Texcoord;
- uniform mat4 transform;
- uniform mat4 rotation;
- uniform mat4 view;
- void main()
- {
- Color = color;
- Texcoord = texcoord;
- gl_Position = view * rotation * transform * vec4(position, 1.0);
- }
- )glsl";
- const GLchar* fragmentSource = R"glsl(
- #version 330 core
- in vec3 Color;
- in vec2 Texcoord;
- out vec4 outColor;
- uniform sampler2D tex;
- void main()
- {
- outColor = texture(tex, Texcoord); //vec4(Color, 1.0);
- }
- )glsl";
- glm::vec3 cubePositions[] = {
- glm::vec3( 0.0f, 0.0f, 0.0f),
- glm::vec3( 0.5f, 0.5f, 0.5f),
- glm::vec3( -0.5f, -0.5f, -0.5f),
- glm::vec3( -0.5f, 0.5f, 0.5f),
- glm::vec3( 0.5f, -0.5f, 0.5f),
- glm::vec3( 0.5f, 0.5f, -0.5f),
- glm::vec3( 0.5f, -0.5f, -0.5f),
- glm::vec3( -0.5f, -0.5f, 0.5f),
- glm::vec3(-0.5f, 0.5f, -0.5f),
- };
- /*
- glm::vec3 cubePositions[] = {
- glm::vec3( 0.0f, 0.0f, 0.0f),
- glm::vec3( 2.0f, 5.0f, 15.0f),
- glm::vec3(1.5f, 2.2f, 2.5f),
- glm::vec3(3.8f, 2.0f, 12.3f),
- glm::vec3( 2.4f, 0.4f, 3.5f),
- glm::vec3(1.7f, 3.0f, 7.5f),
- glm::vec3( 1.3f, 2.0f, 2.5f),
- glm::vec3( 1.5f, 2.0f, 2.5f),
- glm::vec3( 1.5f, 0.2f, 1.5f),
- glm::vec3(1.3f, 1.0f, 1.5f)
- };
- */
- int main()
- {
- sf::ContextSettings settings;
- settings.depthBits = 24;
- settings.stencilBits = 8;
- settings.majorVersion = 4;
- settings.minorVersion = 2;
- sf::Window window(sf::VideoMode(800, 600, 32), "OpenGL", sf::Style::Titlebar | sf::Style::Close, settings);
- // Initialize GLEW
- glewExperimental = GL_TRUE;
- glewInit();
- // Create Vertex Array Object
- GLuint vao;
- glGenVertexArrays(1, &vao);
- glBindVertexArray(vao);
- // Create a Vertex Buffer Object and copy the vertex data to it
- GLuint vbo;
- glGenBuffers(1, &vbo);
- /* GLfloat vertices[] = {
- // Position Color Texcoords
- -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left
- 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right
- 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right
- -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f // Bottom-left
- };*/
- glEnable(GL_DEPTH_TEST);
- GLfloat vertices[] = {
- -0.15f, -0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
- 0.15f, -0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
- 0.15f, 0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
- 0.15f, 0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
- -0.15f, 0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- -0.15f, -0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
- -0.15f, -0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
- 0.15f, -0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
- 0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
- 0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
- -0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- -0.15f, -0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
- -0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
- -0.15f, 0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
- -0.15f, -0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- -0.15f, -0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- -0.15f, -0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
- -0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
- 0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
- 0.15f, 0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
- 0.15f, -0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- 0.15f, -0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- 0.15f, -0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
- 0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
- -0.15f, -0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- 0.15f, -0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
- 0.15f, -0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
- 0.15f, -0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
- -0.15f, -0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
- -0.15f, -0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- -0.15f, 0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- 0.15f, 0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
- 0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
- 0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
- -0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
- -0.15f, 0.15f, -0.15f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f
- };
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- // Create an element array
- // GLuint ebo;
- // glGenBuffers(1, &ebo);
- /*
- GLuint elements[] = {
- 0, 1, 2,
- 2, 3, 0
- };
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
- */
- // Create and compile the vertex shader
- GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vertexShader, 1, &vertexSource, NULL);
- glCompileShader(vertexShader);
- // Create and compile the fragment shader
- GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
- glCompileShader(fragmentShader);
- // Link the vertex and fragment shader into a shader program
- GLuint shaderProgram = glCreateProgram();
- glAttachShader(shaderProgram, vertexShader);
- glAttachShader(shaderProgram, fragmentShader);
- glBindFragDataLocation(shaderProgram, 0, "outColor");
- glLinkProgram(shaderProgram);
- glUseProgram(shaderProgram);
- // Specify the layout of the vertex data
- GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
- glEnableVertexAttribArray(posAttrib);
- glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);
- GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
- glEnableVertexAttribArray(colAttrib);
- glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));
- GLint texAttrib = glGetAttribLocation(shaderProgram, "texcoord");
- glEnableVertexAttribArray(texAttrib);
- glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(6 * sizeof(GLfloat)));
- //camera stuff
- glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
- glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
- glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
- glm::mat4 view (1.0f);
- view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
- // Load texture
- GLuint tex;
- glGenTextures(1, &tex);
- glBindTexture(GL_TEXTURE_2D, tex);
- int width, height;
- sf::Image i;
- if(!i.loadFromFile("test.jpg"))
- {
- std::cout << "Couldn't load image!";
- }
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, i.getSize().x, i.getSize().y, 0,GL_RGBA, GL_UNSIGNED_BYTE, i.getPixelsPtr());
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- // move the model
- //glm::mat4 rot{1.0f};
- glm::mat4 rot[100] (glm::mat4(1.0f));
- float delta = 0;
- bool running = true;
- while (running)
- {
- glViewport(0,0,800,600);
- GLint modelLocation = glGetUniformLocation(shaderProgram, "transform"); //get the shader mat4
- GLint rotationLocation = glGetUniformLocation(shaderProgram, "rotation"); //get the shader mat4
- GLint viewLocation = glGetUniformLocation(shaderProgram, "view"); //get the shader mat4
- if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
- {
- cameraPos += 1.0f * cameraFront;
- }
- if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
- {
- cameraPos -= 1.0f * cameraFront;
- }
- if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
- {
- cameraPos -= glm::normalize(glm::cross(cameraFront, cameraUp)) * 1.0f;
- }
- if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
- {
- cameraPos += glm::normalize(glm::cross(cameraFront, cameraUp)) * 1.0f;
- }
- view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
- sf::Event windowEvent;
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- delta += 0.001;
- glm::mat4 model[100] (glm::mat4(1.0f));
- for(int i=1;i<=5;i++)
- {
- model[i] = glm::translate(model[i], cubePositions[i]); //modify the mat4
- //rot[i] = glm::rotate(model[i], (float)delta * glm::radians(50.0f), glm::vec3(1.0f, 0.0f, 1.0f));
- glUniformMatrix4fv(modelLocation, 1, GL_FALSE, glm::value_ptr(model[i])); //set the mat4 to our modified one
- glUniformMatrix4fv(rotationLocation, 1, GL_FALSE, glm::value_ptr(rot[i]));
- glUniformMatrix4fv(viewLocation, 1, GL_FALSE, glm::value_ptr(view));//set the mat4 to our modified one
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
- while (window.pollEvent(windowEvent))
- {
- switch (windowEvent.type)
- {
- case sf::Event::Closed:
- running = false;
- break;
- }
- }
- // Clear the screen to black
- // Draw a rectangle from the 2 triangles using 6 indices
- //glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
- // Swap buffers
- window.display();
- }
- glDeleteProgram(shaderProgram);
- glDeleteShader(fragmentShader);
- glDeleteShader(vertexShader);
- // glDeleteBuffers(1, &ebo);
- glDeleteBuffers(1, &vbo);
- glDeleteVertexArrays(1, &vao);
- window.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement