BorrowTheProgrammer

lab2_comp_graph

Apr 4th, 2022 (edited)
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.14 KB | None | 0 0
  1. #include <windows.h>        // Заголовочный файл для Windows
  2. #include <gl\gl.h>          // Заголовочный файл для OpenGL32 библиотеки
  3. #include <gl\glu.h>         // Заголовочный файл для GLu32 библиотеки
  4. #include "gl\glaux.h"       // Заголовочный файл для GLaux библиотеки
  5.  
  6. #pragma comment(lib, "legacy_stdio_definitions.lib")
  7.  
  8. static HGLRC hRC;       // Постоянный контекст рендеринга
  9. static HDC hDC;         // Приватный контекст устройства GDI
  10.  
  11. GLfloat xrot;           // Вращение X
  12. GLfloat yrot;           // Y
  13. GLfloat zrot;           // Z  
  14.  
  15. GLuint  texture[1];         // Место для одной текстуры
  16.  
  17. BOOL    keys[256];      // Массив для процедуры обработки клавиатуры
  18.  
  19. // Загрузка картинки и конвертирование в текстуру
  20. GLvoid LoadGLTextures()
  21. {
  22.     // Загрузка картинки
  23.     AUX_RGBImageRec *texture1;
  24.     texture1 = auxDIBImageLoad("Data/CRATE.bmp");
  25.     // Создание текстуры
  26.     glGenTextures(1, &texture[0]);
  27.     glBindTexture(GL_TEXTURE_2D, texture[0]);
  28.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  29.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  30.     glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
  31. }
  32.  
  33. GLvoid InitGL(GLsizei Width, GLsizei Height)    // Вызвать после создания окна GL
  34. {
  35.     LoadGLTextures();           // Загрузка текстур
  36.     glEnable(GL_TEXTURE_2D);    // Разрешение наложение текстуры
  37.  
  38.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  39.                             // Очистка экрана в черный цвет
  40.     glClearDepth(1.0);      // Разрешить очистку буфера глубины
  41.     glDepthFunc(GL_LESS);   // Тип теста глубины
  42.     glEnable(GL_DEPTH_TEST);// разрешить тест глубины
  43.     glShadeModel(GL_SMOOTH);// разрешить плавное цветовое сглаживание
  44.     glMatrixMode(GL_PROJECTION);// Выбор матрицы проекции
  45.     glLoadIdentity();       // Сброс матрицы проекции
  46.     gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
  47.                             // Вычислить соотношение геометрических размеров для окна
  48.     glMatrixMode(GL_MODELVIEW);// Выбор матрицы просмотра модели
  49. }
  50.  
  51. GLvoid ReSizeGLScene(GLsizei Width, GLsizei Height)
  52. {
  53.     if (Height==0)      // Предотвращение деления на ноль, если окно слишком мало
  54.         Height=1;
  55.  
  56.     glViewport(0, 0, Width, Height);
  57.         // Сброс текущей области вывода и перспективных преобразований
  58.  
  59.     glMatrixMode(GL_PROJECTION);// Выбор матрицы проекций
  60.     glLoadIdentity();           // Сброс матрицы проекции
  61.  
  62.     gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
  63.         // Вычисление соотношения геометрических размеров для окна
  64.     glMatrixMode(GL_MODELVIEW); // Выбор матрицы просмотра модели
  65. }
  66.  
  67. GLvoid DrawGLScene(GLvoid)
  68. {
  69.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  70.     glLoadIdentity();
  71.     glTranslatef(0.0f,0.0f, -70.0f);
  72.     glRotatef(xrot, 1.0f,0.0f,0.0f);        // Вращение по оси X
  73.     glRotatef(yrot, 0.0f,1.0f,0.0f);            // Вращение по оси Y
  74.     glRotatef(zrot, 0.0f,0.0f,1.0f);            // Вращение по оси Z
  75.     glBindTexture(GL_TEXTURE_2D, texture[0]);
  76.  
  77.     glBegin(GL_TRIANGLES);                              // Start Drawing A Triangle
  78.  
  79.     // треугольник 1
  80.     glTexCoord2f(0.1875f, 0.0f); glVertex3f(-5.0f, -6.8f, 0.0f);
  81.     glTexCoord2f(0.3875f, 0.6351f); glVertex3f(-1.8f, 2.6f, 0.0f);
  82.     glTexCoord2f(1.0f, 0.6351f); glVertex3f(8.0f, 2.6f, 0.0f);
  83.  
  84.     // треугольник 2
  85.     glTexCoord2f(0.5f, 0.2162f); glVertex3f(0.0f, -3.2f, 0.0f);
  86.     glTexCoord2f(0.6875f, 0.3918f); glVertex3f(3.0f, -1.0f, 0.0f);
  87.     glTexCoord2f(0.8125f, 0.0f); glVertex3f(5.0f, -6.8f, 0.0f);
  88.  
  89.     // треугольник 3
  90.     glTexCoord2f(0.3875f, 0.6351f); glVertex3f(-1.8f, 2.6f, 0.0f);
  91.     glTexCoord2f(0.5f, 1.0f); glVertex3f(0.0f, 8.0f, 0.0f);
  92.     glTexCoord2f(0.6125f, 0.6351f); glVertex3f(1.8f, 2.6f, 0.0f);
  93.    
  94.     // треугольник 4
  95.     glTexCoord2f(0.0f, 0.6351f); glVertex3f(-8.0f, 2.6f, 0.0f);
  96.     glTexCoord2f(0.3875f, 0.6351f); glVertex3f(-1.8f, 2.6f, 0.0f);
  97.     glTexCoord2f(0.3125f, 0.3918f); glVertex3f(-3.0f, -1.0f, 0.0f);
  98.    
  99.     glEnd();
  100.  
  101.     //  для задней грани
  102.  
  103.     glBegin(GL_TRIANGLES);
  104.  
  105.     // треугольник 1
  106.     glVertex3f(-5.0f, -6.8f, 6.0f);
  107.     glVertex3f(-1.8f, 2.6f, 6.0f);
  108.     glVertex3f(8.0f, 2.6f, 6.0f);
  109.  
  110.     // треугольник 2
  111.     glVertex3f(0.0f, -3.2f, 6.0f);
  112.     glVertex3f(3.0f, -1.0f, 6.0f);
  113.     glVertex3f(5.0f, -6.8f, 6.0f);
  114.  
  115.     // треугольник 3
  116.     glVertex3f(-1.8f, 2.6f, 6.0f);
  117.     glVertex3f(0.0f, 8.0f, 6.0f);
  118.     glVertex3f(1.8f, 2.6f, 6.0f);
  119.  
  120.     // треугольник 4
  121.     glVertex3f(-8.0f, 2.6f, 6.0f);
  122.     glVertex3f(-1.8f, 2.6f, 6.0f);
  123.     glVertex3f(-3.0f, -1.0f, 6.0f);
  124.    
  125.     glEnd();
  126.  
  127.     // стенки звезды (боковые грани) для создания объема
  128.  
  129.     glBegin(GL_QUADS);
  130.    
  131.     glVertex3f(0.0f, 8.0f, 0.0f);
  132.     glVertex3f(0.0f, 8.0f, 6.0f);
  133.     glVertex3f(1.8f, 2.6f, 6.0f);
  134.     glVertex3f(1.8f, 2.6f, 0.0f);
  135.  
  136.     glVertex3f(8.0f, 2.6f, 0.0f);
  137.     glVertex3f(8.0f, 2.6f, 6.0f);
  138.     glVertex3f(1.8f, 2.6f, 6.0f);
  139.     glVertex3f(1.8f, 2.6f, 0.0f);
  140.  
  141.     glVertex3f(8.0f, 2.6f, 0.0f);
  142.     glVertex3f(8.0f, 2.6f, 6.0f);
  143.     glVertex3f(3.0f, -1.0f, 6.0f);
  144.     glVertex3f(3.0f, -1.0f, 0.0f);
  145.  
  146.     glVertex3f(3.0f, -1.0f, 0.0f);
  147.     glVertex3f(3.0f, -1.0f, 6.0f);
  148.     glVertex3f(5.0f, -6.8f, 6.0f);
  149.     glVertex3f(5.0f, -6.8f, 0.0f);
  150.  
  151.     glVertex3f(5.0f, -6.8f, 0.0f);
  152.     glVertex3f(5.0f, -6.8f, 6.0f);
  153.     glVertex3f(0.0f, -3.2f, 6.0f);
  154.     glVertex3f(0.0f, -3.2f, 0.0f);
  155.  
  156.     glVertex3f(0.0f, -3.2f, 0.0f);
  157.     glVertex3f(0.0f, -3.2f, 6.0f);
  158.     glVertex3f(-5.0f, -6.8f, 6.0f);
  159.     glVertex3f(-5.0f, -6.8f, 0.0f);
  160.  
  161.     glVertex3f(-5.0f, -6.8f, 0.0f);
  162.     glVertex3f(-5.0f, -6.8f, 6.0f);
  163.     glVertex3f(-3.0f, -1.0f, 6.0f);
  164.     glVertex3f(-3.0f, -1.0f, 0.0f);
  165.  
  166.     glVertex3f(-3.0f, -1.0f, 0.0f);
  167.     glVertex3f(-3.0f, -1.0f, 6.0f);
  168.     glVertex3f(-8.0f, 2.6f, 6.0f);
  169.     glVertex3f(-8.0f, 2.6f, 0.0f);
  170.  
  171.     glVertex3f(-8.0f, 2.6f, 0.0f);
  172.     glVertex3f(-8.0f, 2.6f, 6.0f);
  173.     glVertex3f(-1.8f, 2.6f, 6.0f);
  174.     glVertex3f(-1.8f, 2.6f, 0.0f);
  175.  
  176.     glVertex3f(-1.8f, 2.6f, 0.0f);
  177.     glVertex3f(-1.8f, 2.6f, 6.0f);
  178.     glVertex3f(0.0f, 8.0f, 6.0f);
  179.     glVertex3f(0.0f, 8.0f, 0.0f);
  180.  
  181.  
  182.     glEnd();
  183.  
  184. //glEnd();
  185.     //xrot+=1.3f;           // Ось вращения X
  186.     yrot+=1.2f;             // Ось вращения Y
  187.     zrot+=1.4f;             // Ось вращения Z
  188.  
  189.     Sleep(16);
  190. }
  191.  
  192. LRESULT CALLBACK WndProc(
  193.                 HWND    hWnd,
  194.                 UINT    message,
  195.                 WPARAM  wParam,
  196.                 LPARAM  lParam)
  197. {
  198.     RECT    Screen;     // используется позднее для размеров окна
  199.     GLuint  PixelFormat;
  200.     static  PIXELFORMATDESCRIPTOR pfd=
  201.     {
  202.         sizeof(PIXELFORMATDESCRIPTOR)// Размер этой структуры
  203.         1,              // Номер версии (?)
  204.         PFD_DRAW_TO_WINDOW |// Формат для Окна
  205.         PFD_SUPPORT_OPENGL |// Формат для OpenGL
  206.         PFD_DOUBLEBUFFER,// Формат для двойного буфера
  207.         PFD_TYPE_RGBA,  // Требуется RGBA формат
  208.         16,             // Выбор 16 бит глубины цвета
  209.         0, 0, 0, 0, 0, 0,// Игнорирование цветовых битов (?)
  210.         0,              // нет буфера прозрачности
  211.         0,              // Сдвиговый бит игнорируется (?)
  212.         0,              // Нет буфера аккумуляции
  213.         0, 0, 0, 0,     // Биты аккумуляции игнорируются (?)
  214.         16,             // 16 битный Z-буфер (буфер глубины)  
  215.         0,              // Нет буфера траффарета
  216.         0,              // Нет вспомогательных буферов (?)
  217.         PFD_MAIN_PLANE, // Главный слой рисования
  218.         0,              // Резерв (?)
  219.         0, 0, 0         // Маски слоя игнорируются (?)
  220.     };
  221.     switch (message)    // Тип сообщения
  222.     {
  223.         case WM_CREATE:
  224.         hDC = GetDC(hWnd);  // Получить контекст устройства для окна
  225.         PixelFormat = ChoosePixelFormat(hDC, &pfd);
  226.             // Найти ближайшее совпадение для нашего формата пикселов
  227.         if (!PixelFormat)
  228.         {
  229.             MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);
  230.             PostQuitMessage(0);
  231.             // Это сообщение говорит, что программа должна завершится
  232.             break;  // Предтовращение повтора кода
  233.         }
  234.         if(!SetPixelFormat(hDC,PixelFormat,&pfd))
  235.         {
  236.             MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);
  237.             PostQuitMessage(0);
  238.             break;
  239.         }
  240.         hRC = wglCreateContext(hDC);
  241.         if(!hRC)
  242.         {
  243.             MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);
  244.             PostQuitMessage(0);
  245.             break;
  246.         }
  247.         if(!wglMakeCurrent(hDC, hRC))
  248.         {
  249.             MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);
  250.             PostQuitMessage(0);
  251.             break;
  252.         }
  253.         GetClientRect(hWnd, &Screen);
  254.         InitGL(Screen.right, Screen.bottom);
  255.         break;
  256.  
  257.         case WM_DESTROY:
  258.         case WM_CLOSE:
  259.         ChangeDisplaySettings(NULL, 0);
  260.  
  261.         wglMakeCurrent(hDC,NULL);
  262.         wglDeleteContext(hRC);
  263.         ReleaseDC(hWnd,hDC);
  264.  
  265.         PostQuitMessage(0);
  266.         break;
  267.  
  268.         case WM_KEYDOWN:
  269.         keys[wParam] = TRUE;
  270.         break;
  271.  
  272.         case WM_KEYUP:
  273.         keys[wParam] = FALSE;
  274.         break;
  275.  
  276.         case WM_SIZE:
  277.         ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
  278.         break;
  279.  
  280.         default:
  281.     return (DefWindowProc(hWnd, message, wParam, lParam));
  282.     }
  283.     return (0);
  284. }
  285.  
  286. int WINAPI WinMain(
  287.         HINSTANCE hInstance,
  288.         HINSTANCE hPrevInstance,
  289.         LPSTR lpCmdLine,
  290.         int nCmdShow)
  291. {
  292.     MSG     msg;    // Структура сообщения Windows
  293.     WNDCLASS    wc; // Структура класса Windows для установки типа окна
  294.     HWND        hWnd;// Сохранение дискриптора окна
  295.  
  296.     wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  297.     wc.lpfnWndProc      = (WNDPROC) WndProc;
  298.     wc.cbClsExtra       = 0;
  299.     wc.cbWndExtra       = 0;
  300.     wc.hInstance        = hInstance;
  301.     wc.hIcon            = NULL;
  302.     wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
  303.     wc.hbrBackground    = NULL;
  304.     wc.lpszMenuName     = NULL;
  305.     wc.lpszClassName    = "OpenGL WinClass";
  306.  
  307.     if(!RegisterClass(&wc))
  308.     {
  309.     MessageBox(0,"Failed To Register The Window Class.","Error",MB_OK|MB_ICONERROR);
  310.     return FALSE;
  311.     }
  312.  
  313.     hWnd = CreateWindow(
  314.     "OpenGL WinClass",
  315.     "Jeff Molofee's GL Code Tutorial ... NeHe '99", // Заголовок вверху окна
  316.  
  317.     WS_POPUP |
  318.     WS_CLIPCHILDREN |
  319.     WS_CLIPSIBLINGS,
  320.  
  321.     0, 0,           // Позиция окна на экране
  322.     640, 480,       // Ширина и высота окна
  323.  
  324.     NULL,
  325.     NULL,
  326.     hInstance,
  327.     NULL);
  328.  
  329.     if(!hWnd)
  330.     {
  331.     MessageBox(0,"Window Creation Error.","Error",MB_OK|MB_ICONERROR);
  332.         return FALSE;
  333.     }
  334.  
  335.     DEVMODE dmScreenSettings;           // Режим работы
  336.  
  337.     memset(&dmScreenSettings, 0, sizeof(DEVMODE));  // Очистка для хранения установок
  338.     dmScreenSettings.dmSize = sizeof(DEVMODE);      // Размер структуры Devmode
  339.     dmScreenSettings.dmPelsWidth    = 640;          // Ширина экрана
  340.     dmScreenSettings.dmPelsHeight   = 480;          // Высота экрана
  341.     dmScreenSettings.dmFields   = DM_PELSWIDTH | DM_PELSHEIGHT; // Режим Пиксела
  342.     ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
  343.     // Переключение в полный экран
  344.  
  345.     ShowWindow(hWnd, SW_SHOW);
  346.     UpdateWindow(hWnd);
  347.     SetFocus(hWnd);
  348.  
  349.     while (1)
  350.     {
  351.         // Обработка всех сообщений
  352.         while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
  353.         {
  354.             if (GetMessage(&msg, NULL, 0, 0))
  355.             {
  356.                 TranslateMessage(&msg);
  357.                 DispatchMessage(&msg);
  358.             }
  359.             else
  360.             {
  361.                 return TRUE;
  362.             }
  363.         }
  364.  
  365.         DrawGLScene();              // Нарисовать сцену
  366.         SwapBuffers(hDC);           // Переключить буфер экрана
  367.         if (keys[VK_ESCAPE]) SendMessage(hWnd,WM_CLOSE,0,0);    // Если ESC - выйти
  368.     }
  369. }
  370.  
  371.  
Add Comment
Please, Sign In to add comment