Advertisement
Margoshinka

4

Feb 28th, 2023
547
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 21.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <GL/glew.h>
  3. #include <GLFW/glfw3.h>
  4. #include <chrono>
  5. #include <glm/glm.hpp>
  6. #include <glm/gtc/matrix_transform.hpp>
  7. #include <glm/gtx/transform.hpp>
  8. #include <glm/vec3.hpp> // vec3
  9. #include <glm/vec4.hpp> // vec4
  10. #include <glm/mat4x4.hpp>
  11.  
  12. #include <glm/gtc/type_ptr.hpp>
  13.  
  14. #include <iostream>
  15.  
  16. #pragma comment(lib, "glfw3.lib")
  17. #pragma comment(lib, "glew32.lib")
  18. #pragma comment(lib, "opengl32.lib")
  19.  
  20. using namespace std;
  21. using namespace glm;
  22.  
  23. mat4 ModelObj = mat4(1.0f);
  24. //размерность n x n
  25. GLint n_size = 10;
  26. //Точка отсчета
  27. GLfloat x0 = -(GLfloat)n_size / 2.0; //x
  28. GLfloat z0 = x0;//z
  29. //Шаг
  30. GLfloat dx = 0.01; //по x
  31. GLfloat dz = dx; //по z
  32. //Количество ячеек
  33. GLint Tess_N = n_size / dx;
  34.  
  35. GLFWwindow* g_window;
  36.  
  37. GLuint g_shaderProgram;
  38. GLint g_uMVP;
  39. GLint g_uMV;
  40.  
  41. chrono::time_point<chrono::system_clock> g_callTime;
  42. class MyMatrix {
  43.     float m_mat[16];
  44. public:
  45.     void translation( float x, float y, float z) { //матрица переноса
  46.        
  47.         m_mat[0] = 1.0f; m_mat[1] = 0.0f; m_mat[2] = 0.0f; m_mat[3] = 0.0f;
  48.         m_mat[4] = 0.0f; m_mat[5] = 1.0f; m_mat[6] = 0.0f; m_mat[7] = 0.0f;
  49.         m_mat[8] = 0.0f; m_mat[9] = 0.0f; m_mat[10] = 1.0f; m_mat[11] = 0.0f;
  50.         m_mat[12] = x; m_mat[13] = y; m_mat[14] = z; m_mat[15] = 1.0f;
  51.        
  52.     }
  53.     void rotate(float angle, float x, float y, float z) {
  54.         // Вычисляем тригонометрические функции угла поворота
  55.         float c = cos(angle);
  56.         float s = sin(angle);
  57.         float t = 1.0f - c;
  58.         float len = sqrt(x * x + y * y + z * z);
  59.  
  60.         // Нормализуем вектор оси поворота
  61.         if (len != 0.0f) {
  62.             x /= len;
  63.             y /= len;
  64.             z /= len;
  65.         }
  66.  
  67.         // Заполняем матрицу поворота
  68.         m_mat[0] = c + x * x * t;
  69.         m_mat[1] = y * x * t + z * s;
  70.         m_mat[2] = z * x * t - y * s;
  71.         m_mat[3] = 0.0f;
  72.  
  73.         m_mat[4] = x * y * t - z * s;
  74.         m_mat[5] = c + y * y * t;
  75.         m_mat[6] = z * y * t + x * s;
  76.         m_mat[7] = 0.0f;
  77.  
  78.         m_mat[8] = x * z * t + y * s;
  79.         m_mat[9] = y * z * t - x * s;
  80.         m_mat[10] = c + z * z * t;
  81.         m_mat[11] = 0.0f;
  82.  
  83.         m_mat[12] = 0.0f;
  84.         m_mat[13] = 0.0f;
  85.         m_mat[14] = 0.0f;
  86.         m_mat[15] = 1.0f;
  87.     }
  88.  
  89.     MyMatrix operator * (const MyMatrix& m) {
  90.         MyMatrix mat;
  91.         const float* a = m_mat;
  92.         const float* b = m.m_mat;
  93.         float* result = mat.m_mat;
  94.         for (int i = 0; i < 4; ++i) {
  95.             for (int j = 0; j < 4; ++j) {
  96.                 result[i * 4 + j] =
  97.                     a[i * 4] * b[j] +
  98.                     a[i * 4 + 1] * b[j + 4] +
  99.                     a[i * 4 + 2] * b[j + 8] +
  100.                     a[i * 4 + 3] * b[j + 12];
  101.             }
  102.         }
  103.         return mat;
  104.     }
  105.     friend MyMatrix operator*(const mat4& left, const MyMatrix& right) {
  106.         MyMatrix mat;
  107.         const float* b = right.m_mat;
  108.         float a[16]; int k = 0;
  109.         for (int i = 0; i < 4; i++) {
  110.             for (int j = 0; j < 4; j++) {
  111.                 a[k] = left[j][i]; k++;
  112.             }
  113.             std::cout << std::endl;
  114.         }
  115.         //const float* b = value_ptr(m);
  116.         float* result = mat.m_mat;
  117.         for (int i = 0; i < 4; ++i) {
  118.             for (int j = 0; j < 4; ++j) {
  119.                 result[i * 4 + j] =
  120.                     a[i * 4] * b[j] +
  121.                     a[i * 4 + 1] * b[j + 4] +
  122.                     a[i * 4 + 2] * b[j + 8] +
  123.                     a[i * 4 + 3] * b[j + 12];
  124.             }
  125.         }
  126.         return mat;
  127.     }
  128.     MyMatrix operator * (const mat4& m) {
  129.         MyMatrix mat;
  130.         const float* a = m_mat;
  131.         float b[16]; int k = 0;
  132.         for (int i = 0; i < 4; i++) {
  133.             for (int j = 0; j < 4; j++) {
  134.                 b[k] = m[j][i]; k++;
  135.             }
  136.             std::cout << std::endl;
  137.         }
  138.         //const float* b = value_ptr(m);
  139.         float* result = mat.m_mat;
  140.         for (int i = 0; i < 4; ++i) {
  141.             for (int j = 0; j < 4; ++j) {
  142.                 result[i * 4 + j] =
  143.                     a[i * 4] * b[j] +
  144.                     a[i * 4 + 1] * b[j + 4] +
  145.                     a[i * 4 + 2] * b[j + 8] +
  146.                     a[i * 4 + 3] * b[j + 12];
  147.             }
  148.         }
  149.         return mat;
  150.     }
  151.     void  scale( float x, float y, float z) {
  152.        
  153.         m_mat[0] = x;
  154.         m_mat[1] = 0.0f;
  155.         m_mat[2] = 0.0f;
  156.         m_mat[3] = 0.0f;
  157.         m_mat[4] = 0.0f;
  158.         m_mat[5] = y;
  159.         m_mat[6] = 0.0f;
  160.         m_mat[7] = 0.0f;
  161.         m_mat[8] = 0.0f;
  162.         m_mat[9] = 0.0f;
  163.         m_mat[10] = z;
  164.         m_mat[11] = 0.0f;
  165.         m_mat[12] = 0.0f;
  166.         m_mat[13] = 0.0f;
  167.         m_mat[14] = 0.0f;
  168.         m_mat[15] = 1.0f;
  169.        
  170.     }
  171.    
  172.      void Projection(float n, float r, float t, float l, float b, float f) {
  173.        
  174.         m_mat[0] = 2 * n / (r - l);
  175.         m_mat[1] = 0.0f;
  176.         m_mat[2] = (r + l) / (r - l);
  177.         m_mat[3] = 0.0f;
  178.         m_mat[4] = 0.0f;
  179.         m_mat[5] = 2 * n / (t - b);
  180.         m_mat[6] = (t + b) / (t - b);
  181.         m_mat[7] = 0.0f;
  182.         m_mat[8] = 0.0f;
  183.         m_mat[9] = 0.0f;
  184.         m_mat[10] = -(f + n) / (f - n);
  185.         m_mat[11] = -2 * f * n / (f - n);
  186.         m_mat[12] = 0.0f;
  187.         m_mat[13] = 0.0f;
  188.         m_mat[14] = -1.0f;
  189.         m_mat[15] = 0.0f;
  190.        
  191.     }
  192.      void View() {
  193.          m_mat[0] =
  194.              0.514496;
  195.          m_mat[1] = 0.0;
  196.          m_mat[2] = -0.857493;
  197.          m_mat[3] = 9.53674e-07;
  198.          m_mat[4] = -0.392299;
  199.          m_mat[5] = 0.889212;
  200.          m_mat[6] = -0.23538;
  201.          m_mat[7] = -4.76837e-07;
  202.          m_mat[8] = 0.762493;
  203.          m_mat[9] = 0.457496;
  204.          m_mat[10] = 0.457496;
  205.          m_mat[11] = -32.7872;
  206.          m_mat[12] = 0.0;
  207.          m_mat[13] = 0.0;
  208.          m_mat[14] = 0.0;
  209.          m_mat[15] = 1.0;
  210.        
  211.      }
  212.      MyMatrix() {
  213.          m_mat[0] =
  214.              1.0f;
  215.          m_mat[1] = 0.0f;
  216.          m_mat[2] = 0.0f;
  217.          m_mat[3] = 0.0f;
  218.          m_mat[4] = 0.0f;
  219.          m_mat[5] = 1.0f;
  220.          m_mat[6] = 0.0f;
  221.          m_mat[7] = 0.0f;
  222.          m_mat[8] = 0.0f;
  223.          m_mat[9] = 0.0f;
  224.          m_mat[10] = 1.0f;
  225.          m_mat[11] = 0.0f;
  226.          m_mat[12] = 0.0f;
  227.          m_mat[13] = 0.0f;
  228.          m_mat[14] = 0.0f;
  229.          m_mat[15] = 1.0f;
  230.      }
  231.      void Model() {
  232.          m_mat[0] =
  233.              1.0f;
  234.          m_mat[1] = 0.0f;
  235.          m_mat[2] = 0.0f;
  236.          m_mat[3] = 0.0f;
  237.          m_mat[4] = 0.0f;
  238.          m_mat[5] = 1.0f;
  239.          m_mat[6] = 0.0f;
  240.          m_mat[7] = 0.0f;
  241.          m_mat[8] = 0.0f;
  242.          m_mat[9] = 0.0f;
  243.          m_mat[10] = 1.0f;
  244.          m_mat[11] = 0.0f;
  245.          m_mat[12] = 0.0f;
  246.          m_mat[13] = 0.0f;
  247.          m_mat[14] = 0.0f;
  248.          m_mat[15] = 1.0f;
  249.      }
  250.  
  251.      float* get()  { return m_mat; };
  252. };
  253. MyMatrix *M = new MyMatrix();
  254.  
  255.  
  256. class Model
  257. {
  258. public:
  259.     GLuint vbo;
  260.     GLuint ibo;
  261.     GLuint vao;
  262.     GLsizei indexCount;
  263. };
  264.  
  265. Model g_model;
  266.  
  267. GLuint createShader(const GLchar* code, GLenum type)
  268. {
  269.     GLuint result = glCreateShader(type);
  270.  
  271.     glShaderSource(result, 1, &code, NULL);
  272.     glCompileShader(result);
  273.  
  274.     GLint compiled;
  275.     glGetShaderiv(result, GL_COMPILE_STATUS, &compiled);
  276.  
  277.     if (!compiled)
  278.     {
  279.         GLint infoLen = 0;
  280.         glGetShaderiv(result, GL_INFO_LOG_LENGTH, &infoLen);
  281.         if (infoLen > 0)
  282.         {
  283.             char* infoLog = (char*)alloca(infoLen);
  284.             glGetShaderInfoLog(result, infoLen, NULL, infoLog);
  285.             cout << "Shader compilation error" << endl << infoLog << endl;
  286.         }
  287.         glDeleteShader(result);
  288.         return 0;
  289.     }
  290.  
  291.     return result;
  292. }
  293.  
  294. GLuint createProgram(GLuint vsh, GLuint fsh)
  295. {
  296.     GLuint result = glCreateProgram();
  297.  
  298.     glAttachShader(result, vsh);
  299.     glAttachShader(result, fsh);
  300.  
  301.     glLinkProgram(result);
  302.  
  303.     GLint linked;
  304.     glGetProgramiv(result, GL_LINK_STATUS, &linked);
  305.  
  306.     if (!linked)
  307.     {
  308.         GLint infoLen = 0;
  309.         glGetProgramiv(result, GL_INFO_LOG_LENGTH, &infoLen);
  310.         if (infoLen > 0)
  311.         {
  312.             char* infoLog = (char*)alloca(infoLen);
  313.             glGetProgramInfoLog(result, infoLen, NULL, infoLog);
  314.             cout << "Shader program linking error" << endl << infoLog << endl;
  315.         }
  316.         glDeleteProgram(result);
  317.         return 0;
  318.     }
  319.  
  320.     return result;
  321. }
  322.  
  323. bool createShaderProgram() {
  324.     g_shaderProgram = 0;
  325.  
  326.     const GLchar vsh[] =
  327.         "#version 330\n"
  328.         ""
  329.         "layout(location = 0) in vec2 a_position;"
  330.         ""
  331.         "uniform mat4 u_mv;"
  332.         "uniform mat4 u_mvp;"
  333.         ""
  334.         "out vec3 v_p;"
  335.         "out vec3 v_normal;"
  336.         ""
  337.         "void main()"
  338.         "{"
  339.         "    float x = a_position[0];"
  340.         "    float z = a_position[1];"
  341.         "    float func =0.25 *(1-x* z)* sin(1-x *z); "
  342.         "    vec4 pos = vec4(a_position[0], func, a_position[1], 1.0);"
  343.         "    gl_Position = u_mvp*pos;"
  344.         "    v_p = (u_mv*pos).xyz;"
  345.         "    float g_x = -0.25*z*sin(1 - x*z) - 0.25*z*(1 - x*z)*cos(-1 + x*z);"
  346.         "    float g_z = -0.25*x*sin(1 - x*z) - 0.25*x*(1 - x*z)*cos(-1 + x*z);"
  347.         //"    float x = a_position[0];"
  348.         //"    float z = a_position[1];"
  349.         //"    float func =x+z; "
  350.         //"    vec4 pos = vec4(a_position[0], func, a_position[1], 1.0);"
  351.         //"    gl_Position = u_mvp*pos;"
  352.         //"    v_p = (u_mv*pos).xyz;"
  353.         //"    float g_x = 1;"
  354.         //"    float g_z = 1;"
  355.         "    v_normal = normalize(transpose(inverse(mat3(u_mv)))*vec3(g_x, 1.0, g_z));"
  356.         "}"
  357.         ;
  358.  
  359.     const GLchar fsh[] =
  360.         "#version 330\n"
  361.         ""
  362.         "in vec3 v_p;"
  363.         "in vec3 v_normal;"
  364.         ""
  365.         "layout(location = 0) out vec4 o_color;"
  366.         ""
  367.         "void main()"
  368.         "{"
  369.         "   vec3 u_l = vec3(5.0, 10.0, 0.0);" //Положение источника света
  370.         "   vec3 n = normalize(v_normal);" //нормировка нормали
  371.         "   vec3 l = normalize(v_p-u_l);"
  372.         "   float a = dot(-l, n);"
  373.         "   float d = max(a, 0.1);" //диффузное освещение
  374.         "   vec3 r = reflect(l, n);" //вектор отражения
  375.         "   vec3 e = normalize(-v_p);"
  376.         "   float s = pow(max(dot(r, e), 0.0), 5.0)*int(a >= 0);" //компонент зеркального блика
  377.         "   o_color = vec4(d*vec3(1.0, 0.0, 0.0)+s*vec3(1.0), 1.0);" //цвет поверхности
  378.         "}"
  379.         ;
  380.  
  381.     GLuint vertexShader, fragmentShader;
  382.  
  383.     vertexShader = createShader(vsh, GL_VERTEX_SHADER);
  384.     fragmentShader = createShader(fsh, GL_FRAGMENT_SHADER);
  385.  
  386.     g_shaderProgram = createProgram(vertexShader, fragmentShader);
  387.  
  388.     //Матрицы
  389.     g_uMV = glGetUniformLocation(g_shaderProgram, "u_mv");
  390.     g_uMVP = glGetUniformLocation(g_shaderProgram, "u_mvp");
  391.     glDeleteShader(vertexShader);
  392.     glDeleteShader(fragmentShader);
  393.  
  394.     return g_shaderProgram != 0;
  395. }
  396.  
  397. //Получение порядкового номера вершины по индексам i, j
  398. GLint getNumVertex(int j, int i, int n) {
  399.     return (GLint)(i + j * (n + 1));
  400. }
  401. void generateMesh(GLfloat* vertices, GLuint* indices, int Tess_N) {
  402.     int index = 0;
  403.    
  404.     GLfloat* arr_x = new GLfloat[Tess_N + 1];//координаты x
  405.     GLfloat* arr_z = new GLfloat[Tess_N + 1];//координаты z
  406.     //Заполнение массива с координатами x
  407.     for (int i = 0; i <= Tess_N; i++) {
  408.         arr_x[i] = x0 + i * dx;
  409.     }
  410.  
  411.     //Заполнение массива с координатами z
  412.     for (int i = 0; i <= Tess_N; i++) {
  413.         arr_z[i] = z0 + i * dz;
  414.     }
  415.  
  416.     /*Заполнение итогового массива с вершинами*/
  417.     int k = 0;
  418.     for (int j = 0; j <= Tess_N; j++) {
  419.         for (int i = 0; i <= Tess_N; i++) {
  420.             //Координаты
  421.             vertices[k] = arr_x[i];
  422.             k++;
  423.             vertices[k] = arr_z[j];
  424.             k++;
  425.         }
  426.     }
  427.     //for (int x = 0; x <= Tess_N; x++) {
  428.     //  for (int y = 0; y <= Tess_N; y++) {
  429.     //      float f_x = x / (GLfloat)Tess_N;
  430.     //      float f_y = y / (GLfloat)Tess_N;
  431.  
  432.     //      vertices[(x * Tess_N + y) * 2 + 0] = f_x;
  433.     //     
  434.     //      vertices[(x * Tess_N + y) * 2 + 1] = f_y;
  435.  
  436.     //     
  437.     //  }
  438.     //}
  439.  
  440.  
  441.      //Заполняем массив индексов
  442.       k = 0;
  443.     int j = 0;
  444.     while (j < Tess_N) {
  445.         for (int i = 0; i <= Tess_N; i++) {
  446.             indices[k] = getNumVertex(j, i, Tess_N);
  447.             k++;
  448.             indices[k] = getNumVertex(j + 1, i, Tess_N);
  449.             k++;
  450.         }
  451.         if (j < Tess_N - 1) {
  452.             indices[k] = getNumVertex(j + 1, Tess_N, Tess_N);
  453.             k++;
  454.         }
  455.         j++;
  456.         if (j < Tess_N) {
  457.             for (int i = Tess_N; i >= 0; i--) {
  458.                 indices[k] = getNumVertex(j, i, Tess_N);
  459.                 k++;
  460.                 indices[k] = getNumVertex(j + 1, i, Tess_N);
  461.                 k++;
  462.             }
  463.             if (j < Tess_N - 1) {
  464.                 indices[k] = getNumVertex(j + 1, 0, Tess_N);
  465.                 k++;
  466.             }
  467.             j++;
  468.         }
  469.     }
  470.     /*for (int x = 0; x < Tess_N; x++) {
  471.         for (int y = 0; y < Tess_N ; y++) {
  472.             indices[(x * (Tess_N - 1) + y) * 2 * 3 + 0] = (x + 0) * Tess_N + y + 0;
  473.             indices[(x * (Tess_N - 1) + y) * 2 * 3 + 1] = (x + 1) * Tess_N + y + 1;
  474.             indices[(x * (Tess_N - 1) + y) * 2 * 3 + 2] = (x + 1) * Tess_N + y + 0;
  475.  
  476.             indices[(x * (Tess_N - 1) + y) * 2 * 3 + 3] = (x + 0) * Tess_N + y + 0;
  477.             indices[(x * (Tess_N - 1) + y) * 2 * 3 + 4] = (x + 0) * Tess_N + y + 1;
  478.             indices[(x * (Tess_N - 1) + y) * 2 * 3 + 5] = (x + 1) * Tess_N + y + 1;
  479.         }
  480.     }*/
  481. }
  482. bool createModel() {
  483.     GLint arr_vertex_size = (Tess_N+1)  * (Tess_N +1)  * 2; //Размерность одномерного массива с вершинами
  484.     GLint arr_index_size = 2 * (Tess_N + 1) * Tess_N + (Tess_N - 1); //Размерность одномерного массива с индексами
  485.  
  486.    
  487.     GLfloat* vertices = (GLfloat*)malloc(arr_vertex_size * sizeof(GLfloat));; //Создали массив с координатами вершин x, y, z
  488.     GLuint* indices = (GLuint*)malloc(
  489.         arr_index_size * sizeof(GLuint)
  490.     ); //Создали массив с индексами обхода
  491.  
  492.     /*for (int i = 0; i < n; i++) {
  493.         for (int j = 0; j < n; j++) {
  494.             GLfloat x = (GLfloat)i / n;
  495.             GLfloat z = (GLfloat)j / n;
  496.             vertices[(i * n + j) * 2] = x;
  497.             vertices[(i * n + j) * 2 + 1] = z;
  498.         }
  499.     }
  500.     */
  501.     generateMesh(vertices, indices, Tess_N);
  502.  
  503.     glGenVertexArrays(1, &g_model.vao);
  504.     glBindVertexArray(g_model.vao);
  505.  
  506.     glGenBuffers(1, &g_model.vbo);
  507.     glBindBuffer(GL_ARRAY_BUFFER, g_model.vbo);
  508.     glBufferData(GL_ARRAY_BUFFER, arr_vertex_size * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
  509.  
  510.     glGenBuffers(1, &g_model.ibo);
  511.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_model.ibo);
  512.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, arr_index_size * sizeof(GLint), indices, GL_STATIC_DRAW);
  513.  
  514.     g_model.indexCount = arr_index_size;
  515.  
  516.     glEnableVertexAttribArray(0);
  517.     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (const GLvoid*)0);
  518.     /*delete(indices);
  519.     delete(vertices);*/
  520.     free(indices);
  521.     free(vertices);
  522.  
  523.     return g_model.vbo != 0 && g_model.ibo != 0 && g_model.vao != 0;
  524. }
  525.  
  526. bool init() {
  527.     // Set initial color of color buffer to white.
  528.     glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  529.  
  530.     glEnable(GL_DEPTH_TEST);
  531.  
  532.     return createShaderProgram() && createModel();
  533. }
  534.  
  535. void reshape(GLFWwindow* window, int width, int height) {
  536.     glViewport(0, 0, width, height);
  537. }
  538. float max(float a, float b) {
  539.     return a > b ? a : b;
  540. }
  541. void draw(GLfloat delta_draw)
  542. { // Clear color buffer.
  543.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  544.  
  545.     glUseProgram(g_shaderProgram);
  546.     glBindVertexArray(g_model.vao);
  547.     /*float fov = pi<float>()/4;
  548.     float width = 4.0f;
  549.     float height = 3.0f;
  550.     float n = x0;
  551.     float f = abs(x0);
  552.     float r = n * tanf(fov / 2.0f);
  553.     float l = -r;
  554.     float t = n*(width / height)* tanf(fov / 2.0f);
  555.     float b = -t;
  556.     MyMatrix Projection;
  557.     Projection.Projection( n, r, t, l, b, f);
  558.  
  559.     for (int i = 0; i < 16; i++)
  560.     {
  561.         cout << Projection.get()[i] << endl;
  562.     }cout << endl;*/
  563.  
  564.     /*Проекционная матрица: 45 градусов, соотношение 4:3*/
  565.     mat4 Projection = perspective(radians(45.0f), 4.0f / 3.0f, x0, abs(x0));
  566.     for (int i = 0; i < 4; i++) {
  567.         for (int j = 0; j < 4; j++) {
  568.             std::cout << Projection[j][i] << " ";
  569.         }
  570.         std::cout << std::endl;
  571.     }
  572.    
  573.  
  574.    
  575.     MyMatrix R;
  576.     if (glfwGetKey(g_window, GLFW_KEY_LEFT) || glfwGetKey(g_window, GLFW_KEY_RIGHT)) {
  577.         /*ModelObj = rotate(ModelObj, delta_draw, vec3(0.0, 1.0, 0.0));*/
  578.         R.rotate(delta_draw, 0, 1, 0);
  579.         *M =R*(*M)   ;
  580.  
  581.     }
  582.     else if (glfwGetKey(g_window, GLFW_KEY_UP) || glfwGetKey(g_window, GLFW_KEY_DOWN))
  583.     {
  584.         /* ModelObj = rotate(ModelObj, delta_draw, vec3(0.0, 0.0, 1.0));*/
  585.         R.rotate(delta_draw, 0, 0, 1);
  586.         *M = R*(*M)  ;
  587.     }
  588.  
  589.    
  590.  
  591.     //mat4 View = lookAt(
  592.     //    vec3(-5, -5, -5) * x0, //Положение камеры
  593.     //    vec3(0, 0, 0), //Направление камеры в точку
  594.     //    vec3(0, 1, 0)  //Наблюдатель
  595.     //);
  596.  
  597.     /*GLfloat a = delta_draw;*/
  598.  
  599.    
  600.     //mat4 View = lookAt(
  601.     //  vec3(5, 3, 3) * abs(x0), //Положение камеры
  602.     //  vec3(0, 0, 0), //Направление камеры в точку
  603.     //  vec3(0, 1, 0)  //Наблюдатель
  604.     //);
  605.     /*for (int i = 0; i < 4; i++) {
  606.         for (int j = 0; j < 4; j++) {
  607.             std::cout << View[j][i] << " ";
  608.         }
  609.         std::cout << std::endl;
  610.     }*/
  611.     /*cout << endl;
  612.     for (int i = 0; i < 4; i++) {
  613.         for (int j = 0; j < 4; j++) {
  614.             std::cout << ModelObj[j][i] << " ";
  615.         }
  616.         std::cout << std::endl;
  617.     }
  618.     /*cout << endl;*/
  619.     /*MyMatrix V;
  620.     V.View();*/
  621.    
  622.     //////Матрица MV
  623.     //MyMatrix MV = View * (*M);
  624.     ////
  625.     //for (int i = 0; i < 16; i++)
  626.     //{
  627.     //  cout << (*M).get()[i] << endl;
  628.     //}cout << endl;
  629.     /*mat4 MV = View * ModelObj;*/
  630.     /*for (int i = 0; i < 4; i++) {
  631.         for (int j = 0; j < 4; j++) {
  632.             std::cout << MV[j][i] << " ";
  633.         }
  634.         std::cout << std::endl;
  635.     }
  636.     cout << endl;*/
  637.     /*Матрица MVP*/
  638.     MyMatrix MVP =  Projection * (*M);
  639.     for (int i = 0; i < 16; i++)
  640.     {
  641.         cout << MVP.get()[i] << endl;
  642.     }cout << endl;
  643.  
  644.  
  645.     /*mat4 MVP = Projection * MV;
  646.     for (int i = 0; i < 4; i++) {
  647.         for (int j = 0; j < 4; j++) {
  648.             std::cout << MVP[j][i] << " ";
  649.         }
  650.         std::cout << std::endl;
  651.     }*/
  652.    
  653.     //Передача данных в шейдер
  654.     glUniformMatrix4fv(g_uMV, 1, GL_TRUE, (*M).get());
  655.     glUniformMatrix4fv(g_uMVP, 1, GL_TRUE, MVP.get());
  656.     glDrawElements(GL_TRIANGLE_STRIP, g_model.indexCount, GL_UNSIGNED_INT, NULL);
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.     //// Clear color buffer.
  666.     //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  667.  
  668.     //glUseProgram(g_shaderProgram);
  669.     //glBindVertexArray(g_model.vao);
  670.  
  671.     ////Проекционная матрица: 45 градусов, соотношение 4:3
  672.     //mat4 Projection = perspective(radians(45.0f), 4.0f / 3.0f, x0, abs(x0));
  673.     //for (int i = 0; i < 4; i++) {
  674.     //  for (int j = 0; j < 4; j++) {
  675.     //      std::cout << Projection[j][i] << " ";
  676.     //  }
  677.     //  std::cout << std::endl;
  678.     //}
  679.  
  680.  
  681.     //mat4 View = lookAt(
  682.     //  vec3(5, 3, 3) * abs(x0), //Положение камеры
  683.     //  vec3(0, 0, 0), //Направление камеры в точку
  684.     //  vec3(0, 1, 0)  //Наблюдатель
  685.     //);
  686.     //for (int i = 0; i < 4; i++) {
  687.     //  for (int j = 0; j < 4; j++) {
  688.     //      std::cout << View[j][i] << " ";
  689.     //  }
  690.     //  std::cout << std::endl;
  691.     //}
  692.     //GLfloat a = delta_draw;
  693.  
  694.     //if (glfwGetKey(g_window, GLFW_KEY_LEFT) || glfwGetKey(g_window, GLFW_KEY_RIGHT)) {
  695.     //  ModelObj = rotate(ModelObj, delta_draw, vec3(0.0, 1.0, 0.0));
  696.     //}
  697.     //else if (glfwGetKey(g_window, GLFW_KEY_UP) || glfwGetKey(g_window, GLFW_KEY_DOWN))
  698.     //{
  699.     //  ModelObj = rotate(ModelObj, delta_draw, vec3(0.0, 0.0, 1.0));
  700.     //}
  701.  
  702.     ////Матрица MV
  703.     //mat4 MV = View * ModelObj;
  704.     //for (int i = 0; i < 4; i++) {
  705.     //  for (int j = 0; j < 4; j++) {
  706.     //      std::cout << MV[j][i] << " ";
  707.     //  }
  708.     //  std::cout << std::endl;
  709.     //}
  710.     ////Матрица MVP
  711.     //mat4 MVP = Projection * MV;
  712.     //for (int i = 0; i < 4; i++) {
  713.     //  for (int j = 0; j < 4; j++) {
  714.     //      std::cout << MVP[j][i] << " ";
  715.     //  }
  716.     //  std::cout << std::endl;
  717.     //}
  718.  
  719.     ////Передача данных в шейдер
  720.     //glUniformMatrix4fv(g_uMV, 1, GL_FALSE, &MV[0][0]);
  721.     //glUniformMatrix4fv(g_uMVP, 1, GL_FALSE, &MVP[0][0]);
  722.     //glDrawElements(GL_TRIANGLE_STRIP, g_model.indexCount, GL_UNSIGNED_INT, NULL);
  723. }
  724.  
  725. void cleanup()
  726. {
  727.     if (g_shaderProgram != 0)
  728.         glDeleteProgram(g_shaderProgram);
  729.     if (g_model.vbo != 0)
  730.         glDeleteBuffers(1, &g_model.vbo);
  731.     if (g_model.ibo != 0)
  732.         glDeleteBuffers(1, &g_model.ibo);
  733.     if (g_model.vao != 0)
  734.         glDeleteVertexArrays(1, &g_model.vao);
  735. }
  736.  
  737. bool initOpenGL()
  738. {
  739.     // Initialize GLFW functions.
  740.     if (!glfwInit())
  741.     {
  742.         cout << "Failed to initialize GLFW" << endl;
  743.         return false;
  744.     }
  745.  
  746.     // Request OpenGL 3.3 without obsoleted functions.
  747.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  748.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  749.     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
  750.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  751.  
  752.     // Create window.
  753.     g_window = glfwCreateWindow(800, 600, "OpenGL Test", NULL, NULL);
  754.     if (g_window == NULL)
  755.     {
  756.         cout << "Failed to open GLFW window" << endl;
  757.         glfwTerminate();
  758.         return false;
  759.     }
  760.  
  761.     // Initialize OpenGL context with.
  762.     glfwMakeContextCurrent(g_window);
  763.  
  764.     // Set internal GLEW variable to activate OpenGL core profile.
  765.     glewExperimental = true;
  766.  
  767.     // Initialize GLEW functions.
  768.     if (glewInit() != GLEW_OK)
  769.     {
  770.         cout << "Failed to initialize GLEW" << endl;
  771.         return false;
  772.     }
  773.  
  774.     // Ensure we can capture the escape key being pressed.
  775.     glfwSetInputMode(g_window, GLFW_STICKY_KEYS, GL_TRUE);
  776.  
  777.     // Set callback for framebuffer resizing event.
  778.     glfwSetFramebufferSizeCallback(g_window, reshape);
  779.  
  780.     return true;
  781. }
  782.  
  783. void tearDownOpenGL()
  784. {
  785.     // Terminate GLFW.
  786.     glfwTerminate();
  787. }
  788.  
  789. int main()
  790. {
  791.     //cout << Tess_N << ", " << x0 << ", " << dx;
  792.     // Initialize OpenGL
  793.     if (!initOpenGL())
  794.         return -1;
  795.     MyMatrix T;
  796.     T.translation(-15, 0, 40);
  797.     MyMatrix S;
  798.     float x = x0;
  799.     float z = z0;
  800.     MyMatrix  R;
  801.     S.scale(1/40.0f, 1, 1 / 40.0f);
  802.  
  803.     R.rotate(radians(10.0), 1, 0, 0);
  804.  
  805.  
  806.     (*M) =  T * S*(*M);
  807.     // Initialize graphical resources.
  808.     bool isOk = init();
  809.  
  810.     if (isOk)
  811.     {
  812.         GLfloat lastTime = glfwGetTime();
  813.  
  814.         // Main loop until window closed or escape pressed.
  815.         while (glfwGetKey(g_window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(g_window) == 0)
  816.         {
  817.             GLfloat currentTime = glfwGetTime();
  818.             GLfloat deltaTime = GLfloat(currentTime - lastTime);
  819.             lastTime = currentTime;
  820.  
  821.             GLfloat delta = 0;
  822.             GLfloat angle = 200.0;
  823.             if (glfwGetKey(g_window, GLFW_KEY_LEFT) || glfwGetKey(g_window, GLFW_KEY_UP)) {
  824.                 delta = radians(angle) * deltaTime;
  825.             }
  826.             else if (glfwGetKey(g_window, GLFW_KEY_RIGHT) || glfwGetKey(g_window, GLFW_KEY_DOWN)) {
  827.                 delta = -radians(angle) * deltaTime;
  828.             }
  829.             draw(delta);
  830.             // Swap buffers.
  831.             glfwSwapBuffers(g_window);
  832.             // Poll window events.
  833.             glfwPollEvents();
  834.         }
  835.     }
  836.  
  837.     // Cleanup graphical resources.
  838.     cleanup();
  839.  
  840.     // Tear down OpenGL.
  841.     tearDownOpenGL();
  842.     /*system("pause");*/
  843.     return isOk ? 0 : -1;
  844. }
  845.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement