Xom9ik

Lab_11/15var (IV semester) CG

May 26th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.09 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include "glut.h"
  4. #include <stdio.h>
  5. #include <malloc.h>
  6.  
  7. static int w = 0, h = 0;
  8. static float rtrX = 20.0f;
  9. static float rtrY = 20.0f;
  10. static float rtrZ = 20.0f;
  11. #define GL_BGR 0x80E0
  12. GLuint  textura_id1;
  13. GLuint  textura_id2;
  14. GLuint  textura_id3;
  15. int sample = 1;
  16. int angle = 0;
  17. struct textura_struct{
  18.     int W;
  19.     int H;
  20.     unsigned char *Image;
  21. }get_textura;
  22. int LoadTexture(char *FileName, int number)
  23. {
  24.     FILE *F;
  25.     if ((F = fopen(FileName, "rb")) == NULL)
  26.         return 0;
  27.     /*Перемещаемся в bmp-файле на нужную позицию, и считываем ширину и длинну */
  28.     fseek(F, 18, SEEK_SET);
  29.     fread(&(get_textura.W), 2, 1, F);
  30.     fseek(F, 2, SEEK_CUR);
  31.     fread(&(get_textura.H), 2, 1, F);
  32.  
  33.     /* Выделяем память под изображение. Если память не выделилась, закрываем файл и выходим с ошибкой */
  34.     if ((get_textura.Image = (unsigned char *)malloc(sizeof(unsigned char)* 3 * get_textura.W * get_textura.H)) == NULL)
  35.     {
  36.         fclose(F);
  37.         return 0;
  38.     }
  39.     /* Считываем изображение в память по 3 бита, то бишь RGB для каждого пикселя */
  40.     fseek(F, 30, SEEK_CUR);
  41.     fread(get_textura.Image, 3, get_textura.W * get_textura.H, F);
  42.  
  43.     if (number == 1) {
  44.         glGenTextures(1, &textura_id1);
  45.         glBindTexture(GL_TEXTURE_2D, textura_id1);
  46.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  47.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  48.     }
  49.     if (number == 2) {
  50.         glGenTextures(1, &textura_id2);
  51.         glBindTexture(GL_TEXTURE_2D, textura_id2);
  52.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  53.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  54.     }
  55.     if (number == 3) {
  56.         glGenTextures(1, &textura_id3);
  57.         glBindTexture(GL_TEXTURE_2D, textura_id3);
  58.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  59.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  60.     }
  61.     gluBuild2DMipmaps(GL_TEXTURE_2D, 3, get_textura.W, get_textura.H, GL_BGR, GL_UNSIGNED_BYTE, get_textura.Image);
  62.     free(get_textura.Image);
  63.     fclose(F);
  64.     return 1;
  65. }
  66.  
  67. void Init(void) {
  68.     glShadeModel(GL_SMOOTH);            // Разрешить плавное цветовое сглаживание
  69.     //rgb(186,157,249)
  70.     glClearColor(0.2f, 0.2f, 0.2f, 0.0f);          // Очистка экрана в черный цвет
  71.     glClearDepth(1.0f);              // Разрешить очистку буфера глубины
  72.     glEnable(GL_DEPTH_TEST);            // Разрешить тест глубины
  73.     glDepthFunc(GL_LEQUAL);            // Тип теста глубины
  74.     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);      // Улучшение в вычислении перспективы
  75.  
  76.     GLfloat LightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f }; // Значения фонового света
  77.  
  78.     glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);    // Установка Фонового Света
  79.     GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // Значения диффузного света ( НОВОЕ )
  80.  
  81.     glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);    // Установка Диффузного Света
  82.     GLfloat LightPosition[] = { 0.0f, 0.0f, 2.0f, 1.0f };     // Позиция света
  83.     glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);   // Позиция света
  84.  
  85.     glEnable(GL_LIGHT1); // Разрешение источника света номер один
  86.    
  87.     glEnable(GL_LIGHTING); // включаем освещение
  88. }
  89. void DrawGLScene(void){
  90.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Очистка экрана и буфера глубины
  91.     glLoadIdentity();                               // Сброс просмотра
  92.     glEnable(GL_TEXTURE_2D);
  93.     glBindTexture(GL_TEXTURE_2D, textura_id1);
  94.     glTranslatef(-4.0f, 0.0f, -9.0f);                 // Сдвиг влево и вглубь экрана
  95.     glRotatef(rtrY, 0.0f, 1.0f, 0.0f);                 // Вращение по оси Y
  96.     glRotatef(rtrX, 1.0f, 0.0f, 0.0f);                  //Вращение по оси X
  97.     glRotatef(rtrZ, 0.0f, 0.0f, 1.0f);                  //Вращение по оси Z
  98.     glBegin(GL_TRIANGLES);                          // Начало рисования TRIANGLES
  99.  
  100.     glNormal3f(0.0f, 0.0f, 1.0f);     // Нормаль указывает на наблюдателя
  101.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -1.0f, 1.0f); // Точка 1 (Перед)
  102.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Точка 2 (Перед)
  103.     glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); // Точка 3 (Перед)
  104.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -1.0f, -2.0f);                  // Низ треугольника (Сзади)
  105.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -2.0f);                 // Лево треугольника (Сзади)
  106.     glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -2.0f);                 // Право треугольника (Сзади)
  107.     glEnd();
  108.  
  109.     glBegin(GL_QUADS);                          // Начало рисования QUADS
  110.     glColor3ub(184, 216, 2);                      // Rio Grand
  111.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Верх право квадрата (Левая)
  112.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -2.0f); // Верх лево
  113.     glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, -1.0f, -2.0f); // Низ лево
  114.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -1.0f, 1.0f); // Низ право
  115.  
  116.     glColor3ub(2, 184, 216);                      // Spain Sky
  117.     glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f); // Верх право квадрата (Право)
  118.     glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -2.0f); // Верх лево
  119.     glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, -1.0f, -2.0f); // Низ лево
  120.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -1.0f, 1.0f); // Низ право
  121.  
  122.     glColor3ub(155, 40, 255);                      // Veronica
  123.     glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f); // Верх право квадрата (Правая крышка)
  124.     glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -2.0f); // Верх лево
  125.     glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 0.0f, -2.0f); // Низ лево
  126.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 1.0f); // Низ право
  127.  
  128.     glColor3ub(119, 40, 255);                      // Blue Violet
  129.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Верх право квадрата (Левая крышка)
  130.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -2.0f); // Верх лево
  131.     glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 0.0f, -2.0f); // Низ лево
  132.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 1.0f); // Низ право
  133.  
  134.     glEnd();
  135.     glDisable(GL_TEXTURE_2D);
  136.     ///////////////////////////////////////////////////////
  137.    
  138.     glLoadIdentity();
  139.     glEnable(GL_TEXTURE_2D);
  140.     glBindTexture(GL_TEXTURE_2D, textura_id2);
  141.     glTranslatef(0.0f, 0.0f, -9.0f);                 // Сдвиг влево и вглубь экрана
  142.     glRotatef(rtrY, 0.0f, 1.0f, 0.0f);                 // Вращение по оси Y
  143.     glRotatef(rtrX, 1.0f, 0.0f, 0.0f);                  //Вращение по оси X
  144.     glRotatef(rtrZ, 0.0f, 0.0f, 1.0f);                  //Вращение по оси Z
  145.  
  146.     glBegin(GL_QUADS); // Рисуем куб
  147.  
  148.     glColor3ub(237, 90, 71); // Carmine
  149.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 1.0f, -1.0f); // Право верх квадрата (Верх)
  150.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 1.0f, -3.0f); // Лево верх
  151.     glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 1.0f, -3.0f); // Лево низ
  152.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, -1.0f); // Право низ
  153.  
  154.     glColor3ub(213, 238, 23); // Arctic Lime
  155.     glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Верх право квадрата (Низ
  156.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Верх лево
  157.     glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Низ лево
  158.     glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Низ право
  159.  
  160.     glColor3ub(236, 179, 43); // Fuel Yellow
  161.     glTexCoord2f(1.0f, 0.0f); glVertex3f(0.0f, 1.0f, -1.0f); // Верх право квадрата (Перед)
  162.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 1.0f, -1.0f); // Верх лево
  163.     glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Низ лево
  164.     glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Низ право
  165.  
  166.     glColor3ub(229, 153, 142); //Tonis
  167.     glTexCoord2f(1.0f, 0.0f);  glVertex3f(1.0f, -1.0f, -1.0f); // Верх право квадрата (Зад)
  168.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Верх лево
  169.     glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 1.0f, -3.0f); // Низ лево
  170.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, -3.0f); // Низ право
  171.  
  172.     glColor3ub(100, 194, 160); // Tradewind
  173.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 1.0f, -1.0f); // Верх право квадрата (Левая)
  174.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 1.0f, -3.0f); // Верх лево
  175.     glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Низ лево
  176.     glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Низ право
  177.  
  178.     glColor3ub(128, 156, 61); // Sushi
  179.     glTexCoord2f(1.0f, 0.0f); glVertex3f(0.0f, 1.0f, -3.0f); // Верх право квадрата (Право)
  180.     glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, 1.0f, -1.0f); // Верх лево
  181.     glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Низ лево
  182.     glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Низ право
  183.     glEnd();
  184.     glDisable(GL_TEXTURE_2D);
  185.     ///////////////////////////////////////////////////////
  186.     glEnable(GL_TEXTURE_2D);
  187.     glBindTexture(GL_TEXTURE_2D, textura_id3);
  188.     glLoadIdentity();
  189.     glTranslatef(4.0f, 0.0f, -9.0f);                 // Сдвиг влево и вглубь экрана
  190.     glRotatef(rtrY, 0.0f, 1.0f, 0.0f);                 // Вращение по оси Y
  191.     glRotatef(rtrX, 1.0f, 0.0f, 0.0f);                  //Вращение по оси X
  192.     glRotatef(rtrZ, 0.0f, 0.0f, 1.0f);                  //Вращение по оси Z
  193.     glBegin(GL_TRIANGLES);                          // Начало рисования TRIANGLES
  194.  
  195.     glColor3ub(224, 154, 63);                      // Tigers Eye
  196.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f);                  // Верх треугольника (Передняя)
  197.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);                  // Левая точка (Передняя)
  198.     glTexCoord2f(1.0f, 1.0f);  glVertex3f(1.0f, -1.0f, 1.0f);                  // Правая точка (Передняя)
  199.  
  200.     glColor3ub(148, 186, 196);                      // Niagara
  201.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f);                  // Верх треугольника (Правая)
  202.     glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);                  // Лево треугольника (Правая)
  203.     glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);                 // Право треугольника (Правая)
  204.     glColor3ub(158, 166, 122);                      // Green Smoke
  205.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f);                  // Низ треугольника (Сзади)
  206.     glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);                 // Лево треугольника (Сзади)
  207.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);                 // Право треугольника (Сзади)
  208.  
  209.     glColor3ub(215, 80, 63);                      // Flame Pea
  210.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f);                  // Верх треугольника (Левая)
  211.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);                  // Лево треугольника (Левая)
  212.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f);                  // Право треугольника (Левая)
  213.     //нижняя часть
  214.     glColor3ub(148, 186, 196);                      // Niagara
  215.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -3.0f, 0.0f);                  // Верх треугольника (Передняя)
  216.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);                  // Левая точка (Передняя)
  217.     glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f);                  // Правая точка (Передняя)
  218.  
  219.     glColor3ub(224, 154, 63);                      // Tigers Eye
  220.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -3.0f, 0.0f);                  // Верх треугольника (Правая)
  221.     glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);                  // Лево треугольника (Правая)
  222.     glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);                 // Право треугольника (Правая)
  223.     glColor3ub(215, 80, 63);                      // Flame Pea
  224.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -3.0f, 0.0f);                  // Низ треугольника (Сзади)
  225.     glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);                 // Лево треугольника (Сзади)
  226.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);                 // Право треугольника (Сзади)
  227.  
  228.     glColor3ub(158, 166, 122);                      // Green Smoke
  229.     glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -3.0f, 0.0f);                  // Верх треугольника (Левая)
  230.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);                  // Лево треугольника (Левая)
  231.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f);                  // Право треугольника (Левая)
  232.     glEnd();        glFlush();  glDisable(GL_TEXTURE_2D);   glutSwapBuffers();
  233.    
  234. }
  235. void Reshape(int width, int height) {
  236.     w = width;
  237.     h = height;
  238.     glViewport(0, 0, w, h);
  239.     glMatrixMode(GL_PROJECTION);
  240.     glLoadIdentity();
  241.     gluPerspective(70.0f, w / h, 0.1f, 1000);
  242.     glMatrixMode(GL_MODELVIEW);
  243.     glLoadIdentity();
  244.  
  245. }
  246. void keyboard(unsigned char key, int x, int y){
  247.     switch (key) {
  248.     case '1':       rtrY += 10.5f;      glutPostRedisplay();        break;
  249.     case '2':       rtrX += 10.5f;      glutPostRedisplay();        break;
  250.     case '3':       rtrZ += 10.5f;      glutPostRedisplay();        break;
  251.     default:        break;
  252.     }
  253. }
  254. int main(int argc, char *argv[]) {
  255.     glutInit(&argc, argv);
  256.     glutInitWindowSize(1200, 600);
  257.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
  258.     glutCreateWindow("Lab 11");
  259.     glutDisplayFunc(DrawGLScene);
  260.     glutReshapeFunc(Reshape);
  261.     glutKeyboardFunc(keyboard);
  262.     if (LoadTexture((char *)"image1.bmp", 1) != 1){ printf("Не удалось загрузить изображение\n"); }
  263.     if (LoadTexture((char *)"image2.bmp", 2) != 1){ printf("Не удалось загрузить изображение\n"); }
  264.     if (LoadTexture((char *)"image3.bmp", 3) != 1){ printf("Не удалось загрузить изображение\n"); }
  265.     Init();
  266.     glutMainLoop();
  267.  
  268.     return 0;
  269. }
Advertisement
Add Comment
Please, Sign In to add comment