Facebook
From Wojciech, 6 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 237
  1. /*
  2.  * Laboratorium Grafiki Komputerowej
  3.  * Pierwszy program wykorzystujący OpenGL'a
  4.  */
  5.  
  6. /* System */
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9.  
  10. /* Biblioteka GLUT */
  11. #include <GL/freeglut.h>
  12.  
  13. /* Deklaracje funkcji narzędziowych */
  14.  
  15. /* Funkcja do rysowania */
  16. void DrawScene(void);
  17.  
  18. /* Funkcja do inicjacji OpenGLa */
  19. void InitOpenGL(void);
  20.  
  21. /* Funkcja wywoływana w momentach zmiany rozmiarów okna */
  22. void ReshapeWindow(int width, int height);
  23.  
  24. /* Deklaracja globalnych zmiennych */
  25.  
  26. /* Globalny identyfikator głównego okna programu */
  27. int mainWindow;
  28.  
  29. /* Funkcja main */
  30. int main(int argc, char **argv)
  31. {
  32.         // Inicjujemy bibliotekę GLUT
  33.         glutInit(&argc, argv);
  34.         // Inicjujemy: format koloru, jeden bufor ramki
  35.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
  36.         // Ustawiamy początkowe wymiary okna
  37.     glutInitWindowSize(800, 800);
  38.         // Ustawiamy pozycję okna - lewy górny naroznik
  39.         glutInitWindowPosition(150,150);
  40.         // Tworzymy główne okno programu
  41.     mainWindow = glutCreateWindow("Pierwsze Laboratorium");
  42.  
  43.         // Sprawdzamy powodzenie operacji
  44.         if(mainWindow == 0){
  45.                 puts("Nie mozna stworzyc okna!!!nWyjscie z programu.n");
  46.                 exit(-1);
  47.         }
  48.  
  49.         // Czynimy aktywnym okno główne programu
  50.         glutSetWindow(mainWindow);
  51.  
  52.         // Tutaj rejestrujemy funkcje narzędziowe - tzw. callbacks
  53.         glutDisplayFunc(DrawScene);
  54.         glutReshapeFunc(ReshapeWindow);
  55.  
  56.         // ustawienia początkowe
  57.         InitOpenGL();
  58.  
  59.         // Wejście do pętli programu
  60.         glutMainLoop();
  61.        
  62.         return(0);
  63. }
  64.  
  65. /* W tej funkcji określamy to co ma byc narysowane na ekranie.
  66.  * Jest wywoływana zawsze wtedy, gdy trzeba przerysować ekran - bufor ramki.
  67.  */
  68. void DrawScene(void)
  69. {
  70.         // Czyścimy okno aktualnym (domyślnym) kolorem
  71.         glClear(GL_COLOR_BUFFER_BIT);
  72.        
  73.         // Ustawiamy grubość linii
  74.         glLineWidth(5.0f);
  75.  
  76.         // Tworzenie prymitywów graficznych zawsze ograniczamy funkcjami glBegin i glEnd
  77.         glBegin(GL_TRIANGLES);
  78.  
  79.                 // Ustawiamy bieżący kolor rysowania na czerwony
  80.                 glColor3f(1.1f, 0.0f, 1.1f);
  81.                 // Dwa końce pierwszego odcinka
  82.                 glVertex2f(-50.0f, 0.0f);
  83.                 //glVertex2f(0.0f, 50.0f);
  84.  
  85.                 // Zmieniamy kolor rysowania na zielony
  86.                 glColor3f(1.1f, 0.0f, 1.1f);
  87.                 // Dwa końce drugiego odcinka
  88.                 glVertex2f(0.0f, 50.0f);
  89.                 //glVertex2f(50.0f, 0.0f);
  90.  
  91.                 // Zmieniamy kolor rysowania na niebieski
  92.                 glColor3f(1.1f, 0.0f, 1.1f);
  93.                 // Dwa końce drugiego odcinka
  94.                 glVertex2f(50.0f, 0.0f);
  95.                 //glVertex2f(-50.0f, 0.0f);
  96.  
  97.         glEnd();
  98.  
  99.         // Komenda wykonania poleceń rysujących
  100.         glFlush();
  101. }
  102.  
  103. /* Ta funkcja służy do wstępnej konfiguracji OpenGLa.
  104.  * Zanim coś narysujemy musimy wywołać tę funkcję.
  105.  */
  106. void InitOpenGL(void)
  107. {
  108.         // Usawiamy domyślny, czarny kolor tła okna - bufor ramki malujemy na czarno
  109.         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  110. }
  111.  
  112. /* Tę funkcję wywołuje system w momencie gdy uytkownik zmieni myszą
  113.  * rozmiar głownego okna. jej zadaniem jest zachowanie propocji wymiarów
  114.  * rysowanych obiektów niezależnie od wymiarów okna.
  115.  */
  116. void ReshapeWindow(int width, int height)
  117. {
  118.         int aspectRatio; // = width / height
  119.        
  120.         // Na wypadek dzielenia przez 0
  121.         if(height == 0) height = 1;
  122.  
  123.         // Wyliczamy współczynnik proporcji
  124.         aspectRatio = width / height;
  125.  
  126.         // Ustawiamy wielkości okna okna urządzenia w zakresie
  127.         // od 0,0 do wysokość, szerokość
  128.         glViewport(0, 0, width, height);
  129.      
  130.         // Ustawiamy układ współrzędnych obserwatora
  131.     glMatrixMode(GL_PROJECTION);
  132.  
  133.         // Resetujemy macierz projkecji
  134.     glLoadIdentity();
  135.    
  136.         // Korekta  
  137.     if(width <= height)
  138.                 glOrtho(-100.0, 100.0, -100.0/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);  
  139.      else
  140.                 glOrtho(-100.0*aspectRatio, 100.0*aspectRatio, -100.0, 100.0, 1.0, -1.0);
  141.  
  142.         // Ustawiamy macierz modelu
  143.     glMatrixMode(GL_MODELVIEW);
  144.    
  145.         // Resetujemy macierz modelu
  146.     glLoadIdentity();
  147.        
  148. }