Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.39 KB | None | 0 0
  1. //ZESTAW 7, ZADANIE 14 - Indywidualne
  2. #include "glut.h"
  3. #include <math.h>
  4.  
  5. // Definicja stalych
  6. #define DLUGOSC_BOKU 10.0
  7. #define OBSERWATOR_ODLEGLOSC 20.0
  8. #define OBSERWATOR_OBROT_X 20.0
  9. #define OBSERWATOR_OBROT_Y 20.0
  10. #define OBSERWATOR_FOV_Y 30.0
  11. int zmienna = 5;
  12. int zmienna2 = 5;
  13. int smooth=1;
  14. int fill=1;
  15. int zrodlo1 = 1;
  16. int zrodlo2 = 1;
  17. int obecnymaterial = 0;
  18. int normalne = 1;
  19.  
  20. float material1[5][4] = {
  21. {0.192250, 0.192250, 0.192250, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  22. {0.507540, 0.507540, 0.507540, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  23. {0.508273, 0.508273, 0.508273, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  24. {51.2, 0.0, 0.0, 0.0}, // [3] polysk
  25. {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
  26. // Tablica parametrow materialu nr 2
  27. float material2[5][4] = {
  28. {0.250000, 0.148000, 0.064750, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  29. {0.400000, 0.236800, 0.103600, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  30. {0.774597, 0.458561, 0.200621, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  31. {76.8, 0.0, 0.0, 0.0}, // [3] polysk
  32. {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
  33. float material3[5][4] = {
  34. {0.247250, 0.199500, 0.074500, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  35. {0.751640, 0.606480, 0.226480, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  36. {0.628281, 0.555802, 0.366065, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  37. {52.2, 0.0, 0.0, 0.0}, // [3] polysk
  38. {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
  39. // Tablica parametrow zrodla swiatla nr 1
  40. GLfloat swiatlo1[5][4] = {
  41. {0.8, 0.8, 0, 1.0}, // [0] otoczenie
  42. {0.8, 0.8, 0.0, 1.0}, // [1] rozproszenie
  43. {0.8, 0.8, 0.0, 1.0}, // [2] lustrzane
  44. {10.0, 10.0, 10.0, 1.0},// [3] polozenie
  45. {-1.0, -1.0, -1.0, 0.0}// [4] kierunek swiecenia
  46. };
  47. // Tablica parametrow zrodla swiatla nr 1
  48. GLfloat swiatlo2[5][4] = {
  49. {0, 1, 1, 1.0}, // [0] otoczenie
  50. {0, 1, 1, 1.0}, // [1] rozproszenie
  51. {0, 18, 1, 1.0}, // [2] lustrzane
  52. {-10.0, 10.0, 10.0, 1.0},// [3] polozenie
  53. {-1.0, -1.0, -1.0, 0.0}// [4] kierunek swiecenia
  54. };
  55.  
  56.  
  57.  
  58. // Zmienne globalne
  59. double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  60. int szerokoscOkna = 800;
  61. int wysokoscOkna = 600;
  62. int zm1 = 1;
  63. int a = 5;
  64. GLfloat minOdl = -1.0;
  65. GLfloat maxOdl = -200.0;
  66. GLfloat obsOdl = -30.0;
  67. GLfloat rotObsY = 40.0;
  68. GLfloat rotObsX = 40.0;
  69. GLfloat rotObsZ = 0.0;
  70. // Prototypy funkcji
  71. void RysujSzescian(int N);
  72. void UstawParametryWidoku(int szer, int wys);
  73. void WyswietlObraz(void);
  74. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  75. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y);
  76.  
  77. //////////////////////////////////////////////////////////////////////////////////////////
  78. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  79. // Srodek szescianu znajduje siÄ™ w punkcie (0,0,0).
  80.  
  81. void UstawSwiatlaIMaterialy()
  82. {
  83. glEnable(GL_LIGHTING);
  84. // Odblokowanie zrodla swiatla nr 1
  85. if (zrodlo1 == 1) {
  86. glEnable(GL_LIGHT0);
  87. glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo1[0]);
  88. glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo1[1]);
  89. glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo1[2]);
  90. glLightfv(GL_LIGHT0, GL_POSITION, swiatlo1[3]);
  91. glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo1[4]);
  92.  
  93. }
  94. else {
  95. //wylaczenie zrodla swiatla nr 1
  96. glDisable(GL_LIGHT0);
  97. }
  98. // Odblokowanie zrodla swiatla nr 2
  99. if (zrodlo2 == 1) {
  100. glEnable(GL_LIGHT1);
  101. glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo2[0]);
  102. glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo2[1]);
  103. glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo2[2]);
  104. glLightfv(GL_LIGHT1, GL_POSITION, swiatlo2[3]);
  105. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo2[4]);
  106.  
  107. }
  108. else {
  109. //wylaczenie zrodla swiatla nr 2
  110. glDisable(GL_LIGHT1);
  111. }
  112.  
  113. switch (obecnymaterial)
  114. {
  115. case 0:
  116. glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
  117. glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
  118. glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
  119. glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
  120. glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
  121. break;
  122. case 1:
  123. glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
  124. glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
  125. glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
  126. glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
  127. glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
  128. break;
  129. case 2:
  130. glMaterialfv(GL_FRONT, GL_AMBIENT, material3[0]);
  131. glMaterialfv(GL_FRONT, GL_DIFFUSE, material3[1]);
  132. glMaterialfv(GL_FRONT, GL_SPECULAR, material3[2]);
  133. glMaterialfv(GL_FRONT, GL_SHININESS, material3[3]);
  134. glMaterialfv(GL_FRONT, GL_EMISSION, material3[4]);
  135. break;
  136. default:
  137. break;
  138. }
  139. }
  140.  
  141. void PoliczNormal(float x1, float x2, float x3, float y1, float y2, float y3, float z1, float z2, float z3, float*normal)
  142. {
  143. float dlug;
  144. float xa = x2 - x1;
  145. float ya = y2 - y1;
  146. float za = z2 - z1;
  147.  
  148. float xb = x3 - x1;
  149. float yb = y3 - y1;
  150. float zb = z3 - z1;
  151. normal[0] = ya * zb - za * yb;
  152. normal[1] = za * xb - xa * zb;
  153. normal[2] = (xa * yb - ya * xb);
  154.  
  155. dlug = sqrtf(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
  156.  
  157. normal[0] /= dlug;
  158. normal[1] /= dlug;
  159. normal[2] /= dlug;
  160. }
  161. void SyncSmoothIFill()
  162. {
  163. if (smooth)
  164. glShadeModel(GL_SMOOTH);
  165. else
  166. glShadeModel(GL_FLAT);
  167.  
  168. if (fill)
  169. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  170. else
  171. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  172. }
  173.  
  174. void RysujStozekBezPodstaw(float R, float r, float y, float h, int n)
  175. {
  176. float alfa;
  177. int i;
  178. float x;
  179. float z;
  180. float x1;
  181. float z1;
  182. float normal[3];
  183.  
  184.  
  185.  
  186. glBegin(GL_QUADS);
  187.  
  188.  
  189. alfa = 90.0 / n; //kat
  190. for (i = 0; i <= n - 1; i++)
  191. {
  192.  
  193. glBegin(GL_QUADS);
  194.  
  195. x = cos(0.0174532925f * i * alfa);
  196. z = sin(0.0174532925f * i * alfa);
  197. x1 = cos(0.0174532925f * (i + 1) * alfa);
  198. z1 = sin(0.0174532925f * (i + 1) * alfa);
  199.  
  200. glVertex3f(x * R, y + 0, z * R);
  201. glVertex3f(x * r, y + h, z * r);
  202. glVertex3f(x1 * r, y + h, z1 * r);
  203. glVertex3f(x1 * R, y, z1 * R);
  204. PoliczNormal(x*R, x*r, x1*R, y, y+h, y, z*R, z*r, z1*R, normal);
  205. glNormal3f(normal[0], normal[1], normal[2]);
  206. if (normalne)
  207. {
  208. glBegin(GL_LINES);
  209.  
  210. glVertex3f(x*R, 0, 0);
  211. glVertex3f(x*R + normal[0], y + normal[1], z*R + normal[2]);
  212. glVertex3f(x*r, y+h, z*r);
  213. glVertex3f(x*r + normal[0], y+h + normal[1], z*r + normal[2]);
  214. glVertex3f(x1*R, y, z1*R);
  215. glVertex3f(x1*R + normal[0], y + normal[1], z1*R + normal[2]);
  216.  
  217. glEnd();
  218. }
  219. }
  220.  
  221. glBegin(GL_QUADS);
  222.  
  223.  
  224. x = cos(0.0);
  225. z = sin(0.0);
  226.  
  227. glVertex3f(0, y, 0);
  228. glVertex3f(R, y, 0);
  229. glVertex3f(r, y + h, 0);
  230. glVertex3f(0, y + h, 0);
  231.  
  232. PoliczNormal(0, R, 0, y, y, y+h, 0, 0, 0, normal);
  233. glNormal3f(normal[0], normal[1], normal[2]);
  234.  
  235. glVertex3f(0, y, 0);
  236. glVertex3f(0, y, R);
  237. glVertex3f(0, y + h, r);
  238. glVertex3f(0, y + h, 0);
  239. PoliczNormal(0, 0, 0, y, y, y+h, 0, R, 0, normal);
  240. glNormal3f(normal[0], normal[1], normal[2]);
  241.  
  242. glEnd();
  243.  
  244. }
  245.  
  246. void RysujKolo(float R, float y, int n)
  247. {
  248. float alfa;
  249. int i;
  250. float x;
  251. float z;
  252.  
  253. glColor3f(0.0, 0.0, 1.0);
  254. glBegin(GL_TRIANGLE_FAN);
  255.  
  256. glVertex3f(0, y, 0);
  257.  
  258. alfa = 90.0f / n;
  259. for (i = 0; i <= n; i++)
  260. {
  261. x = cos(0.0174532925f * i * alfa);
  262. z = sin(0.0174532925f * i * alfa);
  263.  
  264. glVertex3f(x * R, y + 0, z * R);
  265. }
  266.  
  267.  
  268. x = cos(0.0);
  269. z = sin(0.0);
  270.  
  271. // glVertex3f(x * R, y + 0, z * R);
  272.  
  273. glEnd();
  274. }
  275.  
  276.  
  277. void ScianaBoczna(float R, float h)
  278. {
  279. glColor3f(1, 0.0, 1); // sciana boczna
  280. glBegin(GL_TRIANGLE_STRIP);
  281. glVertex3f(0, h, 0);
  282. glVertex3f(R, 0, 0);
  283. glVertex3f(-R, 0, 0);
  284. glEnd();
  285.  
  286.  
  287. }
  288.  
  289.  
  290.  
  291. void RysujStozekZPodzialami(float R, float r, float h, int n, int m)
  292. {
  293. int i;
  294. float dR, dr, dh, y, tmp1, tmp2;
  295. dh = h / m; // wysokosc nowego stozka
  296. for (i = 0; i < m; i++)
  297. {
  298.  
  299. y = dh * i; // poczatkowa wysokosc
  300. tmp1 = y / h;
  301. tmp2 = (y + dh) / h;
  302. dR = R + (r - R) * tmp1; // promien dolnej podstawy nowego stozka
  303. dr = R + (r - R) * tmp2; // promien gornej podstawy nowego stozka
  304. if (i % 2 == 0)
  305. glColor3f(1.0, 1.0, 0.0);
  306. else
  307. glColor3f(0.0, 1.0, 1.0);
  308. RysujStozekBezPodstaw(dR, dr, y, dh, n);
  309. }
  310. RysujKolo(R, 0, n);
  311. RysujKolo(r, h, n);
  312. // ScianaBoczna(R, h);
  313. }
  314.  
  315. void RysujSzescian()
  316. {
  317.  
  318. // Pocztaek tworzenia ukladu wspolrzednych
  319. glBegin(GL_LINES);
  320.  
  321. // Os X
  322. glColor3f(1.0, 0.0, 0.0);
  323.  
  324. glVertex3f(-25.0, 0.0, 0.0);
  325. glVertex3f(25.0, 0.0, 0.0);
  326.  
  327. // Os Y
  328. glColor3f(0.0, 1.0, 0.0);
  329. glVertex3f(0.0, -25.0, 0.0);
  330. glVertex3f(0.0, 25.0, 0.0);
  331.  
  332. // Os Z
  333. glColor3f(0.0, 0.0, 1.0);
  334. glVertex3f(0.0, 0.0, -25.0);
  335. glVertex3f(0.0, 0.0, 25.0);
  336.  
  337. // Koniec tworzenia ukladu wspolrzednych
  338. glEnd();
  339. glColor3f(1.0, 1.0, 1.0);
  340. glShadeModel(GL_FLAT);
  341. // Sciany boczne
  342. glBegin(GL_QUAD_STRIP);
  343. glColor3f(1.0, 0, 0);
  344. glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  345. glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  346. glVertex3f(a / 2.0, a / 2.0, -a / 2.0);
  347. glVertex3f(a / 2.0, -a / 2.0, -a / 2.0);
  348.  
  349. glColor3f(1.0, 0.5, 0.5);
  350. glVertex3f(-a / 2.0, a / 2.0, -a / 2.0);
  351. glVertex3f(-a / 2.0, -a / 2.0, -a / 2.0);
  352. glColor3f(0.0, 1.0, 0);
  353. glVertex3f(-a / 2.0, a / 2.0, a / 2.0);
  354. glVertex3f(-a / 2.0, -a / 2.0, a / 2.0);
  355. glColor3f(0.0, 0, 1.0);
  356. glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  357. glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  358. glEnd();
  359.  
  360. // Gorna sciana
  361. glColor3f(0.5, 0.5, 1.0);
  362. glBegin(GL_QUAD_STRIP);
  363. glVertex3f(-a / 2.0, a / 2.0, a / 2.0);
  364. glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  365. glVertex3f(-a / 2.0, a / 2.0, -a / 2.0);
  366. glVertex3f(a / 2.0, a / 2.0, -a / 2.0);
  367. glEnd();
  368.  
  369. // Dolna sciana
  370. glBegin(GL_QUAD_STRIP);
  371. glColor3f(0.5, 0, 0.5);
  372. glVertex3f(-a / 2.0, -a / 2.0, a / 2.0);
  373. glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  374. glVertex3f(-a / 2.0, -a / 2.0, -a / 2.0);
  375. glVertex3f(a / 2.0, -a / 2.0, -a / 2.0);
  376. glEnd();
  377.  
  378.  
  379.  
  380. }
  381.  
  382.  
  383.  
  384. //////////////////////////////////////////////////////////////////////////////////////////
  385. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  386. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  387. void UstawParametryWidoku(int szer, int wys)
  388. {
  389. // Zapamietanie wielkosci widoku
  390. szerokoscOkna = szer;
  391. wysokoscOkna = wys;
  392.  
  393. // Ustawienie parametrow viewportu
  394. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  395.  
  396. // Przejscie w tryb modyfikacji macierzy rzutowania
  397. glMatrixMode(GL_PROJECTION);
  398. glLoadIdentity();
  399. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna / (float)wysokoscOkna, 1.0, 1000.0);
  400. }
  401.  
  402. void SwapLineFill(int zm1)
  403. {
  404. if (zm1 == 1)
  405. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  406. else
  407. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  408.  
  409. }
  410. //////////////////////////////////////////////////////////////////////////////////////////
  411. // Funkcja wyswietlajaca pojedyncza klatke animacji
  412. void WyswietlObraz(void)
  413. {
  414. // Wyczyszczenie bufora koloru i bufora glebokosci
  415. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  416.  
  417. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  418. glMatrixMode(GL_MODELVIEW);
  419.  
  420. // Zastapienie aktywnej macierzy macierza jednostkowa
  421. glLoadIdentity();
  422.  
  423. // Ustalenie polozenia obserwatora
  424. glTranslatef(0, 0, obsOdl);
  425. glRotatef(rotObsX, 1, 0, 0);
  426. glRotatef(rotObsY, 0, 1, 0);
  427. glRotatef(rotObsZ, 0, 0, 1);
  428. // Narysowanie szescianu
  429. // RysujSzescian();
  430. glColor3f(1, 1, 1);
  431. UstawSwiatlaIMaterialy();
  432. RysujStozekZPodzialami(1, 0, 3, zmienna, zmienna2);
  433. SwapLineFill(zm1);
  434. // Przelaczenie buforow ramki
  435. glutSwapBuffers();
  436. }
  437.  
  438.  
  439. //////////////////////////////////////////////////////////////////////////////////////////
  440. // Funkcja obslugi klawiatury
  441. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  442. {
  443. switch (klawisz)
  444. {
  445. case 'w':
  446. if (obsOdl < minOdl)
  447. obsOdl++;
  448. break;
  449.  
  450. case 's':
  451. if (obsOdl > maxOdl)
  452. obsOdl--;
  453. break;
  454.  
  455. case 'e':
  456. rotObsZ++;
  457. break;
  458.  
  459. case 'q':
  460. rotObsZ--;
  461. break;
  462. case 'i':
  463. zmienna = (zmienna > 4) ? zmienna - 1 : zmienna;
  464. break;
  465. case 'o':
  466. zmienna = (zmienna < 64) ? zmienna + 1 : zmienna;
  467. break;
  468. case 'k':
  469. zmienna2 = (zmienna2 > 4) ? zmienna2 - 1 : zmienna2;
  470. break;
  471. case 'l':
  472. zmienna2 = (zmienna2 < 64) ? zmienna2 + 1 : zmienna2;
  473. break;
  474. case '9':
  475. smooth = !smooth;
  476. SyncSmoothIFill();
  477. break;
  478. case '0':
  479. fill = !fill;
  480. SyncSmoothIFill();
  481. break;
  482. case '1':
  483. zm1 = 0;
  484. break;
  485. case '!':
  486. zm1 = 1;
  487. break;
  488. case '5':
  489. obecnymaterial++;
  490. if (obecnymaterial > 2)
  491. obecnymaterial = 0;
  492. break;
  493. case '6':
  494. zrodlo1 = !zrodlo1;
  495. break;
  496. case '7':
  497. zrodlo2 = !zrodlo2;
  498. break;
  499. case '8':
  500. normalne = !normalne;
  501. break;
  502. }
  503. }
  504.  
  505. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  506. {
  507. switch (klawisz)
  508. {
  509. case GLUT_KEY_UP:
  510. rotObsX++;
  511. break;
  512.  
  513. case GLUT_KEY_DOWN:
  514. rotObsX--;
  515. break;
  516.  
  517. case GLUT_KEY_LEFT:
  518. rotObsY++;
  519. break;
  520.  
  521. case GLUT_KEY_RIGHT:
  522. rotObsY--;
  523. break;
  524. }
  525. }
  526.  
  527. //////////////////////////////////////////////////////////////////////////////////////////
  528. // Glowna funkcja programu
  529. int main(int argc, char** argv)
  530. {
  531.  
  532. // Zainicjowanie biblioteki GLUT
  533. glutInit(&argc, argv);
  534.  
  535. // Ustawienie trybu wyswietlania
  536. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  537.  
  538. // Ustawienie polozenia dolenego lewego rogu okna
  539. glutInitWindowPosition(100, 100);
  540.  
  541. // Ustawienie rozmiarow okna
  542. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  543.  
  544. // Utworzenie okna
  545. glutCreateWindow("Szescian");
  546.  
  547. // Odblokowanie bufora glebokosci
  548. glEnable(GL_DEPTH_TEST);
  549.  
  550. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  551. glClearDepth(1000.0);
  552.  
  553. // Ustawienie koloru czyszczenia bufora ramki
  554. glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  555.  
  556. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  557.  
  558. //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  559.  
  560.  
  561. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  562. glutDisplayFunc(WyswietlObraz);
  563.  
  564. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  565. // zmieniane sa rozmiary okna
  566. glutReshapeFunc(UstawParametryWidoku);
  567.  
  568. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  569. // zadnych zadan
  570. glutIdleFunc(WyswietlObraz);
  571.  
  572. // Zarejestrowanie funkcji obslugi klawiatury
  573. glutKeyboardFunc(ObslugaKlawiatury);
  574.  
  575. //DOPISANE
  576. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  577.  
  578. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  579. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  580. glutMainLoop();
  581.  
  582. return 0;
  583. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement