Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.48 KB | None | 0 0
  1. #pragma warning(disable : 4996)
  2.  
  3. #include <math.h>
  4. #include <GL/glut.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include "materials.h"
  8.  
  9. // Definicja stalych
  10. #define OBSERWATOR_FOV_Y 10.0
  11. #define odlmin 10.0
  12. #define odlmax 300.0
  13.  
  14. #define M_PI 3.14159
  15. #define DEG2RAD(x) ((float)(x)*M_PI/180.0)
  16.  
  17. // Zmienne globalne
  18. int szerokoscOkna = 800;
  19. int wysokoscOkna = 600;
  20.  
  21. GLfloat odl = 200.0;
  22. GLfloat rotObsX = 40.0;
  23. GLfloat rotObsY = 40.0;
  24. GLfloat rotObsZ = 0.0;
  25.  
  26. int iloscpodzialowpoziomych = 12;
  27. int zrodlo1 = 1;
  28. int zrodlo2 = 1;
  29. int obecnymaterial = 0;
  30. int normalne = 1;
  31. int smooth = 1;
  32. int fill = 1;
  33. float length;
  34.  
  35. int a = 3;
  36. double h = 5;
  37. int R = 6;
  38. int r = 8;
  39. int n = 40;
  40. int nMin = 4;
  41. int nMax = 64;
  42. double dAlfa;
  43. int i = 0, j;
  44. int N1 = 40;
  45. int N2 = 40;
  46. int rW = 15;
  47. int rZ;
  48. int srA;
  49.  
  50. float r_reflektor = 30;
  51. float predkosc_reflektor = 0.1;
  52. float nachylenie_reflektor = 0;
  53. float kat_reflektor = 0;
  54.  
  55. float material1[5][4] = {
  56. {1, 1, 0, 1.0},// [0] wspolczynnik odbicia swiatla otoczenia
  57. {1, 1, 0, 1.0},// [1] wspolczynnik odbicia swiatla rozproszonego
  58. {1, 1, 0, 1.0},// [2] wspolczynnik odbicia swiatla lustrzanego
  59. {10,0,0,0}, // [3] polysk
  60. {1,1,0.0,1.0} // [4] kolor swiatla emitowanego
  61. };
  62. // Tablica parametrow materialu nr 2
  63. float material2[5][4] = {
  64. {0, 1,0, 1}, // [0] wspolczynnik odbicia swiatla otoczenia
  65. {0, 1,0, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
  66. {0, 0.1,0, 1.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
  67. {10, 0.0, 0.0, 0.0}, // [3] polysk
  68. {0.0, 0.0, 0.0, 1.0} // [4] kolor swiatla emitowanego
  69. };
  70.  
  71. //reflektor
  72. GLfloat param_swiatla1[5][4] = {
  73. {0.6489,0.106,0.9,1}, // [0] światło otoczenia
  74. {0.6489,0.106,0.9,1}, // [1] światło rozproszone
  75. {0.6489,0.106,0.9,1}, // [2] światło zwierciadlane
  76. {0,0,0,1}, // [3] położenie
  77. {-1,0,0} // [4] kierunek świecenia
  78. };
  79.  
  80. //kierunkowe
  81. GLfloat param_swiatla2[5][4] = {
  82. {0,0.7,0,1}, // [0] światło otoczenia
  83. {0,0.7,0,1}, // [1] światło rozproszone
  84. {0,0.7,0,1}, // [2] światło zwierciadlane
  85. {-10,-5,10,0}, // [3] położenie
  86. {0,0,0,0} // [4] kierunek świecenia
  87. };
  88.  
  89.  
  90. // Prototypy funkcji
  91. void UstawParametryWidoku(int szer, int wys);
  92. void WyswietlObraz(void);
  93. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  94. void RysujTekstRastrowy(void* font, char* tekst);
  95. void RysujNakladke(void);
  96.  
  97. void UstawSwiatlaIMaterialy()
  98. {
  99. glEnable(GL_LIGHTING);
  100. // Odblokowanie zrodla swiatla nr 1
  101.  
  102.  
  103. if (zrodlo1 == 1)
  104. {
  105. glDisable(GL_LIGHTING);
  106. glPushMatrix();
  107.  
  108. glRotatef(nachylenie_reflektor, 1, 0, 0);
  109. glBegin(GL_LINE_STRIP);
  110. glColor3f(0, 0, 0);
  111. for (int i = 0; i <= 360; i = i + 2)
  112. {
  113. glVertex3f(r_reflektor * cos(DEG2RAD(i)), 0, r_reflektor * sin(DEG2RAD(i)));
  114. }
  115. glEnd();
  116. glPopMatrix();
  117.  
  118. glPushMatrix();
  119.  
  120. glRotatef(nachylenie_reflektor, 1, 0, 0);
  121. glRotatef(kat_reflektor, 0, 1, 0);
  122. glTranslatef(r_reflektor, 0, 0);
  123.  
  124.  
  125. glColor3f(1, 1, 0);
  126. glutSolidSphere(0.3, 5, 5);
  127. glEnable(GL_LIGHTING);
  128.  
  129. glEnable(GL_LIGHT0);
  130.  
  131. // Inicjowanie zrodla swiatla
  132. glLightfv(GL_LIGHT0, GL_DIFFUSE, param_swiatla1[1]);
  133. glLightfv(GL_LIGHT0, GL_SPECULAR, param_swiatla1[2]);
  134. glLightfv(GL_LIGHT0, GL_POSITION, param_swiatla1[3]);
  135. glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 30);
  136. glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, param_swiatla1[4]);
  137.  
  138. glPopMatrix();
  139. }
  140. else {
  141. glDisable(GL_LIGHT0);
  142. }
  143.  
  144. if (zrodlo2 == 1)
  145. {
  146. glEnable(GL_LIGHT1);
  147.  
  148. // Inicjowanie zrodla swiatla
  149. glLightfv(GL_LIGHT1, GL_DIFFUSE, param_swiatla2[1]);
  150. glLightfv(GL_LIGHT1, GL_SPECULAR, param_swiatla2[2]);
  151. glLightfv(GL_LIGHT1, GL_POSITION, param_swiatla2[3]);
  152. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, param_swiatla2[4]);
  153. }
  154. else {
  155. glDisable(GL_LIGHT1);
  156. }
  157.  
  158. switch (obecnymaterial)
  159. {
  160. case 0:
  161. glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
  162. glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
  163. glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
  164. glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
  165. glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
  166. break;
  167. case 1:
  168. glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
  169. glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
  170. glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
  171. glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
  172. glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
  173. break;
  174. case 2:
  175. glMaterialfv(GL_FRONT, GL_AMBIENT, ChromeAmbient);
  176. glMaterialfv(GL_FRONT, GL_DIFFUSE, ChromeDiffuse);
  177. glMaterialfv(GL_FRONT, GL_SPECULAR, ChromeSpecular);
  178. glMaterialfv(GL_FRONT, GL_SHININESS, &ChromeShininess);
  179. glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
  180. break;
  181. default:
  182. break;
  183. }
  184. }
  185.  
  186. void SyncSmoothIFill()
  187. {
  188. if (smooth)
  189. glShadeModel(GL_SMOOTH);
  190. else
  191. glShadeModel(GL_FLAT);
  192.  
  193. if (fill)
  194. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  195. else
  196. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  197. }
  198.  
  199. void wektory()
  200. {
  201. double dAlfa, x, y, Rp, rp, h = 10, R = 10;
  202. int i, j;
  203. int poz = N1;
  204. double deg = atan(R / h);
  205. dAlfa = 360 / N2;
  206. glDisable(GL_LIGHTING);
  207.  
  208. glBegin(GL_LINES);
  209. glColor3f(1, 0, 0);
  210. glVertex3f(0.0, 0.0, 0.0);
  211. glVertex3f(0.0, -1.0, 0.0);
  212. for (i = 0; i * dAlfa <= 360.0; i++)
  213. {
  214. glVertex3f(R * cos(DEG2RAD(i * dAlfa)), 0.0, R * sin(DEG2RAD(i * dAlfa)));
  215. glVertex3f(R * cos(DEG2RAD(i * dAlfa)), -1.0, R * sin(DEG2RAD(i * dAlfa)));
  216. }
  217.  
  218. for (j = 0; j < poz; j++)
  219. {
  220. x = R * ((j * (double)(h / poz)) / h);
  221. y = R * (((j * (double)(h / poz)) + (h / poz)) / h);
  222. Rp = R - x;
  223. rp = R - y;
  224.  
  225. for (i = 0; i <= N2; i++)
  226. {
  227. glVertex3f(Rp * cos(DEG2RAD(i * dAlfa)), (j * (double)(h / poz)), Rp * sin(DEG2RAD(i * dAlfa)));
  228. glVertex3f((Rp + 1) * cos(DEG2RAD(i * dAlfa)), ((j) * (double)(h / poz)) + sin(deg), (Rp + 1) * sin(DEG2RAD(i * dAlfa)));
  229.  
  230. glVertex3f(rp * cos(DEG2RAD(i * dAlfa)), (j * (double)(h / poz)) + (h / poz), rp * sin(DEG2RAD(i * dAlfa)));
  231. glVertex3f((rp + 1) * cos(DEG2RAD(i * dAlfa)), ((j) * (double)(h / poz)) + (h / poz) + sin(deg), (rp + 1) * sin(DEG2RAD(i * dAlfa)));
  232. }
  233. }
  234.  
  235. glEnd();
  236. glEnable(GL_LIGHTING);
  237. }
  238.  
  239. void Stozekniesciety()
  240. {
  241. double dAlfa, x, y, Rp, rp, h = 10, R = 10;
  242. int i, j;
  243. int poz = N1;
  244. double deg = atan(R / h);
  245. dAlfa = 360 / N2;
  246.  
  247. glEnable(GL_NORMALIZE);
  248.  
  249. glBegin(GL_TRIANGLE_FAN);
  250. glNormal3f(0, -1, 0);
  251. glVertex3f(0.0, 0.0, 0.0);
  252. for (i = 0; i * dAlfa <= 360.0; i++)
  253. {
  254. glVertex3f(R * cos(DEG2RAD(i * dAlfa)), 0.0, R * sin(DEG2RAD(i * dAlfa)));
  255. }
  256. glEnd();
  257.  
  258. glColor3f(1.0, 0.0, 0.0);
  259. for (j = 0; j < poz; j++)
  260. {
  261. x = R * ((j * (double)(h / poz)) / h);
  262. y = R * (((j * (double)(h / poz)) + (h / poz)) / h);
  263. Rp = R - x;
  264. rp = R - y;
  265. glBegin(GL_QUADS);
  266. for (i = 0; i <= N2; i++)
  267. {
  268. glNormal3f(cos(DEG2RAD(i * dAlfa)), sin(deg), sin(DEG2RAD(i * dAlfa)));
  269. glVertex3f(Rp * cos(DEG2RAD(i * dAlfa)), (j * (double)(h / poz)), Rp * sin(DEG2RAD(i * dAlfa)));
  270. glVertex3f(rp * cos(DEG2RAD(i * dAlfa)), (j * (double)(h / poz)) + (h / poz), rp * sin(DEG2RAD(i * dAlfa)));
  271.  
  272. glNormal3f(cos(DEG2RAD((i + 1) * dAlfa)), sin(deg), sin(DEG2RAD((i + 1) * dAlfa)));
  273. glVertex3f(rp * cos(DEG2RAD((i + 1) * dAlfa)), (j * (double)(h / poz)) + (h / poz), rp * sin(DEG2RAD((i + 1) * dAlfa)));
  274. glVertex3f(Rp * cos(DEG2RAD((i + 1) * dAlfa)), (j * (double)(h / poz)), Rp * sin(DEG2RAD((i + 1) * dAlfa)));
  275. }
  276. glEnd();
  277. }
  278. }
  279.  
  280. //////////////////////////////////////////////////////////////////////////////////////////
  281. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  282. // bya wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  283. void UstawParametryWidoku(int szer, int wys)
  284. {
  285. // Zapamietanie wielkosci widoku
  286. szerokoscOkna = szer;
  287. wysokoscOkna = wys;
  288.  
  289. // Ustawienie parametrow viewportu
  290. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  291.  
  292. // Przejscie w tryb modyfikacji macierzy rzutowania
  293. glMatrixMode(GL_PROJECTION);
  294. glLoadIdentity();
  295. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna / (float)wysokoscOkna, 1.0, 1000.0);
  296. }
  297.  
  298.  
  299. //////////////////////////////////////////////////////////////////////////////////////////
  300. // Funkcja wyswietlajaca pojedyncza klatke animacji
  301. void WyswietlObraz(void)
  302. {
  303. // Wyczyszczenie bufora koloru i bufora glebokosci
  304. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  305.  
  306. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  307. glMatrixMode(GL_MODELVIEW);
  308.  
  309. // Zastapienie aktywnej macierzy macierza jednostkowa
  310. glLoadIdentity();
  311.  
  312. // Ustalenie polozenia obserwatora
  313. glTranslatef(0, 0, -odl);
  314. glRotatef(rotObsX, 1, 0, 0);
  315. glRotatef(rotObsY, 0, 1, 0);
  316. glRotatef(rotObsZ, 0, 0, 1);
  317.  
  318.  
  319. UstawSwiatlaIMaterialy();
  320. //RysujUklad();
  321. //glColor3f(1.0, 1.0, 1.0);
  322. //RysujPierscien(10, 4, iloscpodzialowpoziomych);
  323. kat_reflektor = kat_reflektor + predkosc_reflektor;
  324. Stozekniesciety();
  325. RysujNakladke();
  326. if (normalne)
  327. wektory();
  328.  
  329.  
  330. // Przelaczenie buforow ramki
  331. glutSwapBuffers();
  332. }
  333.  
  334. void RysujTekstRastrowy(void* font, char* tekst)
  335. {
  336. int i;
  337.  
  338. for (i = 0; i < (int)strlen(tekst); i++)
  339. glutBitmapCharacter(font, tekst[i]);
  340. }
  341.  
  342. void RysujNakladke(void)
  343. {
  344. char buf[255];
  345.  
  346. // Zmiana typu rzutu z perspektywicznego na ortogonalny
  347. glMatrixMode(GL_PROJECTION);
  348. glPushMatrix();
  349. glLoadIdentity();
  350. glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
  351.  
  352. // Modelowanie sceny 2D (zawartosci nakladki)
  353. glMatrixMode(GL_MODELVIEW);
  354. glPushMatrix();
  355. glLoadIdentity();
  356.  
  357. // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
  358. glDisable(GL_LIGHTING);
  359.  
  360. // Okreslenie koloru tekstu
  361. glColor3f(1.0, 1.0, 1.0);
  362.  
  363. // RYSOWANIE MENU PARAMETROW ZRODLA SWIATLA
  364.  
  365. sprintf(buf, "Swiatlo: Klawisze 3, 4");
  366. glRasterPos2i(30, 150);
  367. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  368.  
  369. sprintf(buf, "Zobrazowanie geometryczne: Klawisz 7");
  370. glRasterPos2i(30, 140);
  371. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  372.  
  373. sprintf(buf, "Material: Klawisz 5");
  374. glRasterPos2i(30, 130);
  375. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  376.  
  377. sprintf(buf, "Podzialy poziome: 1+,!- pionowe: 2+,@-");
  378. glRasterPos2i(30, 120);
  379. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  380.  
  381. sprintf(buf, "Odleglosc z+ x-");
  382. glRasterPos2i(30, 110);
  383. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  384.  
  385. sprintf(buf, "Wygladzanie 6");
  386. glRasterPos2i(30, 100);
  387. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  388.  
  389. sprintf(buf, "polygon mode 7");
  390. glRasterPos2i(30, 90);
  391. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  392.  
  393. sprintf(buf, "wektory normalne 8");
  394. glRasterPos2i(30, 80);
  395. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  396.  
  397. sprintf(buf, "promien reflektora i+/j-");
  398. glRasterPos2i(30, 70);
  399. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  400.  
  401. sprintf(buf, "predkosc reflektora o+/k-");
  402. glRasterPos2i(30, 60);
  403. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  404.  
  405. sprintf(buf, "kat reflektora p+/l-");
  406. glRasterPos2i(30, 50);
  407. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  408.  
  409. // Przywrocenie macierzy sprzed wywolania funkcji
  410. glMatrixMode(GL_PROJECTION);
  411. glPopMatrix();
  412. glMatrixMode(GL_MODELVIEW);
  413. glPopMatrix();
  414.  
  415. // Odblokowanie oswietlenia
  416. glEnable(GL_LIGHTING);
  417. }
  418.  
  419. //////////////////////////////////////////////////////////////////////////////////////////
  420. // Funkcja obslugi klawiatury
  421. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  422. {
  423. switch (klawisz)
  424. {
  425. //Odległość obserwatora
  426. case 'z':
  427. odl = odl > odlmin ? odl - 3.0 : odl;
  428. break;
  429. case 'x':
  430. odl = odl < odlmax ? odl + 3.0 : odl;
  431. break;
  432. //
  433.  
  434. //Podziały pierścienia
  435. case '1':
  436. if (N1 < nMax) N1++;
  437. break;
  438. case '!':
  439. if (N1 > nMin) N1--;
  440. break;
  441. case '2':
  442. if (N2 < nMax) N2++;
  443. break;
  444. case '@':
  445. if (N2 > nMin) N2--;
  446. break;
  447.  
  448. //Źródła światła
  449. case '3':
  450. zrodlo1 = !zrodlo1;
  451. break;
  452. case '4':
  453. zrodlo2 = !zrodlo2;
  454. break;
  455.  
  456. //Zmiana materiału bryły
  457. case '5':
  458. obecnymaterial++;
  459. if (obecnymaterial > 2) obecnymaterial = 0;
  460. break;
  461. //
  462.  
  463. //Cieniowanie
  464. case '6':
  465. smooth = !smooth;
  466. SyncSmoothIFill();
  467. break;
  468.  
  469. case '7':
  470. fill = !fill;
  471. SyncSmoothIFill();
  472. break;
  473. //
  474.  
  475. case '8':
  476. normalne = !normalne;
  477. break;
  478.  
  479. //Poruszanie się obserwatora
  480. case 'q':
  481. case 'Q':
  482. rotObsZ = rotObsZ + 1.0;
  483. break;
  484. case 'e':
  485. case 'E':
  486. rotObsZ = rotObsZ - 1.0;
  487. break;
  488. case 'w':
  489. case 'W':
  490. rotObsX = rotObsX + 1.0;
  491. break;
  492. case 's':
  493. case 'S':
  494. rotObsX = rotObsX - 1.0;
  495. break;
  496. case 'a':
  497. case 'A':
  498. rotObsY = rotObsY - 1.0;
  499. break;
  500. case 'd':
  501. case 'D':
  502. rotObsY = rotObsY + 1.0;
  503. break;
  504. //
  505.  
  506.  
  507. case 'i':
  508. r_reflektor++;
  509. break;
  510. case 'j':
  511. r_reflektor--;
  512. break;
  513. case 'o':
  514. predkosc_reflektor = predkosc_reflektor + 0.1;
  515. break;
  516. case 'k':
  517. predkosc_reflektor = predkosc_reflektor - 0.1;
  518. break;
  519. case 'p':
  520. nachylenie_reflektor = nachylenie_reflektor + 1;
  521. break;
  522. case 'l':
  523. nachylenie_reflektor = nachylenie_reflektor - 1;
  524. break;
  525.  
  526. case 27:
  527. exit(0);
  528. break;
  529. default:
  530. break;
  531. }
  532. }
  533.  
  534.  
  535. //////////////////////////////////////////////////////////////////////////////////////////
  536. // Glowna funkcja programu
  537. int main(int argc, char** argv)
  538. {
  539. // Zainicjowanie biblioteki GLUT
  540. glutInit(&argc, argv);
  541.  
  542. // Ustawienie trybu wyswietlania
  543. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  544.  
  545. // Ustawienie polozenia dolenego lewego rogu okna
  546. glutInitWindowPosition(100, 100);
  547.  
  548. // Ustawienie rozmiarow okna
  549. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  550.  
  551. // Utworzenie okna
  552. glutCreateWindow("Szescian");
  553.  
  554. // Odblokowanie bufora glebokosci
  555. glEnable(GL_DEPTH_TEST);
  556.  
  557. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  558. glClearDepth(1000.0);
  559.  
  560. // Ustawienie koloru czyszczenia bufora ramki
  561. glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  562.  
  563. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  564. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  565.  
  566. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  567. glutDisplayFunc(WyswietlObraz);
  568.  
  569. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  570. // zmieniane sa rozmiary okna
  571. glutReshapeFunc(UstawParametryWidoku);
  572.  
  573. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  574. // zadnych zadan
  575. glutIdleFunc(WyswietlObraz);
  576.  
  577. // Zarejestrowanie funkcji obslugi klawiatury
  578. glutKeyboardFunc(ObslugaKlawiatury);
  579.  
  580. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  581. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  582. glutMainLoop();
  583.  
  584. return 0;
  585. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement