Advertisement
Guest User

Untitled

a guest
Jan 24th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.86 KB | None | 0 0
  1. //////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
  4. // moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
  5. //
  6. //////////////////////////////////////////////////////////////////////////////////////////
  7. #include "glut.h"
  8. #include <math.h>
  9.  
  10. // Definicja stalych
  11. #define DLUGOSC_BOKU 5.0
  12. #define OBSERWATOR_ODLEGLOSC 100.0
  13. #define OBSERWATOR_OBROT_X 20.0
  14. #define OBSERWATOR_OBROT_Y 40.0
  15. #define OBSERWATOR_OBROT_Z 0.0
  16. #define OBSERWATOR_FOV_Y 30.0
  17. #define odlmin 2.0
  18. #define odlmax 200.0
  19. #define PI 3.1415926535
  20. #define DEG2RAD(x) ((float)(x)*PI/180.0)
  21.  
  22. // Zmienne globalne
  23. double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  24. int podzialPionowy = 20;
  25. int szerokoscOkna = 800;
  26. int wysokoscOkna = 600;
  27. GLfloat rotObsX = OBSERWATOR_OBROT_X;
  28. GLfloat rotObsY = OBSERWATOR_OBROT_Y;
  29. GLfloat rotObsZ = OBSERWATOR_OBROT_Z;
  30. GLfloat odlObs = OBSERWATOR_ODLEGLOSC;
  31.  
  32.  
  33. int source1 = 1;
  34. int source2 = 1;
  35. int obecnymaterial = 0;
  36. int normalne = 0;
  37. int smooth = 1;
  38. int fill = 1;
  39. float length;
  40.  
  41.  
  42. // Tablica parametrow materialu nr 1
  43. float material1[5][4] = {
  44. {0.329412, 0.223529, 0.027451, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  45. {0.780392, 0.568627, 0.113725, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  46. {0.992157, 0.941176, 0.807843, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  47. {21.2, 0.0, 0.0, 0.0}, // [3] polysk
  48. {0.2, 0.1, 0.2, 1.0} }; // [4] kolor swiatla emitowanego
  49.  
  50. // Tablica parametrow materialu nr 2
  51. float material2[5][4] = {
  52. {0.212500, 0.127500, 0.054000, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  53. {0.714000, 0.428400, 0.181440, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  54. {0.393548, 0.271906, 0.166721, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  55. {56.8, 0.0, 0.0, 0.0}, // [3] polysk
  56. {0.0, 0.2, 0.6, 1.0} }; // [4] kolor swiatla emitowanego
  57.  
  58. // Tablica parametrow materialu nr 3
  59. float material3[5][4] = {
  60. {0.021500, 0.174500, 0.021500, 0.550000}, // [0] wspolczynnik odbicia swiatla otoczenia
  61. {0.075680, 0.614240, 0.075680, 0.550000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  62. {0.633000, 0.727811, 0.633000, 0.550000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  63. {72.2, 0.0, 0.0, 0.0}, // [3] polysk
  64. {0.0, 0.5, 0.1, 1.0} }; // [4] kolor swiatla emitowanego
  65.  
  66. // Tablica parametrow zrodla swiatla nr 1
  67. GLfloat swiatlo1[5][4] = {
  68. {0.8, 0.8, 0, 1.0}, // [0] otoczenie
  69. {0.8, 0.8, 0.0, 1.0}, // [1] rozproszenie
  70. {0.8, 0.8, 0.0, 1.0}, // [2] lustrzane
  71. {0, 10.0, 0, 1.0}, // [3] polozenie
  72. {-1.0, -1.0, -1.0, 0.0} // [4] kierunek swiecenia
  73. };
  74.  
  75. // Tablica parametrow zrodla swiatla nr 2
  76. GLfloat swiatlo2[5][4] = {
  77. {0, 1, 1, 1.0}, // [0] otoczenie
  78. {0, 1, 1, 1.0}, // [1] rozproszenie
  79. {0, 18, 1, 1.0}, // [2] lustrzane
  80. {0, -10.0, 0, 1.0}, // [3] polozenie
  81. {-1.0, -1.0, -1.0, 0.0} // [4] kierunek swiecenia
  82. };
  83.  
  84.  
  85. // Prototypy funkcji
  86. void RysujSzescian(double a);
  87. void UstawParametryWidoku(int szer, int wys);
  88. void WyswietlObraz(void);
  89. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  90. void PoliczNormal(float x1, float x2, float x3, float y1, float y2, float y3, float z1, float z2, float z3, float* normal);
  91.  
  92. void RysujTekstRastrowy(void* font, char* tekst)
  93. {
  94. int i = 0;
  95. while (tekst[i] != '\0')
  96. {
  97. glutBitmapCharacter(font, tekst[i]);
  98. i++;
  99. }
  100. }
  101.  
  102. #define numberofoptions 11
  103.  
  104. void RysujNakladke(void)
  105. {
  106. char tab[numberofoptions][50] =
  107. { "w - Oddalenie",
  108. "q - Przyblizenie",
  109. "5 - Zmiana materialu pierscienia",
  110. "6 - Sterowanie swiatlem nr. 1",
  111. "7 - Sterowanie swiatlem nr. 2",
  112. "8 - Widocznosc wektorow normalnych",
  113. "9 - Zmiana cienia (GL_SMOOTH i GL_FLAT)",
  114. "0 - Zmiana wypelnienia (GL_FILL, GL_LINE)",
  115. "z - Zmniejszanie ilosci podzialow",
  116. "x - Zwiekszanie ilosci podzialow",
  117. "Strzalki oraz , . - Sterowanie kamera",
  118. };
  119. int i;
  120.  
  121. // Zmiana typu rzutu z perspektywicznego na ortogonalny
  122. glMatrixMode(GL_PROJECTION);
  123. glPushMatrix();
  124. glLoadIdentity();
  125. glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
  126.  
  127. // Modelowanie sceny 2D (zawartosci nakladki)
  128. glMatrixMode(GL_MODELVIEW);
  129. glPushMatrix();
  130. glLoadIdentity();
  131.  
  132. // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
  133. glDisable(GL_LIGHTING);
  134.  
  135. // Okreslenie koloru tekstu
  136. glColor3f(1.0, 1.0, 1.0);
  137.  
  138. // RYSOWANIE MENU PARAMETROW ZRODLA SWIATLA
  139.  
  140. for (i = 0; i < numberofoptions; i++)
  141. {
  142. glRasterPos2i(10, 10 + i * 13);
  143. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, tab[numberofoptions - i - 1]);
  144. }
  145.  
  146. glMatrixMode(GL_PROJECTION);
  147. glPopMatrix();
  148. glMatrixMode(GL_MODELVIEW);
  149. glPopMatrix();
  150. }
  151.  
  152. void UstawSwiatlaIMaterialy()
  153. {
  154. glEnable(GL_LIGHTING);
  155. glEnable(GL_BLEND);
  156. // Odblokowanie zrodla swiatla nr 1
  157. if (source1 == 1) {
  158. glEnable(GL_LIGHT0);
  159. glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo1[0]);
  160. glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo1[1]);
  161. glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo1[2]);
  162. glLightfv(GL_LIGHT0, GL_POSITION, swiatlo1[3]);
  163. glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo1[4]);
  164.  
  165. }
  166. else {
  167. //wylaczenie zrodla swiatla nr 1
  168. glDisable(GL_LIGHT0);
  169. }
  170. // Odblokowanie zrodla swiatla nr 2
  171. if (source2 == 1) {
  172. glEnable(GL_LIGHT1);
  173. glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo2[0]);
  174. glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo2[1]);
  175. glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo2[2]);
  176. glLightfv(GL_LIGHT1, GL_POSITION, swiatlo2[3]);
  177. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo2[4]);
  178.  
  179. }
  180. else {
  181. //wylaczenie zrodla swiatla nr 2
  182. glDisable(GL_LIGHT1);
  183. }
  184.  
  185. switch (obecnymaterial)
  186. {
  187. case 0:
  188. glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
  189. glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
  190. glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
  191. glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
  192. glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
  193. break;
  194. case 1:
  195. glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
  196. glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
  197. glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
  198. glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
  199. glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
  200. break;
  201. case 2:
  202. glMaterialfv(GL_FRONT, GL_AMBIENT, material3[0]);
  203. glMaterialfv(GL_FRONT, GL_DIFFUSE, material3[1]);
  204. glMaterialfv(GL_FRONT, GL_SPECULAR, material3[2]);
  205. glMaterialfv(GL_FRONT, GL_SHININESS, material3[3]);
  206. glMaterialfv(GL_FRONT, GL_EMISSION, material3[4]);
  207. break;
  208. default:
  209. break;
  210. }
  211. }
  212.  
  213. void PoliczNormal(float x1, float x2, float y1, float y2, float z1, float z2, float* normal)
  214. {
  215. //glDisable(GL_LIGHTING);
  216. //glBegin(GL_LINES);
  217. //glColor3f(1, 0, 0);
  218.  
  219.  
  220. float xa = x2 - x1;
  221. float ya = y2 - y1;
  222. float za = z2 - z1;
  223.  
  224. //float xb = x3 - x1;
  225. //float yb = y3 - y1;
  226. //float zb = z3 - z1;
  227.  
  228. normal[0] = ya - za;
  229. normal[1] = za - xa;
  230. normal[2] = xa - ya;
  231.  
  232. length = sqrtf(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
  233.  
  234. normal[0] /= length;
  235. normal[1] /= length;
  236. normal[2] /= length;
  237. //glEnd();
  238. //glEnable(GL_LIGHTING);
  239. }
  240.  
  241. void SyncSmoothIFill()
  242. {
  243. if (smooth)
  244. glShadeModel(GL_SMOOTH);
  245. else
  246. glShadeModel(GL_FLAT);
  247.  
  248. if (fill)
  249. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  250. else
  251. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  252. }
  253.  
  254. // Prototypy funkcji
  255. void RysujSzescian(double a);
  256. void UstawParametryWidoku(int szer, int wys);
  257. void WyswietlObraz(void);
  258. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  259.  
  260. //////////////////////////////////////////////////////////////////////////////////////////
  261. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  262. // Srodek szescianu znajduje się w punkcie (0,0,0).
  263. void RysujSzescian(double a)
  264. {
  265. // Sciany boczne
  266. glBegin(GL_QUAD_STRIP);
  267. glVertex3f(a/2.0, a/2.0, a/2.0);
  268. glVertex3f(a/2.0, -a/2.0, a/2.0);
  269. glVertex3f(a/2.0, a/2.0, -a/2.0);
  270. glVertex3f(a/2.0, -a/2.0, -a/2.0);
  271.  
  272. glVertex3f(-a/2.0, a/2.0, -a/2.0);
  273. glVertex3f(-a/2.0, -a/2.0, -a/2.0);
  274.  
  275. glVertex3f(-a/2.0, a/2.0, a/2.0);
  276. glVertex3f(-a/2.0, -a/2.0, a/2.0);
  277.  
  278. glVertex3f(a/2.0, a/2.0, a/2.0);
  279. glVertex3f(a/2.0, -a/2.0, a/2.0);
  280. glEnd();
  281.  
  282. // Gorna sciana
  283. glBegin(GL_QUAD_STRIP);
  284. glVertex3f(-a/2.0, a/2.0, a/2.0);
  285. glVertex3f(a/2.0, a/2.0, a/2.0);
  286. glVertex3f(-a/2.0, a/2.0, -a/2.0);
  287. glVertex3f(a/2.0, a/2.0, -a/2.0);
  288. glEnd();
  289.  
  290. // Dolna sciana
  291. glBegin(GL_QUAD_STRIP);
  292. glVertex3f(-a/2.0, -a/2.0, a/2.0);
  293. glVertex3f(a/2.0, -a/2.0, a/2.0);
  294. glVertex3f(-a/2.0, -a/2.0, -a/2.0);
  295. glVertex3f(a/2.0, -a/2.0, -a/2.0);
  296. glEnd();
  297. }
  298.  
  299. void RysujStozek(int N)
  300. {
  301. double R = 5, r = 25, h = 20;
  302. int i = 0;
  303. glColor3f(1, 0, 0);
  304.  
  305. glBegin(GL_TRIANGLE_FAN); // gorna podstawa
  306. glVertex3f(0, 20, 0);
  307. for (i = 0; i * 360 / N <= 360; i++)
  308. {
  309. glVertex3f(r * cos(DEG2RAD(i * 360 / N)), h, r * sin(DEG2RAD(i * 360 / N)));
  310. }
  311. glEnd();
  312. glColor3f(1, 1, 0);
  313.  
  314. glBegin(GL_TRIANGLE_FAN); // dolna podstawa
  315. glVertex3f(0, 0, 0);
  316. for (i = 0; i * 360 / N <= 360; i++)
  317. {
  318. glVertex3f(R * cos(DEG2RAD(i * 360 / N)), 0, R * sin(DEG2RAD(i * 360 / N)));
  319. }
  320. glEnd();
  321.  
  322. glColor3f(1, 0, 1);
  323. glBegin(GL_QUAD_STRIP); //powierzchnia boczna
  324. for (i = 0; i * 360.0 / N <= 360.0; i++)
  325. {
  326. glVertex3f(r * cos(DEG2RAD(i * 360 / N)), h, r * sin(DEG2RAD(i * 360 / N)));
  327. glVertex3f(R * cos(DEG2RAD(i * 360 / N)), 0, R * sin(DEG2RAD(i * 360 / N)));
  328. }
  329. glEnd();
  330.  
  331.  
  332. }
  333.  
  334. void wektory(int N)
  335. {
  336. int i = 0;
  337. int r = 15;
  338. int ramie = 4;
  339. float dAlfa = 360.0 / N;
  340. glDisable(GL_LIGHTING);
  341. glBegin(GL_LINES);
  342. glColor3f(1, 0, 1);
  343. for (i = 0; i * 360.0 / N <= 360.0; i++)
  344. {
  345. glVertex3f((r)*cos(DEG2RAD(i * 360 / N)), 0, (r)*sin(DEG2RAD(i * 360 / N)));
  346. glVertex3f((r)*cos(DEG2RAD(i * 360 / N)), -1, (r)*sin(DEG2RAD(i * 360 / N)));
  347. glVertex3f((r - 1) * cos(DEG2RAD(i * dAlfa)), 0, (r - 1) * sin(DEG2RAD(i * dAlfa)));
  348. glVertex3f((r)*cos(DEG2RAD(i * dAlfa)), 0, (r)*sin(DEG2RAD(i * dAlfa)));
  349.  
  350. glVertex3f((r + ramie) * cos(DEG2RAD(i * 360 / N)), -1, (r + ramie) * sin(DEG2RAD(i * 360 / N)));
  351. glVertex3f((r + ramie) * cos(DEG2RAD(i * 360 / N)), 0, (r + ramie) * sin(DEG2RAD(i * 360 / N)));
  352. glVertex3f(r * cos(DEG2RAD((i)*dAlfa)), 4, r * sin(DEG2RAD((i)*dAlfa)));
  353. glVertex3f((r + (1 / sqrt(2))) * cos(DEG2RAD((i)*dAlfa)), 4 + (1 / sqrt(2)), (r + (1 / sqrt(2))) * sin(DEG2RAD((i)*dAlfa)));
  354.  
  355. glVertex3f((r - 1) * cos(DEG2RAD(i * dAlfa)), ramie, (r - 1) * sin(DEG2RAD(i * dAlfa)));
  356. glVertex3f((r)*cos(DEG2RAD(i * dAlfa)), ramie, (r)*sin(DEG2RAD(i * dAlfa)));
  357. glVertex3f((r + 4) * cos(DEG2RAD((i)*dAlfa)), 0, (r + 4) * sin(DEG2RAD((i)*dAlfa)));
  358. glVertex3f((r + 4 + (1 / sqrt(2))) * cos(DEG2RAD((i)*dAlfa)), (1 / sqrt(2)), (r + 4 + (1 / sqrt(2))) * sin(DEG2RAD((i)*dAlfa)));
  359.  
  360. }
  361.  
  362. glEnd();
  363. glEnable(GL_LIGHTING);
  364. }
  365.  
  366. void RysujPierscien(int N)
  367. {
  368. int i;
  369. int r = 15, ramie = 4;
  370. float x1, x2;
  371. float z1, z2;
  372. float y1, y2;
  373. float normal[3];
  374. int dAlfa = 360 / N;
  375. //przeciwprostokątna
  376.  
  377. for (i = 0; i * 360.0 / N <= 360.0; i++)
  378. {
  379.  
  380. glNormal3f((1 / sqrt(2)) * cos(DEG2RAD(i * dAlfa)), 1 / sqrt(2), -(1 / sqrt(2)) * sin(DEG2RAD(i * dAlfa)));
  381. glColor3f(1, 0, 1);
  382. glBegin(GL_QUAD_STRIP);
  383. glVertex3f(r * cos(DEG2RAD(i * 360 / N)), ramie, r * sin(DEG2RAD(i * 360 / N)));
  384. glVertex3f((r + ramie) * cos(DEG2RAD(i * 360 / N)), 0, (r + ramie) * sin(DEG2RAD(i * 360 / N)));
  385.  
  386. }
  387. glEnd();
  388.  
  389.  
  390. //przyprostokątna 1.
  391.  
  392. for (i = 0; i * 360.0 / N <= 360.0; i++)
  393. {
  394. glNormal3f(cos(DEG2RAD(i * dAlfa)), 0, sin(DEG2RAD(i * 360 / N)));
  395. glColor3f(1, 1, 0);
  396. glBegin(GL_QUAD_STRIP);
  397. glVertex3f(r * cos(DEG2RAD(i * 360 / N)), ramie, r * sin(DEG2RAD(i * 360 / N)));
  398. glVertex3f(r * cos(DEG2RAD(i * 360 / N)), 0, r * sin(DEG2RAD(i * 360 / N)));
  399.  
  400.  
  401. }
  402. glEnd();
  403.  
  404. //przyprostokątna 2.
  405.  
  406. for (i = 0; i * 360.0 / N <= 360.0; i++)
  407. {
  408. glNormal3f((1 / sqrt(2)) * cos(DEG2RAD(i * dAlfa)), 1 / sqrt(2), (1 / sqrt(2) * sin(DEG2RAD(i * dAlfa))));
  409. glColor3f(0, 1, 0);
  410. glBegin(GL_QUAD_STRIP);
  411. glVertex3f(r * cos(DEG2RAD(i * 360 / N)), 0, r * sin(DEG2RAD(i * 360 / N)));
  412. glVertex3f((r + ramie) * cos(DEG2RAD(i * 360 / N)), 0, (r + ramie) * sin(DEG2RAD(i * 360 / N)));
  413.  
  414. }
  415. glEnd();
  416. }
  417.  
  418. //////////////////////////////////////////////////////////////////////////////////////////
  419. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  420. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  421. void UstawParametryWidoku(int szer, int wys)
  422. {
  423. // Zapamietanie wielkosci widoku
  424. szerokoscOkna = szer;
  425. wysokoscOkna = wys;
  426.  
  427. // Ustawienie parametrow viewportu
  428. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  429.  
  430. // Przejscie w tryb modyfikacji macierzy rzutowania
  431. glMatrixMode(GL_PROJECTION);
  432. glLoadIdentity();
  433. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
  434. }
  435.  
  436. //////////////////////////////////////////////////////////////////////////////////////////
  437. // Funkcja wyswietlajaca pojedyncza klatke animacji
  438. void WyswietlObraz(void)
  439. {
  440. // Wyczyszczenie bufora koloru i bufora glebokosci
  441. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  442.  
  443. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  444. glMatrixMode(GL_MODELVIEW);
  445.  
  446. // Zastapienie aktywnej macierzy macierza jednostkowa
  447. glLoadIdentity();
  448.  
  449. // Ustalenie polozenia obserwatora
  450. glTranslatef(0, 0, -odlObs);
  451. glRotatef(rotObsX, 1, 0, 0);
  452. glRotatef(rotObsY, 0, 1, 0);
  453. glRotatef(rotObsZ, 0, 0, 1);
  454.  
  455. //glBegin(GL_LINES);
  456.  
  457. //// Rysowanie układu współrzędnych
  458. //// Os X
  459. //glColor3f(1.0, 0.0, 0.0);
  460. //glVertex3f(-500.0, 0.0, 0.0);
  461. //glVertex3f(500.0, 0.0, 0.0);
  462.  
  463. //// Os Y
  464. //glColor3f(0.0, 1.0, 0.0);
  465. //glVertex3f(0.0, -500.0, 0.0);
  466. //glVertex3f(0.0, 500.0, 0.0);
  467.  
  468. //// Os Z
  469. //glColor3f(0.0, 0.0, 1.0);
  470. //glVertex3f(0.0, 0.0, -500.0);
  471. //glVertex3f(0.0, 0.0, 500.0);
  472.  
  473. //// Koniec tworzenia ukladu wspolrzednych
  474. //glEnd();
  475.  
  476. glColor3f(1.0, 1.0, 1.0);
  477.  
  478. //Narysowanie sześcianu
  479. //RysujSzescian(bok);
  480.  
  481. //Narysowanie stożka
  482. //RysujStozek(podzialPionowy);
  483.  
  484.  
  485. RysujNakladke();
  486.  
  487. UstawSwiatlaIMaterialy();
  488.  
  489. if (normalne)
  490. wektory(podzialPionowy);
  491.  
  492. //Narysowanie pierścienia
  493. RysujPierscien(podzialPionowy);
  494.  
  495. // Przelaczenie buforow ramki
  496. glutSwapBuffers();
  497. }
  498.  
  499. //////////////////////////////////////////////////////////////////////////////////////////
  500. // Funkcja klawiszy specjalnych
  501. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  502. {
  503. switch (klawisz)
  504. {
  505. case GLUT_KEY_UP:
  506. rotObsX = rotObsX + 1.0;
  507. break;
  508.  
  509. case GLUT_KEY_DOWN:
  510. rotObsX = rotObsX - 1.0;
  511. break;
  512.  
  513. case GLUT_KEY_LEFT:
  514. rotObsY = rotObsY - 1.0;
  515. break;
  516.  
  517. case GLUT_KEY_RIGHT:
  518. rotObsY = rotObsY + 1.0;
  519. break;
  520. }
  521. }
  522.  
  523. //////////////////////////////////////////////////////////////////////////////////////////
  524. // Funkcja obslugi klawiatury
  525. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  526. {
  527. if (klawisz == '+')
  528. bok *= 2.0;
  529. else if (klawisz == '-')
  530. bok /= 2.0;
  531. else if (klawisz == 27)
  532. exit(0);
  533.  
  534. switch (klawisz)
  535. {
  536. case 'q':
  537. odlObs = (odlObs > odlmin) ? odlObs - 1 : odlObs;
  538. break;
  539. case 'w':
  540. odlObs = (odlObs < odlmax) ? odlObs + 1 : odlObs;
  541. break;
  542. case ',':
  543. rotObsZ = rotObsZ - 1.0;
  544. break;
  545. case '.':
  546. rotObsZ = rotObsZ + 1.0;
  547. break;
  548. case 'z':
  549. podzialPionowy = (podzialPionowy > 4) ? podzialPionowy - 1.0 : podzialPionowy;
  550. break;
  551. case 'x':
  552. podzialPionowy = (podzialPionowy < 64) ? podzialPionowy + 1.0 : podzialPionowy;
  553. break;
  554.  
  555. case '5':
  556. obecnymaterial++;
  557. if (obecnymaterial > 2)
  558. obecnymaterial = 0;
  559. break;
  560. case '6':
  561. source1 = !source1;
  562. break;
  563. case '7':
  564. source2 = !source2;
  565. break;
  566. case '8':
  567. normalne = !normalne;
  568. break;
  569. case '9':
  570. smooth = !smooth;
  571. SyncSmoothIFill();
  572. break;
  573. case '0':
  574. fill = !fill;
  575. SyncSmoothIFill();
  576. break;
  577. }
  578. }
  579.  
  580. //////////////////////////////////////////////////////////////////////////////////////////
  581. // Glowna funkcja programu
  582. int main(int argc, char **argv)
  583. {
  584. // Zainicjowanie biblioteki GLUT
  585. glutInit(&argc, argv);
  586.  
  587. // Ustawienie trybu wyswietlania
  588. glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  589.  
  590. // Ustawienie polozenia dolenego lewego rogu okna
  591. glutInitWindowPosition(100, 100);
  592.  
  593. // Ustawienie rozmiarow okna
  594. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  595.  
  596. // Utworzenie okna
  597. glutCreateWindow("Pierścień");
  598.  
  599. // Odblokowanie bufora glebokosci
  600. glEnable(GL_DEPTH_TEST);
  601.  
  602. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  603. glClearDepth(1000.0);
  604.  
  605. // Ustawienie koloru czyszczenia bufora ramki
  606. glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
  607.  
  608. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  609. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  610.  
  611. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  612. glutDisplayFunc(WyswietlObraz);
  613.  
  614. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  615. // zmieniane sa rozmiary okna
  616. glutReshapeFunc(UstawParametryWidoku);
  617.  
  618. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  619. // zadnych zadan
  620. glutIdleFunc(WyswietlObraz);
  621.  
  622. // Zarejestrowanie funkcji obslugi klawiatury
  623. glutKeyboardFunc(ObslugaKlawiatury);
  624.  
  625. // Zarejestrowanie funkcji obslugi klawiszy specjalnych
  626. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  627.  
  628. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  629. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  630. glutMainLoop();
  631.  
  632. return 0;
  633. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement