Advertisement
RomanvonKlein

3ddatagen lab3_full

Nov 29th, 2021
615
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.87 KB | None | 0 0
  1. #include <glad/glad.h>
  2. #include <gl/GL.h>
  3. #include <iostream>
  4. #include <GLFW/glfw3.h>
  5.  
  6. #include <linmath/linmath.h>
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10.  
  11. #include <CourseSupport.h>
  12. #include <ObjToVertices.h>
  13.  
  14. const float PI_F = 3.14159265359f;
  15.  
  16. struct LightParameters {
  17.     vec3 ambientFactor;
  18.     vec3 diffuseFactor;
  19.     vec3 specFactor;
  20.     int shininess;
  21. };
  22.  
  23. LightParameters lightParams = {
  24.     {0.2f,0.2f,0.2f}, //ambientFactor
  25.     {0.8f,0.8f,0.8f}, //diffuseFactor
  26.     {0.99f,0.99f,0.99f}, //specFactor
  27.     1 //shininess
  28. };
  29.  
  30. const int OCTAEDER=0;
  31. const int MODEL = 1;
  32. int selectedVertices = 1;
  33.  
  34. int matIndex = 0;
  35. void handleKeypress(GLFWwindow *window, int key, int scancode, int action, int mods)
  36. {
  37.     if (action == GLFW_PRESS)
  38.         switch (key)
  39.         {
  40.         case GLFW_KEY_ESCAPE:
  41.             exit(0);
  42.         case GLFW_KEY_Q:
  43.             lightParams.ambientFactor[0]+=0.1f;
  44.             lightParams.ambientFactor[1]+=0.1f;
  45.             lightParams.ambientFactor[2]+=0.1f;
  46.             printf("ambient: %f, %f, %f\n", lightParams.ambientFactor[0],lightParams.ambientFactor[1], lightParams.ambientFactor[2]);
  47.             break;
  48.         case GLFW_KEY_A:
  49.             lightParams.ambientFactor[0] -= 0.1f;
  50.             lightParams.ambientFactor[1] -= 0.1f;
  51.             lightParams.ambientFactor[2] -= 0.1f;
  52.             printf("ambient: %f, %f, %f\n", lightParams.ambientFactor[0],lightParams.ambientFactor[1], lightParams.ambientFactor[2]);
  53.             break;
  54.         case GLFW_KEY_W:
  55.             lightParams.diffuseFactor[0] +=0.1f;
  56.             lightParams.diffuseFactor[1] +=0.1f;
  57.             lightParams.diffuseFactor[2] +=0.1f;
  58.             printf("diffuse: %f, %f, %f\n", lightParams.diffuseFactor[0],lightParams.diffuseFactor[1], lightParams.diffuseFactor[2]);
  59.         break;
  60.         case GLFW_KEY_S:
  61.             lightParams.diffuseFactor[0] -=0.1f;
  62.             lightParams.diffuseFactor[1] -=0.1f;
  63.             lightParams.diffuseFactor[2] -=0.1f;
  64.             printf("diffuse: %f, %f, %f\n", lightParams.diffuseFactor[0],lightParams.diffuseFactor[1], lightParams.diffuseFactor[2]);
  65.         break;
  66.  
  67.         case GLFW_KEY_E:
  68.             lightParams.specFactor[0] += 0.1f;
  69.             lightParams.specFactor[1] += 0.1f;
  70.             lightParams.specFactor[2] += 0.1f;
  71.             printf("specular: %f, %f, %f\n", lightParams.specFactor[0],lightParams.specFactor[1], lightParams.specFactor[2]);
  72.             break;
  73.         case GLFW_KEY_D:
  74.             lightParams.specFactor[0] -= 0.1f;
  75.             lightParams.specFactor[1] -= 0.1f;
  76.             lightParams.specFactor[2] -= 0.1f;
  77.             printf("specular: %f, %f, %f\n", lightParams.specFactor[0],lightParams.specFactor[1], lightParams.specFactor[2]);
  78.             break;
  79.         case GLFW_KEY_R:
  80.             lightParams.shininess += 1;
  81.             printf("shininess: %d\n", lightParams.shininess);
  82.             break;
  83.         case GLFW_KEY_F:
  84.             lightParams.shininess -= 1;
  85.             printf("shininess: %d\n", lightParams.shininess);
  86.             break;
  87.         case GLFW_KEY_T:
  88.             matIndex += 1;
  89.             matIndex %= 25;
  90.             lightParams.specFactor[0] = materials[matIndex].specular[0];
  91.             lightParams.specFactor[1] = materials[matIndex].specular[1];
  92.             lightParams.specFactor[2] = materials[matIndex].specular[2];
  93.             lightParams.ambientFactor[0] = materials[matIndex].ambient[0];
  94.             lightParams.ambientFactor[1] = materials[matIndex].ambient[1];
  95.             lightParams.ambientFactor[2] = materials[matIndex].ambient[2];
  96.             lightParams.diffuseFactor[0] = materials[matIndex].diffuse[0];
  97.             lightParams.diffuseFactor[1] = materials[matIndex].diffuse[1];
  98.             lightParams.diffuseFactor[2] = materials[matIndex].diffuse[2];
  99.             lightParams.shininess = materials[matIndex].shininess;
  100.             printf("Selected Material:%s", materials[matIndex].name);
  101.             break;
  102.         case GLFW_KEY_G:
  103.             matIndex -= 1;
  104.             matIndex %= 25;
  105.             lightParams.specFactor[0] = materials[matIndex].specular[0];
  106.             lightParams.specFactor[1] = materials[matIndex].specular[1];
  107.             lightParams.specFactor[2] = materials[matIndex].specular[2];
  108.             lightParams.ambientFactor[0] = materials[matIndex].ambient[0];
  109.             lightParams.ambientFactor[1] = materials[matIndex].ambient[1];
  110.             lightParams.ambientFactor[2] = materials[matIndex].ambient[2];
  111.             lightParams.diffuseFactor[0] = materials[matIndex].diffuse[0];
  112.             lightParams.diffuseFactor[1] = materials[matIndex].diffuse[1];
  113.             lightParams.diffuseFactor[2] = materials[matIndex].diffuse[2];
  114.             lightParams.shininess = materials[matIndex].shininess;
  115.             printf("Selected Material:%s\n", materials[matIndex].name);
  116.             break;
  117.         default:
  118.         {
  119.             printf("unboud key pressed!\n");
  120.         }
  121.         }
  122. }
  123.  
  124.  
  125. static myVertexType* createOctaeder(float radius, int* size)
  126. {
  127.     float xAndZ = sqrt((radius * radius) / 2);
  128.     vec3 fr = { xAndZ, 0.0f, xAndZ };
  129.     vec3 br = { xAndZ, 0.0f, -xAndZ };
  130.     vec3 bl = { -xAndZ, 0.0f, -xAndZ };
  131.     vec3 fl = { -xAndZ, 0.0f, xAndZ };
  132.     vec3 top = { 0.0f, radius, 0.0f };
  133.     vec3 bottom = { 0.0f, -radius, 0.0f };
  134.  
  135.     vec3 norm;
  136.  
  137.     myVertexType* octaederEdges;
  138.     octaederEdges = new myVertexType[24];
  139.    
  140.     int vertexCounter = 0;
  141.  
  142.     getNormal(norm, top, fl, fr);
  143.     octaederEdges[vertexCounter++] = { top, norm };
  144.     octaederEdges[vertexCounter++] = { fr, norm };
  145.     octaederEdges[vertexCounter++] = { fl, norm };
  146.    
  147.     getNormal(norm, bottom, fr, fl);
  148.     octaederEdges[vertexCounter++] = { bottom, norm };
  149.     octaederEdges[vertexCounter++] = { fl, norm };
  150.     octaederEdges[vertexCounter++] = { fr, norm };
  151.  
  152.     getNormal(norm, top, fr, br);
  153.     octaederEdges[vertexCounter++] = { top, norm };
  154.     octaederEdges[vertexCounter++] = { br, norm };
  155.     octaederEdges[vertexCounter++] = { fr, norm };
  156.  
  157.     getNormal(norm, bottom, br, fr);
  158.     octaederEdges[vertexCounter++] = { bottom, norm };
  159.     octaederEdges[vertexCounter++] = { fr, norm };
  160.     octaederEdges[vertexCounter++] = { br, norm };
  161.  
  162.     getNormal(norm, top, br, bl);
  163.     octaederEdges[vertexCounter++] = { top, norm };
  164.     octaederEdges[vertexCounter++] = { bl, norm };
  165.     octaederEdges[vertexCounter++] = { br, norm };
  166.  
  167.     getNormal(norm, bottom, bl, br);
  168.     octaederEdges[vertexCounter++] = { bottom, norm };
  169.     octaederEdges[vertexCounter++] = { br, norm };
  170.     octaederEdges[vertexCounter++] = { bl, norm };
  171.  
  172.     getNormal(norm, top, bl, fl);
  173.     octaederEdges[vertexCounter++] = { top, norm };
  174.     octaederEdges[vertexCounter++] = { fl, norm };
  175.     octaederEdges[vertexCounter++] = { bl, norm };
  176.  
  177.     getNormal(norm, bottom, fl, bl);
  178.     octaederEdges[vertexCounter++] = { bottom, norm };
  179.     octaederEdges[vertexCounter++] = { bl, norm };
  180.     octaederEdges[vertexCounter++] = { fl, norm };
  181.  
  182.    
  183.     *size =24;
  184.     return octaederEdges;
  185. }
  186. const int lineCount = 100;
  187.  
  188. const int sphereVerticesCount = lineCount * lineCount * 6;
  189.  
  190. const int countOfSphereEdges = lineCount * lineCount;
  191. const int customCountOfSphereVertices = 14;
  192.  
  193.  
  194. void createFile(){
  195.     FILE* f;
  196.     f = fopen("C:\\test.txt","w+");
  197.     fputs("Meh :/\n", f);
  198.     fclose(f);
  199.  
  200. }
  201.  
  202. int main(void)
  203. {
  204.     //TODO: debugging only
  205.     //createFile();
  206.  
  207.     GLFWwindow* window;
  208.     GLuint vertex_buffer, vertex_shader, fragment_shader, complete_shader_program;
  209.     GLint  matrix_access, position_access, normal_access;
  210.  
  211.     printf("Hi This is the numbner of Vertices: %d\n", sphereVerticesCount);
  212.     int vertices_size = -1;
  213.     myVertexType *triangle_vertices=NULL;
  214.     if(selectedVertices == MODEL){
  215.         const char* monkey = "C:\\Users\\Lukas\\source\\repos\\FirstTestProject\\x64\\Debug\\plane.obj";
  216.         triangle_vertices = loadModel(monkey, &vertices_size);
  217.         printf("loaded MODEL with vertices_size: %d\n", vertices_size);
  218.         float zoom = 0.001;//for plane
  219.         //float zoom = 0.8;//for monkey
  220.         for (int i = 0; i < vertices_size; i++)
  221.         {
  222.             triangle_vertices[i].x *= zoom;
  223.             triangle_vertices[i].y *= zoom;
  224.             triangle_vertices[i].z *= zoom;
  225.         }
  226.     }else if (selectedVertices == OCTAEDER){
  227.         triangle_vertices = createOctaeder(0.5f, &vertices_size);
  228.         printf("loaded OCTAEDER with vertices_size: %d\n", vertices_size);
  229.     }
  230.     int count = 0;
  231.     int help = 0;
  232.  
  233.     if (!glfwInit())
  234.         exit(EXIT_FAILURE);
  235.  
  236.     window = glfwCreateWindow(1280, 1024, "Happy Sphere", NULL, NULL);
  237.     if (!window)
  238.     {
  239.         glfwTerminate();
  240.         exit(EXIT_FAILURE);
  241.     }
  242.  
  243.     glfwSetKeyCallback(window, handleKeypress);
  244.     glfwMakeContextCurrent(window);
  245.     gladLoadGL();
  246.  
  247.     static const char* vertex_shader_code = readTextFileIntoString("VertexShader.glsl");
  248.     static const char* fragment_shader_code = readTextFileIntoString("FragmentShader.glsl");
  249.  
  250.  
  251.     vertex_shader = glCreateShader(GL_VERTEX_SHADER);
  252.     glShaderSource(vertex_shader, 1, &vertex_shader_code, NULL);
  253.     glCompileShader(vertex_shader);
  254.  
  255.     char info[500];
  256.     int num;
  257.     glGetShaderInfoLog(vertex_shader, 500, &num, info);
  258.     printf("%s", info);
  259.  
  260.  
  261.     fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
  262.     glShaderSource(fragment_shader, 1, &fragment_shader_code, NULL);
  263.     glCompileShader(fragment_shader);
  264.  
  265.     glGetShaderInfoLog(fragment_shader, 500, &num, info);
  266.     printf("%s", info);
  267.  
  268.  
  269.  
  270.     complete_shader_program = glCreateProgram();
  271.     glAttachShader(complete_shader_program, vertex_shader);
  272.     glAttachShader(complete_shader_program, fragment_shader);
  273.     glLinkProgram(complete_shader_program);
  274.  
  275.  
  276.     matrix_access = glGetUniformLocation(complete_shader_program, "matrix");
  277.     position_access = glGetAttribLocation(complete_shader_program, "position");
  278.     normal_access = glGetAttribLocation(complete_shader_program, "normal");
  279.  
  280.  
  281.     GLint ambient;
  282.     GLint diffuse;
  283.     GLint specular;
  284.     int shininess;
  285.  
  286.  
  287.     ambient = glGetUniformLocation(complete_shader_program, "params.ambientFactor");
  288.     diffuse = glGetUniformLocation(complete_shader_program, "params.diffuseFactor");
  289.     specular = glGetUniformLocation(complete_shader_program, "params.specFactor");
  290.     shininess = glGetUniformLocation(complete_shader_program, "params.shininess");
  291.  
  292.  
  293.  
  294.  
  295.     glGenBuffers(1, &vertex_buffer);
  296.     glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
  297.  
  298.     glBufferData(GL_ARRAY_BUFFER, vertices_size * sizeof(myVertexType), triangle_vertices, GL_STATIC_DRAW);
  299.  
  300.     glEnableVertexAttribArray(position_access);
  301.     glVertexAttribPointer(position_access, 3, GL_FLOAT, GL_FALSE,
  302.         sizeof(myVertexType), (void*)0);
  303.  
  304.     glEnableVertexAttribArray(normal_access);
  305.     glVertexAttribPointer(normal_access, 3, GL_FLOAT, GL_FALSE,
  306.         sizeof(myVertexType), (void*)(sizeof(float) * 3));
  307.  
  308.     glEnable(GL_DEPTH_TEST);
  309.     while (!glfwWindowShouldClose(window))
  310.     {
  311.         float ratio;
  312.         int width, height;
  313.         mat4x4 m, p, matrix, colMat;
  314.  
  315.         glfwGetFramebufferSize(window, &width, &height);
  316.         ratio = width / (float)height;
  317.  
  318.         glViewport(0, 0, width, height);
  319.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  320.  
  321.         mat4x4_identity(m);
  322.         mat4x4_rotate_Y(m, m, (float)glfwGetTime());
  323.         mat4x4_rotate_Z(m, m, (float)glfwGetTime());
  324.         mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
  325.         mat4x4_mul(matrix, p, m);
  326.  
  327.         glUseProgram(complete_shader_program);
  328.         glUniformMatrix4fv(matrix_access, 1, GL_FALSE, (const GLfloat*)matrix);
  329.  
  330.         // glUniform1f(ambient, ambfac);
  331.         glUniform3fv(ambient,  1, lightParams.ambientFactor);
  332.         glUniform3fv(diffuse,  1, lightParams.diffuseFactor);
  333.         glUniform3fv(specular, 1, lightParams.specFactor);
  334.         glUniform1i(shininess, lightParams.shininess);
  335.  
  336.  
  337.         glDrawArrays(GL_TRIANGLES, 0, vertices_size * sizeof(myVertexType));
  338.  
  339.         glfwSwapBuffers(window);
  340.         glfwPollEvents();
  341.     }
  342.  
  343.     glfwDestroyWindow(window);
  344.  
  345.     glfwTerminate();
  346.     exit(EXIT_SUCCESS);
  347. }
  348.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement