Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //////////////////////////////////////////////////////////////////////////////////////////
- // Program demonstrujacy odwzorowanie dwuwymiarowej tekstury kraty na sfere.
- // Autor: Wojciech Satala
- //
- //////////////////////////////////////////////////////////////////////////////////////////
- #include <math.h>
- #include <GL/glut.h>
- #include <string.h>
- #include <stdio.h>
- // Definicja stalych
- // Parametry kuli
- #define KULA_R 4
- #define KULA_LPODZ_H 30
- #define KULA_LPODZ_V 30
- // Parametry tekstury kratownicy
- #define TEX_SZEROKOSC 256 // szerokosc tekstury (musi byc potega 2)
- #define TEX_WYSOKOSC 256 // dlugosc tekstury (musi byc potega 2)
- #define TEX_LKOLUMN 7 // liczba kolumn kratownicy
- #define TEX_LWIERSZY 7 // liczba wierszy kratownicy
- #ifndef M_PI
- #define M_PI 3.1415926535
- #endif
- // Makro przeliczajace stopnie na radiany
- #define DEG2RAD(x) ((float)(x)*M_PI/180.0)
- // Zmienne globalne
- // Tablica zawierajaca teksture kraty zapisana w trybie RGBA
- GLubyte tekstura[TEX_WYSOKOSC][TEX_SZEROKOSC][4];
- // Tablica parametrow swiatla
- GLfloat swiatlo[10][4] = {
- {0.1, 0.1, 0.1, 1.0}, // [0] otoczenie
- {0.5, 0.5, 0.5, 1.0}, // [1] rozproszenie
- {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
- {0.0, 0.0, 20.0, 1.0}, // [3] polozenie
- {0.0, 0.0, -1.0, 0.0}, // [4] kierunek swiecenia
- {1.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
- {45.0, 0.0, 0.0, 0.0},// [6] kat odciecia swiatla
- {1.0, 0.0, 0.0, 0.0}, // [7] stale tlumienie
- {0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
- {0.0, 0.0, 0.0, 0.0}}; // [9] tlumienie kwadratowe
- GLfloat swiatlo1[10][4] = {
- {0.1, 0.1, 0.1, 1.0}, // [0] otoczenie
- {0.0, 0.0, 0.5, 1.0}, // [1] rozproszenie
- {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
- {0.0, 5.0, 5.0, 0.0}, // [3] polozenie
- {0.0, -5.0, -5.0, 0.0}, // [4] kierunek swiecenia
- {1.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
- {180.0, 0.0, 0.0, 0.0},// [6] kat odciecia swiatla
- {1.0, 0.0, 0.0, 0.0}, // [7] stale tlumienie
- {0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
- {0.0, 0.0, 0.0, 0.0}}; // [9] tlumienie kwadratowe
- GLfloat swiatlo2[10][4] = {
- {0.1, 0.1, 0.1, 1.0}, // [0] otoczenie
- {1.0, 0.0, 0.0, 1.0}, // [1] rozproszenie
- {1.0, 0.0, 0.0, 1.0}, // [2] lustrzane
- {0.0, 5.0, 5.0, 0.0}, // [3] polozenie
- {0.0, -5.0, -5.0, 0.0}, // [4] kierunek swiecenia
- {1.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
- {180.0, 0.0, 0.0, 0.0},// [6] kat odciecia swiatla
- {1.0, 0.0, 0.0, 0.0}, // [7] stale tlumienie
- {0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
- {0.0, 0.0, 0.0, 0.0}}; // [9] tlumienie kwadratowe
- // Tablica parametrow materialu
- GLfloat material[6][4] = {
- {0.2, 0.2, 0.2, 1.0}, // [0] wspolczynnik odbicia swiatla otoczenia
- {0.8, 0.8, 0.8, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {1.0, 1.0, 1.0, 1.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
- {20.0, 0.0, 0.0, 0.0}, // [3] polysk
- {0.0, 0.0, 0.0, 1.0}}; // [4] kolor swiatla emitowanego
- // Pozostale zmienne
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- float kat = 0.0;
- int texTryb = 0;
- int texLKolumn = TEX_LKOLUMN;
- int texLWierszy = TEX_LWIERSZY;
- // Naglowki funkcji
- void WlaczOswietlenie(void);
- void DefiniujMaterial(void);
- void UtworzWzorzecTekstury(GLubyte c1R, GLubyte c1G, GLubyte c1B, GLubyte c1A,
- GLubyte c2R, GLubyte c2G, GLubyte c2B, GLubyte c2A);
- void UtworzTeksture(GLint modMiesz, GLfloat trybTeksturowania);
- void RysujSfere(double R);
- void UstawParametryWidoku(int szer, int wys);
- void WyswietlObraz(void);
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
- void RysujNakladke(void);
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja wypelniajaca tablice tekstury kraty, ktorej kolory podane zostaly jako
- // argumenty wejsciowe.
- void UtworzWzorzecTekstury(GLubyte c1R, GLubyte c1G, GLubyte c1B, GLubyte c1A,
- GLubyte c2R, GLubyte c2G, GLubyte c2B, GLubyte c2A)
- {
- int wysokoscPola = (int)ceil((double)TEX_WYSOKOSC/(double)texLWierszy);
- int szerokoscPola= (int)ceil((double)TEX_SZEROKOSC/(double)texLKolumn);
- int t, s, x, y;
- for (t = 0; t < TEX_WYSOKOSC; t+=wysokoscPola)
- {
- for (s = 0; s < TEX_SZEROKOSC; s+=szerokoscPola)
- {
- for (y = 0; y < wysokoscPola; y++)
- for (x = 0; x < szerokoscPola; x++)
- if (((s % 2) && (t % 2))
- || (!(s % 2) && !(t % 2)))
- {
- tekstura[t+y][s+x][0] = c1R;
- tekstura[t+y][s+x][1] = c1G;
- tekstura[t+y][s+x][2] = c1B;
- tekstura[t+y][s+x][3] = c1A;
- }
- else
- {
- tekstura[t+y][s+x][0] = c2R;
- tekstura[t+y][s+x][1] = c2G;
- tekstura[t+y][s+x][2] = c2B;
- tekstura[t+y][s+x][3] = c2A;
- }
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja tworzaca teksture na podstawie wzorca umieszczonego w tablicy 'tekstura'.
- // Argument <modMiesz> oznacza, ktore skladowe koloru wykorzystywane sa w procesie
- // modulacji/mieszania kolorow. Argument <trybTeksturowania> okresla w jaki sposob
- // wyznaczany jest kolor wynikowy obiektu. Dozwolone wartosci: GL_DECAL, GL_MODULATE,
- // GL_BLEND.
- void UtworzTeksture(GLint modMiesz, GLfloat trybTeksturowania)
- {
- // Okreslenie wyrownania bytow w czasie odczytywania tekstury z pamieci
- // glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- // Zdefiniowanie dwuwymiarowej tekstury
- glTexImage2D(GL_TEXTURE_2D, 0, modMiesz, TEX_SZEROKOSC, TEX_WYSOKOSC,
- 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLubyte *) &tekstura[0][0][0]);
- // Okreslenie podstawowych parametrow tekstury
- // - tekstura nie bedzie powtarzana w obu kierunkach
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- // - przy powiekszaniu i pomniejszaniu tekstury zastosowane zostanie filtrowanie liniowe
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- // Okreslenie trybu teksturowania zgodnie z wartoscia argumentu <trybTeksturowania>
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, trybTeksturowania);
- // Odblokowanieteksturowania
- glEnable(GL_TEXTURE_2D);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja rysujaca tekst rastrowy <tekst> za pomca fontow bitmapowych <font>.Rysowanie
- // tekstu wykonywane jest poczawszy od biezacej pozycji ekranu.
- void RysujTekstRastrowy(void *font, char *tekst)
- {
- int i;
- for (i = 0; i < (int)strlen(tekst); i++)
- glutBitmapCharacter(font, tekst[i]);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Wlaczenie oswietlenia sceny
- void WlaczOswietlenie(void)
- {
- // Odblokowanie oswietlenia
- glEnable(GL_LIGHTING);
- // Odblokowanie zerowego zrodla swiatla
- glEnable(GL_LIGHT0);
- // Odblokowanie zerowego zrodla swiatla
- glEnable(GL_LIGHT1);
- // Odblokowanie zerowego zrodla swiatla
- glEnable(GL_LIGHT2);
- // Inicjowanie zrodla swiatla
- glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo[0]);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo[1]);
- glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo[2]);
- glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo[4]);
- glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, swiatlo[5][0]);
- glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, swiatlo[6][0]);
- glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, swiatlo[7][0]);
- glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, swiatlo[8][0]);
- glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, swiatlo[9][0]);
- // Inicjowanie zrodla swiatla
- glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo1[0]);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo1[1]);
- glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo1[2]);
- glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo1[4]);
- glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, swiatlo1[5][0]);
- glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, swiatlo1[6][0]);
- glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, swiatlo1[7][0]);
- glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, swiatlo1[8][0]);
- glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, swiatlo1[9][0]);
- // Inicjowanie zrodla swiatla
- glLightfv(GL_LIGHT2, GL_AMBIENT, swiatlo2[0]);
- glLightfv(GL_LIGHT2, GL_DIFFUSE, swiatlo2[1]);
- glLightfv(GL_LIGHT2, GL_SPECULAR, swiatlo2[2]);
- glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, swiatlo2[4]);
- glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, swiatlo2[5][0]);
- glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, swiatlo2[6][0]);
- glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, swiatlo2[7][0]);
- glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, swiatlo2[8][0]);
- glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, swiatlo2[9][0]);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Zdefiniowanie walasciwosci materialu walca na podstawie zapisanych w tablcy 'material'
- // parametrow (material obowiazuje tylko do scian skierowanych przodem do obserwatora)
- void DefiniujMaterial(void)
- {
- glMaterialfv(GL_FRONT, GL_AMBIENT, material[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material[4]);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja rysujaca sfere o srodku w punkcie (0, 0, 0) i promieniu <R>. Powierzchnia
- // sfery modelowana jest w trybie GL_TRIANGLE_STRIP z rownoczesnym wyznaczaniem
- // wektorow normalnych i generowaniem wspolrzednych tekstury (odwzorowanie na sfere).
- void RysujSfere(double R)
- {
- double dPsi, dAlfa;
- double psi, alfa = 0.0;
- static double talfa = 0.0;
- // Wyznaczenie kata wyznaczajacego pojedynczy wycinek poziomy
- dAlfa = 360.0/(double)KULA_LPODZ_H;
- // Wyznaczenie kata wyznaczajacego pojedynczy wycinek pionowy
- dPsi = 180.0/(double)KULA_LPODZ_V;
- talfa += 1.0;
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glRotatef(talfa, 0,0,1);
- glTranslatef(-0.5, -0.5, 0.0);
- glMatrixMode(GL_MODELVIEW);
- /*
- for (psi = -90 + dPsi; (psi) <= 90.0; psi += dPsi)
- {
- glBegin(GL_TRIANGLE_STRIP);
- for (alfa = 0; (alfa) <= 360.0; alfa += dAlfa)
- {
- glTexCoord2f(alfa/360.0, (psi + 90.0)/180.0);
- glNormal3f(cos(DEG2RAD(alfa))*cos(DEG2RAD(psi)),
- sin(DEG2RAD(psi)),
- -sin(DEG2RAD(alfa))*cos(DEG2RAD(psi)));
- glVertex3f(R*cos(DEG2RAD(alfa))*cos(DEG2RAD(psi)),
- R*sin(DEG2RAD(psi)),
- -R*sin(DEG2RAD(alfa))*cos(DEG2RAD(psi)));
- glTexCoord2f(alfa/360.0, (psi - dPsi + 90.0)/180.0);
- glNormal3f(cos(DEG2RAD(alfa))*cos(DEG2RAD(psi - dPsi)),
- sin(DEG2RAD(psi - dPsi)),
- -sin(DEG2RAD(alfa))*cos(DEG2RAD(psi - dPsi)));
- glVertex3f(R*cos(DEG2RAD(alfa))*cos(DEG2RAD(psi - dPsi)),
- R*sin(DEG2RAD(psi - dPsi)),
- -R*sin(DEG2RAD(alfa))*cos(DEG2RAD(psi -dPsi)));
- }
- glEnd();
- }
- */
- glBegin(GL_QUADS);
- glNormal3f(0,0,1);
- glTexCoord2f(0,0);
- glVertex3f(0,0,0);
- glTexCoord2f(1,0);
- glVertex3f(5,0,0);
- glTexCoord2f(1,1);
- glVertex3f(5,5,0);
- glTexCoord2f(0,1);
- glVertex3f(0,5,0);
- glEnd();
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu
- void UstawParametryWidoku(int szer, int wys)
- {
- // Zapamietanie wielkosci widoku
- szerokoscOkna = szer;
- wysokoscOkna = wys;
- // Ustawienie parametrow viewportu
- glViewport(0, 0, szerokoscOkna, wysokoscOkna);
- // Przejscie w tryb modyfikacji macierzy rzutowania
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(40.0, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
- // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
- glMatrixMode(GL_MODELVIEW);
- // Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa
- glLoadIdentity();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja generujaca pojedyncza klatke animacji
- void WyswietlObraz(void)
- {
- glPushMatrix();
- // Wyczyszczenie bufora ramki i bufora glebokosci
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- // Okreslenie wielkosci widoku, wlaczenie rzutowania perspektywicznego
- // i zainicjowanie stosu macierzy modelowania
- UstawParametryWidoku(szerokoscOkna, wysokoscOkna);
- // Zrodlo swiatla polozone statycznie w uladzie obserwatora
- glLightfv(GL_LIGHT1, GL_POSITION, swiatlo1[3]);
- // Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych
- // sceny do ukladu wspolrzednych obserwatora). Obserwator obraca sie wokol punktu 0.0
- // na osi OY. Promien obrotu = 20, pochylenie = 20 stopni,
- // predkosc obrotu = 0.25 stopnia/ramke.
- glTranslatef(0, 0, -20);
- glRotatef(kat, 0, 1, 0);
- // Zdefiniowanie materialu walca
- DefiniujMaterial();
- // Utworzenie wzorca tekstury (czarno-biala krata)
- UtworzWzorzecTekstury(0, 255, 255, 255, 255, 0, 255, 255);
- // Utworzenie tekstury na podstawie zdefiniowanego wzorca (wlaczona modulacja
- // pierwotnego koloru sfery wszystkimi skladowymi koloru tekstury)
- UtworzTeksture(4, texTryb);
- // Zrodlo swiatla polozone statycznie w ukladzie sceny
- glLightfv(GL_LIGHT2, GL_POSITION, swiatlo2[3]);
- // zrodlo swiatla okrazajace kule
- glPushMatrix();
- glRotatef(3*kat, 1,0,0);
- glLightfv(GL_LIGHT0, GL_POSITION, swiatlo[3]);
- glPopMatrix();
- // Generacja obrazu sfery
- RysujSfere(KULA_R);
- // Narysowanie nakladki
- RysujNakladke();
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- // Modyfikacja kata obrotu
- kat += 0.5;
- glPopMatrix();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja rysujaca na wygenerowanym obrazie sfery nkladke z tekstem
- void RysujNakladke(void)
- {
- GLboolean stanOswietlenia = GL_FALSE;
- // Zapamietanie stanu oswietlenia
- if (glIsEnabled(GL_LIGHTING))
- {
- stanOswietlenia = GL_TRUE;
- glDisable(GL_LIGHTING);
- }
- // Zmiana typu rzutu z perspektywicznego na ortogonalny
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna,-100.0, 100.0);
- // Modelowanie sceny 2D (zawartosci nakladki)
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
- glDisable(GL_LIGHTING);
- // Tu jest zawartosc nakladki
- // Przywrocenie macierzy sprzed wywolania funkcji
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- // Odblokowanie oswietlenia
- if(stanOswietlenia)
- glEnable(GL_LIGHTING);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- switch(klawisz)
- {
- case 'd':
- texTryb = GL_DECAL;
- break;
- case 'm':
- texTryb = GL_MODULATE;
- break;
- case 'b':
- texTryb = GL_BLEND;
- break;
- case 'l':
- if (glIsEnabled(GL_LIGHTING))
- glDisable(GL_LIGHTING);
- else
- glEnable(GL_LIGHTING);
- break;
- case 'w':
- texLWierszy++;
- break;
- case 'W':
- texLWierszy = (texLWierszy == 0) ? 0 : texLWierszy - 1;
- break;
- case 'k':
- texLKolumn++;
- break;
- case 'K':
- texLKolumn = (texLKolumn == 0) ? 0 : texLKolumn - 1;
- break;
- }
- if (klawisz == 27)
- exit(0);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Glowna funkcja programu
- int main(int argc, char **argv)
- {
- // Zainicjowanie biblioteki GLUT
- glutInit(&argc, argv);
- // Ustawienie trybu wyswietlania
- glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
- // Ustawienie polozenia dolenego lewego rogu okna
- glutInitWindowPosition(100, 100);
- // Ustawienie rozmiarow okna
- glutInitWindowSize(szerokoscOkna, wysokoscOkna);
- // Utworzenie okna
- glutCreateWindow("Teksturowana kula");
- // Odblokowanie bufora glebokosci
- glEnable(GL_DEPTH_TEST);
- // Ustawienie funkcji wykonywanej na danych w buforze glebokosci
- glDepthFunc(GL_LEQUAL);
- // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
- glClearDepth(1000.0);
- // Odblokowanie wykonywania operacji na skladowych "alfa"
- glEnable(GL_BLEND);
- // Wybor funkcji mieszajacej kolory
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- // Ustawienie koloru czyszczenia bufora ramki
- glClearColor (0.0, 0.3, 0.0, 0.0);
- // Zarejestrowanie funkcji (callback) wyswietlajacej
- glutDisplayFunc(WyswietlObraz);
- // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
- // zmieniane sa rozmiary okna
- glutReshapeFunc(UstawParametryWidoku);
- // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
- // zadnych zadan
- glutIdleFunc(WyswietlObraz);
- // Zarejestrowanie funkcji obslugi klawiatury
- glutKeyboardFunc(ObslugaKlawiatury);
- // Ustawienie oswietlenia sceny (polozenie zrodla swiatla wyznaczane jest w ukladzie
- // wspolrzednych obserwatora)
- WlaczOswietlenie();
- // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
- // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement