Advertisement
Guest User

Untitled

a guest
Oct 17th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.02 KB | None | 0 0
  1. #include <iostream>
  2. #include "imgui.h"
  3. #include "imgui_impl_glfw.h"
  4. #include "imgui_impl_opengl3.h"
  5. #include "glm/glm.hpp"
  6. #include <stdio.h>
  7. #include <vector>
  8. #include <memory>
  9. #if defined(IMGUI_IMPL_OPENGL_LOADER_GL3W)
  10. #include <GL/gl3w.h>    // Initialize with gl3wInit()
  11. #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEW)
  12. #include <GL/glew.h>    // Initialize with glewInit()
  13. #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
  14. #include <glad/glad.h>  // Initialize with gladLoadGL()
  15. #else
  16. #include IMGUI_IMPL_OPENGL_LOADER_CUSTOM
  17. #endif
  18.  
  19. #include <GLFW/glfw3.h>
  20.  
  21.  
  22.  
  23. //nasze wierzcholki
  24. std::vector<glm::fvec3> pointVector;
  25. //do naszej rekursji
  26. int prevIterationCount = 0;
  27. //pozycja intow w pamieci
  28. unsigned int VBO, VAO, EBO;
  29.  
  30.  
  31. void processInput(GLFWwindow *window)
  32. {
  33.     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
  34.         glfwSetWindowShouldClose(window, true);
  35. }
  36.  
  37. void framebuffer_size_callback(GLFWwindow* window, int width, int height)
  38. {
  39.     glViewport(0, 0, width, height);
  40. }
  41.  
  42.  
  43.  
  44. //odleglosc
  45. float Distance(float x1, float x2, float y1, float y2)
  46. {
  47.     return sqrtf((x2 - x1)*(x2 - x1)+(y2 - y1)*(y2 - y1));
  48. }
  49.  
  50. //
  51. //DYWAN
  52. //
  53. static void Carpet(int step, GLfloat maxX, GLfloat maxY, GLfloat minX, GLfloat minY, GLuint &VBO, GLuint &VAO, GLuint &program, GLuint &program2)
  54. {
  55.     if (step == 0)
  56.         return;
  57.  
  58.     GLfloat white[] = {
  59.             minX, maxY, 0.0f,
  60.             maxX, maxY, 0.0f,
  61.             maxX, minY, 0.0f,
  62.             minX, maxY, 0.0f,
  63.             minX, minY, 0.0f,
  64.             maxX, minY, 0.0f
  65.     };
  66.     GLfloat black[] = {
  67.             minX + (maxX - minX)*(1.0f / 3.0f), minY + (maxY - minY)*(2.0f / 3.0f), 0.0f,
  68.             minX + (maxX - minX)*(2.0f / 3.0f), minY + (maxY - minY)*(2.0f / 3.0f), 0.0f,
  69.             minX + (maxX - minX)*(2.0f / 3.0f), minY + (maxY - minY)*(1.0f / 3.0f), 0.0f,
  70.             minX + (maxX - minX)*(1.0f / 3.0f), minY + (maxY - minY)*(2.0f / 3.0f), 0.0f,
  71.             minX + (maxX - minX)*(1.0f / 3.0f), minY + (maxY - minY)*(1.0f / 3.0f), 0.0f,
  72.             minX + (maxX - minX)*(2.0f / 3.0f), minY + (maxY - minY)*(1.0f / 3.0f), 0.0f
  73.     };
  74.  
  75.     glBindBuffer(GL_ARRAY_BUFFER, VBO);
  76.     glBufferData(GL_ARRAY_BUFFER, sizeof(white), white, GL_DYNAMIC_DRAW);
  77.  
  78.     glUseProgram(program);
  79.     glBindVertexArray(VAO);
  80.     glDrawArrays(GL_TRIANGLES, 0, 6);
  81.  
  82.     glBindBuffer(GL_ARRAY_BUFFER, VBO);
  83.     glBufferData(GL_ARRAY_BUFFER, sizeof(black), black, GL_DYNAMIC_DRAW);
  84.  
  85.     glUseProgram(program2);
  86.     glBindVertexArray(VAO);
  87.     glDrawArrays(GL_TRIANGLES, 0, 6);
  88.  
  89.     Carpet(step-1, minX + (maxX - minX)*(1.0f / 3.0f), maxY, minX, minY + (maxY - minY)*(2.0f / 3.0f), VBO, VAO, program, program2);                                        //TOP LEFT
  90.     Carpet(step-1, minX + (maxX - minX)*(2.0f / 3.0f), maxY, minX + (maxX - minX)*(1.0f / 3.0f), minY + (maxY - minY)*(2.0f / 3.0f), VBO, VAO, program, program2);          //TOP CENTER
  91.     Carpet(step-1, maxX, maxY, minX + (maxX - minX)*(2.0f / 3.0f), minY + (maxY - minY)*(2.0f / 3.0f), VBO, VAO, program, program2);                                        //TOP RIGHT
  92.     Carpet(step-1, minX + (maxX - minX)*(1.0f / 3.0f), minY + (maxY - minY)*(2.0f / 3.0f), minX, minY + (maxY - minY)*(1.0f / 3.0f), VBO, VAO, program, program2);          //CENTER LEFT
  93.     Carpet(step-1, maxX, minY + (maxY - minY)*(2.0f / 3.0f), minX + (maxX - minX)*(2.0f / 3.0f), minY + (maxY - minY)*(1.0f / 3.0f), VBO, VAO, program, program2);          //CENTER RIGHT
  94.     Carpet(step-1, minX + (maxX - minX)*(1.0f / 3.0f), minY + (maxY - minY)*(1.0f / 3.0f), minX, minY, VBO, VAO, program, program2);                                        //BOTTOM LEFT
  95.     Carpet(step-1, minX + (maxX - minX)*(2.0f / 3.0f), minY + (maxY - minY)*(1.0f / 3.0f), minX + (maxX - minX)*(1.0f / 3.0f), minY, VBO, VAO, program, program2);          //BOTTOM CENTER
  96.     Carpet(step-1, maxX, minY + (maxY - minY)*(1.0f / 3.0f), minX + (maxX - minX)*(2.0f / 3.0f), minY, VBO, VAO, program, program2);                                        //BOTTOM RIGHT
  97. }
  98.  
  99. int main(){
  100.     const char* glsl_version = "#version 330";
  101.     // glfw: initializacja
  102.     // ------------------------------
  103.     glfwInit();
  104.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  105.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  106.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  107.  
  108.  
  109.     GLFWwindow* window = glfwCreateWindow(900, 900, "Dywan Sierpińskiego", NULL, NULL);
  110.     if (window == NULL)
  111.     {
  112.         std::cout << "Nie udało sie stworzyc okna" << std::endl;
  113.         glfwTerminate();
  114.         return -1;
  115.     }
  116.     glfwMakeContextCurrent(window);
  117.     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  118.  
  119.     // glad: load all OpenGL function pointers
  120.     // ---------------------------------------
  121.     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
  122.     {
  123.         std::cout << "Blad inicjalizacji GLADA" << std::endl;
  124.         return -1;
  125.     }
  126.     // Ustawieni ImGui
  127.     IMGUI_CHECKVERSION();
  128.     ImGui::CreateContext();
  129.     ImGuiIO& io = ImGui::GetIO(); (void)io;
  130.     //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;  // Enable Keyboard Controls
  131.     //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;   // Enable Gamepad Controls
  132.  
  133.     ImGui_ImplGlfw_InitForOpenGL(window, true);
  134.     ImGui_ImplOpenGL3_Init(glsl_version);
  135.     ImGui::StyleColorsClassic();
  136.     const char *vertexShaderSource = "#version 330 core\n"
  137.                                      "layout (location = 0) in vec3 aPos;\n"
  138.                                      "void main()\n"
  139.                                      "{\n"
  140.                                      "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
  141.                                      "}\0";
  142.     const char *fragmentShaderSource = "#version 330 core\n"
  143.                                        "out vec4 FragColor;\n"
  144.                                        "void main()\n"
  145.                                        "{\n"
  146.                                        "   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
  147.                                        "}\n\0";
  148.     const char *fragmentShaderSource2 = "#version 330 core\n"
  149.                                         "out vec4 FragColor;\n"
  150.                                         "void main()\n"
  151.                                         "{\n"
  152.                                         "   FragColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);\n"
  153.                                         "}\n\0";
  154.  
  155.     //shadery bez sprwadzenia
  156.     GLuint vertexShader, fragmentShader, fragmentShader2;
  157.     vertexShader = glCreateShader(GL_VERTEX_SHADER);
  158.     glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
  159.     glCompileShader(vertexShader);
  160.  
  161.     // fragment shader
  162.     fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  163.     glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
  164.     glCompileShader(fragmentShader);
  165.     fragmentShader2 = glCreateShader(GL_FRAGMENT_SHADER);
  166.     glShaderSource(fragmentShader2, 1, &fragmentShaderSource2, NULL);
  167.     // link shaders
  168.     GLuint shaderProgram, shaderProgram2;
  169.     shaderProgram = glCreateProgram();
  170.     shaderProgram2 = glCreateProgram();
  171.     glAttachShader(shaderProgram, vertexShader);
  172.     glAttachShader(shaderProgram, fragmentShader);
  173.     glLinkProgram(shaderProgram);
  174.     glAttachShader(shaderProgram2, vertexShader);
  175.     glAttachShader(shaderProgram2, fragmentShader2);
  176.     glLinkProgram(shaderProgram2);
  177.  
  178.     glDeleteShader(vertexShader);
  179.     glDeleteShader(fragmentShader);
  180.     glDeleteShader(fragmentShader2);
  181.     /// te te vbo
  182.  
  183.  
  184.     float vertices[] = {
  185.             1, 1, 0.0f,
  186.             1, 0, 0.0f,
  187.             0, 0, 0.0f,
  188.             0, 0, 0.0f,
  189.             0, 1, 0.0f,
  190.             1, 1, 0.0f,  // Lewy górny
  191. };
  192.  
  193.     /*GLuint indices[] = { // Zauważ, że zaczynamy od 0!
  194.             0, 1, 3, // Pierwszy trójkąt
  195.             1, 2, 3 // Drugi trójkąt
  196.     };*/
  197.     glGenVertexArrays(1, &VAO);
  198.     glGenBuffers(1, &VBO);
  199.     //glGenBuffers(1, &EBO);
  200.     glBindVertexArray(VAO);
  201.     //glGenBuffers(1, &VBO);
  202.     glBindBuffer(GL_ARRAY_BUFFER, VBO);
  203.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  204.     //skopiuj naszą tablicę indeksów do EBO
  205.     //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  206.     //glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
  207.     //ustaw wskaźniki do atrybutów wierzchołków
  208.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
  209.     glEnableVertexAttribArray(0);
  210.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  211.     glBindVertexArray(0);
  212.  
  213.  
  214.  
  215.     while (!glfwWindowShouldClose(window))
  216.     {
  217.         // input
  218.         // -----
  219.         glfwPollEvents();
  220.  
  221.  
  222.         ImGui_ImplOpenGL3_NewFrame();
  223.         ImGui_ImplGlfw_NewFrame();
  224.         ImGui::NewFrame();
  225.  
  226.         static int f = 1;
  227.         ImGui::Begin("Opcje");                                              // Create a window called "Options" and append into it.
  228.         ImGui::Text("Ilosc iteracji dla dywanu Sierpinskiego");                // Display some text (you can use a format strings too)
  229.         ImGui::SliderInt("Iteracje", &f, 1, 12);                          // Edit 1 int using a slider from 0 to 25
  230.         ImGui::End();
  231.  
  232.         //Rendering
  233.         ImGui::Render();
  234.         int display_w, display_h;
  235.  
  236.         glfwMakeContextCurrent(window);
  237.         glfwGetFramebufferSize(window, &display_w, &display_h);
  238.         glViewport(0, 0, display_w, display_h);
  239.         glClearColor(1.0f, 1.0f, 1.0f, 1.00f);
  240.         glClear(GL_COLOR_BUFFER_BIT);
  241.  
  242.         Carpet(f, 1.0f, 1.0f, 0.0f, 0.0f, VBO, VAO, shaderProgram, shaderProgram2);
  243.  
  244.         glfwMakeContextCurrent(window);
  245.         glfwSwapBuffers(window);
  246.         glfwPollEvents();
  247.     }
  248.  
  249.  
  250.     // Cleanup
  251.     ImGui_ImplOpenGL3_Shutdown();
  252.     ImGui_ImplGlfw_Shutdown();
  253.     ImGui::DestroyContext();
  254.  
  255.     glfwDestroyWindow(window);
  256.     glfwTerminate();
  257.  
  258.  
  259.  
  260.  
  261.  
  262.     glDeleteVertexArrays(1, &VAO);
  263.     glDeleteBuffers(1, &VBO);
  264.     glDeleteBuffers(1, &EBO);
  265.  
  266.     glfwTerminate();
  267.     return 0;
  268. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement