Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define STB_IMAGE_IMPLEMENTATION
- // This #define is needed so that only parts of stb i use is compiled
- #include <glad/glad.h>
- #include <GLFW/glfw3.h>
- #include <glm/glm.hpp>
- #include <glm/gtc/matrix_transform.hpp>
- #include <glm/gtc/type_ptr.hpp>
- #include <vector>
- #include <iostream>
- #include "gl/shader_s.h"
- #include "stb_image.h"
- void framebuffer_size_callback(GLFWwindow *window, int width, int height);
- void processInput(GLFWwindow *window);
- // settings
- const unsigned int SCR_WIDTH = 1280;
- const unsigned int SCR_HEIGHT = 720;
- int main() {
- glm::mat4 model;
- model = glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));
- glm::mat4 view;
- // note that we're translating the scene in the reverse direction of where we want to move
- view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
- glm::mat4 projection;
- // projection = glm::perspective(glm::radians(45.0f), (float) (1280.0 / 720.0), 0.1f, 100.0f);
- projection = glm::ortho(0.0f, 1280.0f, 0.0f, 720.0f, -100.0f, 100.0f);
- // glfw: initialize and configure
- // ------------------------------
- glfwInit();
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
- // glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Don't allow depricated GL to be used
- #ifdef __APPLE__
- glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
- #endif
- // glfw window creation
- // --------------------
- GLFWwindow *window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Tactics", NULL, NULL);
- if (window == NULL) {
- std::cout << "Failed to create GLFW window" << std::endl;
- glfwTerminate();
- return -1;
- }
- glfwMakeContextCurrent(window);
- glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
- // glad: load all OpenGL function pointers
- // ---------------------------------------
- if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) {
- std::cout << "Failed to initialize GLAD" << std::endl;
- return -1;
- }
- // build and compile our shader zprogram
- // ------------------------------------
- Shader ourShader("data/shaders/texture3d.vs", "data/shaders/texture3d.fs");
- // For Ortho
- float vertices[] = {
- -80.5f, -80.5f, -80.5f, 0.0f, 0.0f,
- 80.5f, -80.5f, -80.5f, 1.0f, 0.0f,
- 80.5f, 80.5f, -80.5f, 1.0f, 1.0f,
- 80.5f, 80.5f, -80.5f, 1.0f, 1.0f,
- -80.5f, 80.5f, -80.5f, 0.0f, 1.0f,
- -80.5f, -80.5f, -80.5f, 0.0f, 0.0f,
- -80.5f, -80.5f, 80.5f, 0.0f, 0.0f,
- 80.5f, -80.5f, 80.5f, 1.0f, 0.0f,
- 80.5f, 80.5f, 80.5f, 1.0f, 1.0f,
- 80.5f, 80.5f, 80.5f, 1.0f, 1.0f,
- -80.5f, 80.5f, 80.5f, 0.0f, 1.0f,
- -80.5f, -80.5f, 80.5f, 0.0f, 0.0f,
- -80.5f, 80.5f, 80.5f, 1.0f, 0.0f,
- -80.5f, 80.5f, -80.5f, 1.0f, 1.0f,
- -80.5f, -80.5f, -80.5f, 0.0f, 1.0f,
- -80.5f, -80.5f, -80.5f, 0.0f, 1.0f,
- -80.5f, -80.5f, 80.5f, 0.0f, 0.0f,
- -80.5f, 80.5f, 80.5f, 1.0f, 0.0f,
- 80.5f, 80.5f, 80.5f, 1.0f, 0.0f,
- 80.5f, 80.5f, -80.5f, 1.0f, 1.0f,
- 80.5f, -80.5f, -80.5f, 0.0f, 1.0f,
- 80.5f, -80.5f, -80.5f, 0.0f, 1.0f,
- 80.5f, -80.5f, 80.5f, 0.0f, 0.0f,
- 80.5f, 80.5f, 80.5f, 1.0f, 0.0f,
- -80.5f, -80.5f, -80.5f, 0.0f, 1.0f,
- 80.5f, -80.5f, -80.5f, 1.0f, 1.0f,
- 80.5f, -80.5f, 80.5f, 1.0f, 0.0f,
- 80.5f, -80.5f, 80.5f, 1.0f, 0.0f,
- -80.5f, -80.5f, 80.5f, 0.0f, 0.0f,
- -80.5f, -80.5f, -80.5f, 0.0f, 1.0f,
- -80.5f, 80.5f, -80.5f, 0.0f, 1.0f,
- 80.5f, 80.5f, -80.5f, 1.0f, 1.0f,
- 80.5f, 80.5f, 80.5f, 1.0f, 0.0f,
- 80.5f, 80.5f, 80.5f, 1.0f, 0.0f,
- -80.5f, 80.5f, 80.5f, 0.0f, 0.0f,
- -80.5f, 80.5f, -80.5f, 0.0f, 1.0f
- };
- unsigned int indices[] = {
- 0, 1, 3, // first triangle
- 1, 2, 3 // second triangle
- };
- unsigned int VBO, VAO, EBO;
- glGenVertexArrays(1, &VAO);
- glGenBuffers(1, &VBO);
- glGenBuffers(1, &EBO);
- glBindVertexArray(VAO);
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
- // // position attribute
- // glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *) 0);
- // glEnableVertexAttribArray(0);
- // // color attribute
- // glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *) (3 * sizeof(float)));
- // glEnableVertexAttribArray(1);
- // // texture coord attribute
- // glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *) (6 * sizeof(float)));
- // glEnableVertexAttribArray(2);
- // position attribute
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void *) 0);
- glEnableVertexAttribArray(0);
- // texture coord attribute
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void *) (3 * sizeof(float)));
- glEnableVertexAttribArray(1);
- // load and create a texture
- // -------------------------
- unsigned int texture;
- glGenTextures(1, &texture);
- glBindTexture(GL_TEXTURE_2D,
- texture); // all upcoming GL_TEXTURE_2D operations now have effect on this texture object
- // set the texture wrapping parameters
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
- GL_REPEAT); // set texture wrapping to GL_REPEAT (default wrapping method)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- // set texture filtering parameters
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- // load image, create texture and generate mipmaps
- int width, height, nrChannels;
- stbi_set_flip_vertically_on_load(true); // GL expects 0,0 at bottom but texture puts it at top
- unsigned char *data = stbi_load("data/braid.jpg", &width, &height, &nrChannels,
- STBI_rgb_alpha); // this allows 32bit colors (RGBA) STBI_rgb only goes 24bit colors (RGB)
- if (data) {
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
- glGenerateMipmap(GL_TEXTURE_2D);
- } else {
- std::cout << "Failed to load texture" << std::endl;
- }
- stbi_image_free(data);
- // Cube positions
- glm::vec3 cubePositions[] = {
- glm::vec3(800.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)
- };
- glEnable(GL_DEPTH_TEST);
- // render loop
- // -----------
- while (!glfwWindowShouldClose(window)) {
- // input
- // -----
- processInput(window);
- // render
- // ------
- glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
- // glClear(GL_COLOR_BUFFER_BIT);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // bind Texture
- glBindTexture(GL_TEXTURE_2D, texture);
- // Rotate model view over time
- // model = glm::rotate(model, (float)sin(glfwGetTime()) * glm::radians(2.0f), glm::vec3(0.5f, 1.0f, 0.0f));
- // render container
- // int modelLoc = glGetUniformLocation(ourShader.ID, "model");
- // glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
- int viewLoc = glGetUniformLocation(ourShader.ID, "view");
- glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
- int projectionLoc = glGetUniformLocation(ourShader.ID, "projection");
- glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
- ourShader.use();
- glBindVertexArray(VAO);
- // glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
- // glDrawArrays(GL_TRIANGLES, 0, 36); // (6 faces * 2 triangles * 3 vertices each)
- for (unsigned int i = 0; i < 10; i++) {
- glm::mat4 model;
- model = glm::translate(model, cubePositions[i]);
- float angle = 20.0f * i + 60 * sin(glfwGetTime());
- model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));
- int modelLoc = glGetUniformLocation(ourShader.ID, "model");
- glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
- // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
- // -------------------------------------------------------------------------------
- glfwSwapBuffers(window);
- glfwPollEvents();
- }
- // optional: de-allocate all resources once they've outlived their purpose:
- // ------------------------------------------------------------------------
- glDeleteVertexArrays(1, &VAO);
- glDeleteBuffers(1, &VBO);
- glDeleteBuffers(1, &EBO);
- // glfw: terminate, clearing all previously allocated GLFW resources.
- // ------------------------------------------------------------------
- glfwTerminate();
- return 0;
- }
- // process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
- // ---------------------------------------------------------------------------------------------------------
- void processInput(GLFWwindow *window) {
- if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
- glfwSetWindowShouldClose(window, true);
- }
- // glfw: whenever the window size changed (by OS or user resize) this callback function executes
- // ---------------------------------------------------------------------------------------------
- void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
- // make sure the viewport matches the new window dimensions; note that width and
- // height will be significantly larger than specified on retina displays.
- glViewport(0, 0, width, height);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement