Advertisement
osence

lab6 OpenGL

Oct 25th, 2020
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.08 KB | None | 0 0
  1. #include <GL/glut.h>
  2. #include <math.h>
  3. #include <iostream>
  4. #include <string>
  5. #include <FreeImage.h>
  6.  
  7. #pragma comment(lib,"FreeImage.lib")
  8.  
  9. GLuint gl_texID1;
  10. GLuint gl_texID2;
  11. GLuint gl_texID3;
  12. FIBITMAP* dib(0);
  13. //Свет
  14. float ambient[] = {0.0, 0.0, 0.0, 1.0};
  15. float diffuse[] = { 1.0,1.0,1.0,1.0 };
  16. float lpos[] = { 0.0, 10.0, 0.0, 1.0 };
  17. float black[] = { 0.0, 0.0, 0.0, 1.0 };
  18. //Переменные для поворота мышкой
  19. double angle1 = 0.0f;
  20. double deltaAngle1 = 0.0f;
  21. double angle2 = 0.0f;
  22. double deltaAngle2 = 0.0f;
  23. int xOrigin = 0;
  24. int yOrigin = 0;
  25. bool leftButtonDown = false;
  26. //Переменные для отрисовки круга
  27. GLfloat theta;
  28. GLfloat pi = acos(-1.0);
  29. GLfloat radius = 2.0f; // радиус
  30. GLfloat step = 6.0f; // чем больше шаг тем хуже диск
  31.  
  32. //Переменная отвечающая за развивание флага
  33. GLfloat k = 0.0f;
  34.  
  35. bool openPicture(const char* filename, int count)
  36. {
  37.     FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
  38.     BYTE* bits(0);
  39.     unsigned int width(0), height(0);
  40.     fif = FreeImage_GetFileType(filename, 0);
  41.     if (fif == FIF_UNKNOWN)
  42.         fif = FreeImage_GetFIFFromFilename(filename);
  43.     if (fif == FIF_UNKNOWN)
  44.         return false;
  45.     if (FreeImage_FIFSupportsReading(fif))
  46.         dib = FreeImage_Load(fif, filename);
  47.     if (!dib)
  48.         return false;
  49.     bits = FreeImage_GetBits(dib);
  50.     width = FreeImage_GetWidth(dib);
  51.     height = FreeImage_GetHeight(dib);
  52.     if ((bits == 0) || (width == 0) || (height == 0))
  53.         return false;
  54.     if (count == 1) {
  55.         glGenTextures(1, &gl_texID1);
  56.         glBindTexture(GL_TEXTURE_2D, gl_texID1);
  57.     }
  58.     else if (count == 2) {
  59.         glGenTextures(1, &gl_texID2);
  60.         glBindTexture(GL_TEXTURE_2D, gl_texID2);
  61.     }
  62.     else if (count == 3) {
  63.         glGenTextures(1, &gl_texID3);
  64.         glBindTexture(GL_TEXTURE_2D, gl_texID3);
  65.     }
  66.  
  67.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  68.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  69.  
  70.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
  71.         GL_BGR_EXT, GL_UNSIGNED_BYTE, bits);
  72.     FreeImage_Unload(dib);
  73.     return true;
  74. }
  75.  
  76. void drawCircle(float x, float y, float z, float r, int amountSegments, GLuint gl_texID)
  77. {
  78.     glBindTexture(GL_TEXTURE_2D, gl_texID);
  79.     glBegin(GL_TRIANGLE_FAN);
  80.     if (gl_texID == gl_texID1) glNormal3f(1, 0, 0);
  81.     if (gl_texID == gl_texID3) glNormal3f(-1, 0, 0);
  82.     glTexCoord2f(0.5f, 0.5f); glVertex3f(x, y, z);
  83.     float xbuf = x;
  84.     float ybuf = y;
  85.     for (int i = -1; i < amountSegments; i++)
  86.     {
  87.         x = xbuf + sin(pi * 2 / amountSegments * i)*r;
  88.         y = ybuf + cos(pi * 2 / amountSegments * i)*r;
  89.         if (gl_texID == gl_texID1) glNormal3f(1, 0, 0);
  90.         if (gl_texID == gl_texID3) glNormal3f(-1, 0, 0);
  91.         glTexCoord2f((x-xbuf+1)/2, (y - ybuf + 1) / 2); glVertex3f(x, y, z);
  92.     }
  93.  
  94.     glEnd();
  95. }
  96.  
  97. void drawCan(float x, float y, float z, float r, int amountSegments)
  98. {
  99.     drawCircle(x, y, z, r, amountSegments, gl_texID1);
  100.     drawCircle(x, y, z - 4 * r, r, amountSegments, gl_texID3);
  101.     glBindTexture(GL_TEXTURE_2D, gl_texID2);
  102.     glBegin(GL_QUADS);
  103.     float xbuf = x;
  104.     float ybuf = y;
  105.     for (int i = -1; i < amountSegments; i++)
  106.     {
  107.         x = xbuf + sin(pi * 2 / amountSegments * i)*r;
  108.         y = ybuf + cos(pi * 2 / amountSegments * i)*r;
  109.         float x1 = xbuf + sin(pi * 2 / amountSegments * (i + 1))*r;
  110.         float y1 = ybuf + cos(pi * 2 / amountSegments * (i + 1))*r;
  111.         glNormal3f(x, y, z);    glTexCoord2f(1 - ((i + 1.0f) / amountSegments), 1); glVertex3f(x, y, z);
  112.         glNormal3f(x, y, z-4*r);    glTexCoord2f(1 - ((i + 1.0f) / amountSegments), 0); glVertex3f(x, y, z - 4 * r);
  113.         glNormal3f(x1, y1, z-4*r);    glTexCoord2f(1 - ((i + 2.0f) / amountSegments), 0); glVertex3f(x1, y1, z - 4 * r);
  114.         glNormal3f(x1, y1, z);    glTexCoord2f(1 - ((i + 2.0f) / amountSegments), 1); glVertex3f(x1, y1, z);
  115.        
  116.     }
  117.     glEnd();
  118. }
  119.  
  120. void mouseButton(int button, int state, int x, int y) {
  121.     if (button == GLUT_LEFT_BUTTON) {
  122.         if (state == GLUT_DOWN) {
  123.             xOrigin = x;
  124.             yOrigin = y;
  125.             leftButtonDown = true;
  126.         }
  127.         else {
  128.             leftButtonDown = false;
  129.             angle1 += deltaAngle1;
  130.             angle2 += deltaAngle2;
  131.             deltaAngle1 = 0;
  132.             deltaAngle2 = 0;
  133.         }
  134.     }
  135. }
  136.  
  137. void mouseMove(int x, int y) {
  138.     if (leftButtonDown) {
  139.         deltaAngle1 = (x - xOrigin)*0.5f;
  140.         deltaAngle2 = (y - yOrigin)*0.5f;
  141.  
  142.     }
  143. }
  144.  
  145. void renderScene(void) {
  146.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  147.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  148.     // обнуление трансформации
  149.     glLoadIdentity();
  150.     // установка камеры
  151.     gluLookAt(0.0f, 0.0f, 10.0f,
  152.         0.0f, 0.0f, 0.0f,
  153.         0.0f, 1.0f, 0.0f);
  154.     glRotatef(angle1 + deltaAngle1, 0, 1, 0);
  155.     //glRotatef(angle2 + deltaAngle2, 1, 0, 0);
  156.     glPushMatrix();
  157.     glLoadIdentity();
  158.     glLightfv(GL_LIGHT0, GL_POSITION, lpos);
  159.     glPopMatrix();
  160.     glEnable(GL_TEXTURE_2D);
  161.    
  162.     drawCan(0, 0, 1.5, 1, 40);
  163.     glDisable(GL_TEXTURE_2D);
  164.    
  165.     //glEnable(GL_LIGHTING);
  166.  
  167.     glutSwapBuffers();
  168. }
  169.  
  170. void changeSize(int w, int h) {
  171.     if (h == 0)
  172.         h = 1;
  173.     float ratio = 1.0* w / h;
  174.     // используем матрицу проекции
  175.     glMatrixMode(GL_PROJECTION);
  176.  
  177.     // Reset матрицы
  178.     glLoadIdentity();
  179.  
  180.     // определяем окно просмотра
  181.     glViewport(0, 0, w, h);
  182.  
  183.     // установить корректную перспективу.
  184.     gluPerspective(45, ratio, 1, 1000);
  185.  
  186.     // вернуться к модели
  187.     glMatrixMode(GL_MODELVIEW);
  188. }
  189.  
  190. int main(int argc, char **argv) {
  191.     // инициализация
  192.     glEnable(GL_TEXTURE_2D);
  193.     glutInit(&argc, argv);
  194.     glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
  195.     glutInitWindowPosition(100, 100);
  196.     glutInitWindowSize(1000, 600);
  197.     glutCreateWindow("Test project");
  198.  
  199.     glEnable(GL_DEPTH_TEST);
  200.     //свет
  201.     glEnable(GL_LIGHTING);
  202.     glEnable(GL_LIGHT0);
  203.     glEnable(GL_NORMALIZE);
  204.     // регистрация обратных вызовов
  205.     glutDisplayFunc(renderScene);
  206.     glutReshapeFunc(changeSize);
  207.     glutIdleFunc(renderScene);
  208.     openPicture("up.png", 1);
  209.     openPicture("logo.png", 2);
  210.     openPicture("dno.png", 3);
  211.     glutMouseFunc(mouseButton);
  212.     glutMotionFunc(mouseMove);
  213.  
  214.     // Основной цикл GLUT
  215.     glutMainLoop();
  216.     return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement