Advertisement
Guest User

Untitled

a guest
Jan 21st, 2020
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 36.70 KB | None | 0 0
  1. //////////////////////////////////////////////////////////////////////////////////////////
  2. //////////////////////////////////////////////////////////////////////////////////////////
  3.  
  4. #include <math.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <GL/glut.h>
  8. #include "materials.h"
  9. #define PI 3.14159265
  10.  
  11. // Definicja stalych
  12. #define LPOZ_MAX 100
  13. #define LPOZ_MIN 3
  14. #define LPION_MAX 100
  15. #define LPION_MIN 3
  16. #define R_MAX 10.0
  17. #define WYS_MAX 10.0
  18. #define KROK_FLOAT 0.1
  19. #define X_OFFSET_SWIATLO1 10
  20. #define Y_OFFSET_SWIATLO1 120
  21. #define X_OFFSET_SWIATLO2 10
  22. #define Y_OFFSET_SWIATLO2 120
  23. #define X_OFFSET_MAT 10
  24. #define Y_OFFSET_MAT 220
  25. #define X_OFFSET_OBIEKT 10
  26. #define Y_OFFSET_OBIEKT 300
  27. #define ID_MENU_SWIATLA 0
  28. #define ID_MENU_MATERIALU 1
  29. #define LPOZ_MENU_SWIATLA 10
  30. #define LPOZ_MENU_MATERIALU 5
  31. #define M_PI 3.14159
  32. int N = 64;
  33. int M = 64;
  34. float length = 0;
  35. int normalne = 1;
  36. GLfloat OBSERWATOR_OBROT_X = 20.0;
  37. GLfloat OBSERWATOR_OBROT_Y = 20.0;
  38. GLfloat OBSERWATOR_OBROT_Z = 0;
  39. GLfloat OBSERWATOR_ODLEGLOSC = 20.0;
  40. GLUquadricObj* podstawaSciany;
  41. #define X_OFFSET_SWIATLO 10
  42. #define Y_OFFSET_SWIATLO 190
  43.  
  44.  
  45.  
  46. // Makro przeliczajace stopnie na radiany
  47. #define DEG2RAD(x) ((float)(x)*M_PI/180.0)
  48.  
  49. // Zmienne globalne
  50. double kat2 = 0;
  51. double kat = 0.0; // Kat obrotu obserwatora wokol osi OY [stopnie]
  52. int lPionowych; // Liczba podzialow pionowych
  53. int lPoziomych; // Liczba podzialow poziomych
  54. double promien; // Promien walca
  55. double wysokosc; // Wysokosc walca
  56. int sIndeks; // Wybrana pozycja w tablicy parametrow swiatla
  57. int mIndeks; // Wybrana pozycja w tablicy parametrow materialu
  58. int menu; // Identyfikator wybranego menu (menu swiatla lub menu materialu)
  59. int szerokoscOkna = 800;
  60. int wysokoscOkna = 600;
  61. int smooth = 1;
  62. int fill = 1;
  63. int zrodlo1 = 1;
  64. int zrodlo2 = 1;
  65. int predkosc = 1;
  66. int odleglosc = 10;
  67. int katx = 0;
  68. int zmienna = 5;
  69. int zmienna2 = 5;
  70. int mat1=0;
  71. int mat2=0;
  72.  
  73. // Tablica parametrow swiatla 1
  74. GLfloat swiatlo1[10][4] = {
  75. {0.0, 0.0, 0.0, 1.0}, // [0] otoczenie
  76. {1.0, 1.0, 1.0, 1.0}, // [1] rozproszenie
  77. {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
  78. {0.0, 0.0, 1.0, 1.0}, // [3] polozenie
  79. {-1.0, 0.0, 0.0, 0.0}, // [4] kierunek swiecenia
  80. {0.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
  81. {30.0, 0.0, 0.0, 0.0},// [6] kat odciecia swiatla
  82. {1.0, 0.0, 0.0, 0.0}, // [7] stale tlumienie
  83. {0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
  84. {0.0, 0.0, 0.0, 0.0} }; // [9] tlumienie kwadratowe
  85.  
  86. // Tablica parametrow zrodla swiatla nr 1
  87. GLfloat swiatlo2[10][4] = {
  88. {0,0.7, 0, 1.0}, // [0] otoczenie
  89. {0, 0.7, 0, 1.0}, // [1] rozproszenie
  90. {0, 18, 1, 1.0}, // [2] lustrzane
  91. {10, 10.0, 10.0, 1.0},// [3] polozenie
  92. {-1.0, -1.0, -1.0, 0.0},// [4] kierunek swiecenia
  93. {0.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
  94. {180.0, 0.0, 0.0, 0.0},// [6] kat odciecia swiatla
  95. {1.0, 0.0, 0.0, 0.0}, // [7] stale tlumienie
  96. {0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
  97. {0.0, 0.0, 0.0, 0.0} }; // [9] tlumienie kwadratowe
  98.  
  99. float material1[5][4] = {
  100. {0.021500, 0.174500, 0.021500, 0.550000}, // [0] wspolczynnik odbicia swiatla otoczenia
  101. {0.075680, 0.614240, 0.075680, 0.550000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  102. {0.633000, 0.727811, 0.633000, 0.550000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  103. {76.8, 0.0, 0.0, 0.0}, // [3] polysk
  104. {0.0, 0.0, 0.0, 1.0}}; // [4] kolor swiatla emitowanego
  105. // Tablica parametrow materialu nr 2
  106. float material2[5][4] = {
  107. {0.250000, 0.148000, 0.064750, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  108. {0.400000, 0.236800, 0.103600, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  109. {0.774597, 0.458561, 0.200621, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  110. {76.8, 0.0, 0.0, 0.0}, // [3] polysk
  111. {0.0, 0.0, 0.0, 1.0}}; // [4] kolor swiatla emitowanego
  112. float material3[5][4] = {
  113. {0.247250, 0.199500, 0.074500, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  114. {0.751640, 0.606480, 0.226480, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  115. {0.628281, 0.555802, 0.366065, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  116. {52.2, 0.0, 0.0, 0.0}, // [3] polysk
  117. {0.0, 0.0, 0.0, 1.0}}; // [4] kolor swiatla emitowanego
  118.  
  119. // Zerowy parametr Emission
  120. const GLfloat Emission[4] = {0.0 , 0.0, 0.0, 0.0};
  121.  
  122.  
  123. // Tablica parametrow materialu z jakiego wykonany jest walec
  124. GLfloat material[6][4];
  125.  
  126. // Prototypy funkcji
  127. void UstawDomyslneWartosciParametrow(void);
  128. void RysujTekstRastrowy(void *font, char *tekst);
  129. void UstawKolorPozycji(int m, int indeks);
  130. void WlaczOswietlenie(void);
  131. void DefiniujMaterial(void);
  132. void UstawParametryOswietlenia(int indeks, char operacja);
  133. void UstawParametryMaterialu(int indeks, char operacja);
  134. //void RysujWalec(double h, double r, int nv, int nh);
  135. void rysujStozek();
  136. void UstawParametryWidoku(int szer, int wys);
  137. void RysujNakladke(void);
  138. void WyswietlObraz(void);
  139. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  140. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y);
  141. GLboolean tryb = GL_TRUE;
  142.  
  143.  
  144. //////////////////////////////////////////////////////////////////////////////////////////
  145. void zmianaMaterialu(){
  146. if(mat1==1){
  147. glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
  148. glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
  149. glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
  150. glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
  151. glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
  152. }
  153. else if(mat2==1){
  154. glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
  155. glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
  156. glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
  157. glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
  158. glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
  159. }
  160. else{
  161. glMaterialfv(GL_FRONT, GL_AMBIENT, material3[0]);
  162. glMaterialfv(GL_FRONT, GL_DIFFUSE, material3[1]);
  163. glMaterialfv(GL_FRONT, GL_SPECULAR, material3[2]);
  164. glMaterialfv(GL_FRONT, GL_SHININESS, material3[3]);
  165. glMaterialfv(GL_FRONT, GL_EMISSION, material3[4]);
  166. }
  167.  
  168.  
  169. }
  170.  
  171. void ZmianaTrybu()
  172. {
  173. if (tryb == GL_TRUE)
  174. {
  175. tryb = GL_FALSE;
  176. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  177. }
  178. else if (tryb == GL_FALSE)
  179. {
  180. tryb = GL_TRUE;
  181. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  182. }
  183. }
  184.  
  185. // Funkcja ustawiajaca domyslne parametry walca, materialu i zrodla swiatla
  186. void UstawDomyslneWartosciParametrow(void)
  187. {
  188. // Tablica parametrow materialu
  189. GLfloat param_materialu[6][4] = {
  190. {0.2, 0.2, 0.2, 1.0}, // [0] wspolczynnik odbicia swiatla otoczenia
  191. {0.8, 0.8, 0.8, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
  192. {0.0, 0.0, 0.0, 1.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
  193. {0.0, 0.0, 0.0, 0.0}, // [3] polysk
  194. {0.0, 0.0, 0.0, 1.0}}; // [4] kolor swiatla emitowanego
  195.  
  196.  
  197.  
  198. // Skopiowanie zawartosci tablic param_* do tablic globalnych
  199.  
  200. memcpy(material, param_materialu, LPOZ_MENU_MATERIALU*4*sizeof(GLfloat));
  201.  
  202. // Skopiowanie Właściwości materiału - złoto
  203. memcpy(material[0], PolishedGoldAmbient, 4*sizeof(GLfloat));
  204. memcpy(material[1], PolishedGoldDiffuse, 4*sizeof(GLfloat));
  205. memcpy(material[2], PolishedGoldSpecular, 4*sizeof(GLfloat));
  206. memcpy(material[3], &PolishedGoldShininess, 4*sizeof(GLfloat));
  207. memcpy(material[4], Emission, 4*sizeof(GLfloat));
  208.  
  209. // Parametry walca
  210. lPionowych = 20; // Liczba podzialow pionowych
  211. lPoziomych = 20; // Liczba podzialow poziomych
  212. promien = 3.0; // Promien walca
  213. wysokosc = 3.0; // Wysokosc walca
  214.  
  215. // Pozostale parametry
  216. sIndeks = 0; // Wybrana pozycja w tablicy parametrow swiatla
  217. mIndeks = 0; // Wybrana pozycja w tablicy parametrow materialu
  218. menu = ID_MENU_SWIATLA;
  219.  
  220. glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
  221. }
  222.  
  223. //////////////////////////////////////////////////////////////////////////////////////////
  224. // Funkcja rysujaca tekst rastrowy <tekst> za pomca fontow bitmapowych <font>.Rysowanie
  225. // tekstu wykonywane jest poczawszy od biezacej pozycji ekranu.
  226. void RysujTekstRastrowy(void *font, char *tekst)
  227. {
  228. int i;
  229.  
  230. for (i = 0; i < (int)strlen(tekst); i++)
  231. glutBitmapCharacter(font, tekst[i]);
  232. }
  233.  
  234. //////////////////////////////////////////////////////////////////////////////////////////
  235. // Funkcja ustawia kolor dla pozycji <indeks> w menu <m>. Aktualnie wybrana pozycja
  236. // jest rysowana w kolorze zoltym.
  237. void UstawKolorPozycji(int m, int indeks)
  238. {
  239. if (m == menu)
  240. if((m == ID_MENU_SWIATLA) && (indeks == sIndeks)
  241. || (m == ID_MENU_MATERIALU) && (indeks == mIndeks))
  242.  
  243. // Pozycja podswietlona wyswietlana jest w kolkorze zoltym
  244. glColor3f(1.0, 1.0, 0.0);
  245. else
  246.  
  247. // Pozostale na bialo
  248. glColor3f(1.0, 1.0, 0.0);
  249. }
  250.  
  251. void powBocznaWalca(float R, float r, float y, float h, int n)
  252. {
  253. float alfa;
  254. int i;
  255. float x;
  256. float z;
  257. glColor3f(0,1,1);
  258. glBegin(GL_QUAD_STRIP);
  259.  
  260. alfa = 360.0/n;
  261. for(i=0;i<=n;i++)
  262. {
  263. x = cos(0.0174532925f*i*alfa);
  264. z = sin(0.0174532925f*i*alfa);
  265.  
  266. glVertex3f(x*R,y+0,z*R);
  267. glVertex3f(x*r,y+h,z*r);
  268. }
  269.  
  270.  
  271. x = cos(0.0);
  272. z = sin(0.0);
  273.  
  274. glVertex3f(x*R,y+0,z*R);
  275. glVertex3f(x*r,y+h,z*r);
  276.  
  277. glEnd();
  278. }
  279.  
  280. void RysujKolo(float R, float y, int n)
  281. {
  282. float alfa;
  283. int i;
  284. float x;
  285. float z;
  286.  
  287. glBegin(GL_TRIANGLE_FAN);
  288. //glColor3f(1,0.4,1);
  289. glVertex3f(0,y,0);
  290.  
  291. alfa = 360.0f/n;
  292. for(i=0;i<=n;i++)
  293. {
  294. x = cos(0.0174532925f*i*alfa);
  295. z = sin(0.0174532925f*i*alfa);
  296.  
  297. glVertex3f(x*R,y+0,z*R);
  298. }
  299.  
  300.  
  301. x = cos(0.0);
  302. z = sin(0.0);
  303.  
  304. glVertex3f(x*R,y+0,z*R);
  305.  
  306. glEnd();
  307. }
  308.  
  309.  
  310. void rysowanieWalca(float R, float r, float h, int n, int m) {
  311. int i;
  312. float dR, dr, dh, y, tmp1, tmp2;
  313. dh = h / m;
  314. for (i = 0; i < m; i++)
  315. {
  316. y = dh * i;
  317. tmp1 = y / h;
  318. tmp2 = (y + dh) / h;
  319. dR = R + (r - R) * tmp1;
  320. dr = R + (r - R) * tmp2;
  321. powBocznaWalca(dR, dr, y, dh, n);
  322. }
  323. glColor3f(1, 0.4, 0.6);
  324. RysujKolo(R, 0, n);
  325. glColor3f(1, 1, 0.6);
  326. RysujKolo(r, h, n);
  327.  
  328. }
  329.  
  330. //////////////////////////////////////////////////////////////////////////////////////////
  331. // Wlaczenie oswietlenia sceny
  332. void WlaczOswietlenie(void)
  333. {
  334. podstawaSciany = gluNewQuadric();
  335. gluQuadricDrawStyle(podstawaSciany, GLU_LINE);
  336.  
  337. // Odblokowanie oswietlenia
  338. glEnable(GL_LIGHTING);
  339. //swaitlo 1
  340. if (zrodlo1 == 1) {
  341. //glLoadIdentity();
  342.  
  343. glPushMatrix();
  344. glRotatef(5*katx, 1, 0, 0);
  345. glRotatef(kat2, 0, 1, 0);
  346.  
  347. glTranslatef(odleglosc, 0, 0);
  348. //glutWireSphere(1, 10, 10);
  349. glEnable(GL_LIGHT0);
  350. glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo1[0]);
  351. glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo1[1]);
  352. glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo1[2]);
  353. glLightfv(GL_LIGHT0, GL_POSITION, swiatlo1[3]);
  354. glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo1[4]);
  355. glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, swiatlo1[5][0]);
  356. glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, swiatlo1[6][0]);
  357. glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, swiatlo1[7][0]);
  358. glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, swiatlo1[8][0]);
  359. glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, swiatlo1[9][0]);
  360. kat2 += predkosc;
  361. /*glPopMatrix();*/
  362. glPopMatrix();
  363. }
  364. else {
  365. glDisable(GL_LIGHT0);
  366. }
  367. //swiatlo 2
  368. if (zrodlo2 == 1) {
  369. glEnable(GL_LIGHT1);
  370. glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo2[0]);
  371. glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo2[1]);
  372. glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo2[2]);
  373. glLightfv(GL_LIGHT1, GL_POSITION, swiatlo2[3]);
  374. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo2[4]);
  375. /*glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, swiatlo2[5][0]);
  376. glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, swiatlo2[6][0]);
  377. glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, swiatlo2[7][0]);
  378. glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, swiatlo2[8][0]);
  379. glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, swiatlo2[9][0]);*/
  380.  
  381. }
  382. else {
  383. //wylaczenie zrodla swiatla nr 2
  384. glDisable(GL_LIGHT1);
  385. }
  386.  
  387. }
  388.  
  389. //////////////////////////////////////////////////////////////////////////////////////////
  390. // Zdefiniowanie walasciwosci materialu walca na podstawie zapisanych w tablcy 'material'
  391. // parametrow (material obowiazuje tylko do scian skierowanych przodem do obserwatora)
  392. void DefiniujMaterial(void)
  393. {
  394. glMaterialfv(GL_FRONT, GL_AMBIENT, material[0]);
  395. glMaterialfv(GL_FRONT, GL_DIFFUSE, material[1]);
  396. glMaterialfv(GL_FRONT, GL_SPECULAR, material[2]);
  397. glMaterialfv(GL_FRONT, GL_SHININESS, material[3]);
  398. glMaterialfv(GL_FRONT, GL_EMISSION, material[4]);
  399. }
  400.  
  401. ////////////////////////////////////////////////////////////////////////////////////////
  402. // Ustawienie parametrow oswietlenia sceny
  403. void UstawParametryOswietlenia(int indeks, char operacja)
  404. {
  405. switch(indeks)
  406. {
  407. // Parametry swiatla otoczenia, rozproszenia i odbicia lustrzanego
  408. case 0:
  409. case 1:
  410. case 2:
  411. switch(operacja)
  412. {
  413. // Zwiekszenie skladowej R o wartosc KROK_FLOAT
  414. case '1':
  415. swiatlo1[indeks][0] = (swiatlo1[indeks][0] >= 1.0) ? 1.0 : swiatlo1[indeks][0]+ KROK_FLOAT;
  416. break;
  417.  
  418. // Zmniejszenie skladowej R o wartosc KROK_FLOAT
  419. case '!':
  420. swiatlo1[indeks][0] = (swiatlo1[indeks][0] <= 0.1) ? 0.0 : swiatlo1[indeks][0]- KROK_FLOAT;
  421. break;
  422.  
  423. // Zwiekszenie skladowej G o wartosc KROK_FLOAT
  424. case '2':
  425. swiatlo1[indeks][1] = (swiatlo1[indeks][1] >= 1.0) ? 1.0 : swiatlo1[indeks][1]+ KROK_FLOAT;
  426. break;
  427.  
  428. // Zmniejszenie skladowej G o wartosc KROK_FLOAT
  429. case '@':
  430. swiatlo1[indeks][1] = (swiatlo1[indeks][1] <= 0.01) ? 0.0 : swiatlo1[indeks][1]- KROK_FLOAT;
  431. break;
  432.  
  433. // Zwiekszenie skladowej B o wartosc KROK_FLOAT
  434. case '3':
  435. swiatlo1[indeks][2] = (swiatlo1[indeks][2] >= 1.0) ? 1.0 : swiatlo1[indeks][2]+ KROK_FLOAT;
  436. break;
  437.  
  438. // Zmniejszenie skladowej B o wartosc KROK_FLOAT
  439. case '#':
  440. swiatlo1[indeks][2] = (swiatlo1[indeks][2] <= 0.1) ? 0.0 : swiatlo1[indeks][2]- KROK_FLOAT;
  441. break;
  442.  
  443. // Zwiekszenie skladowej A o wartosc KROK_FLOAT
  444. case '4':
  445. swiatlo1[indeks][3] = (swiatlo1[indeks][3] >= 1.0) ? 1.0 : swiatlo1[indeks][3]+ KROK_FLOAT;
  446. break;
  447.  
  448. // Zmniejszenie skladowej B o wartosc KROK_FLOAT
  449. case '$':
  450. swiatlo1[indeks][3] = (swiatlo1[indeks][3] <= 0.1) ? 0.0 : swiatlo1[indeks][3]- KROK_FLOAT;
  451. break;
  452. }
  453. break;
  454.  
  455. // Parametry opisujace polozenie i orientacje swiatla
  456. case 3:
  457. case 4:
  458. case 5:
  459. case 6:
  460. switch(operacja)
  461. {
  462. // Zwiekszenie wspolrzednej X o wartosc KROK_FLOAT
  463. case '1':
  464. swiatlo1[indeks][0] += KROK_FLOAT;
  465. break;
  466.  
  467. // Zmniejszenie wspolrzednej X o wartosc KROK_FLOAT
  468. case '!':
  469. swiatlo1[indeks][0] -= KROK_FLOAT;
  470. break;
  471.  
  472. // Zwiekszenie wspolrzednej Y o wartosc KROK_FLOAT
  473. case '2':
  474. swiatlo1[indeks][1] += KROK_FLOAT;
  475. break;
  476.  
  477. // Zmniejszenie wspolrzednej Y o KROK_FLOAT
  478. case '@':
  479. swiatlo1[indeks][1] -= KROK_FLOAT;
  480. break;
  481.  
  482. // Zwiekszenie wspolrzednej Z o wartosc KROK_FLOAT
  483. case '3':
  484. swiatlo1[indeks][2] += KROK_FLOAT;
  485. break;
  486.  
  487. // Zmniejszenie wspolrzednej Z o wartosc KROK_FLOAT
  488. case '#':
  489. swiatlo1[indeks][2] -= KROK_FLOAT;
  490. break;
  491.  
  492. // Zwiekszenie wspolrzednej W o wartosc KROK_FLOAT
  493. case '4':
  494. swiatlo1[indeks][3] += KROK_FLOAT;
  495. break;
  496.  
  497. // Zmniejszenie wspolrzednej W o wartosc KROK_FLOAT
  498. case '$':
  499. swiatlo1[indeks][3] -= KROK_FLOAT;
  500. break;
  501. }
  502. break;
  503. case 7:
  504. case 8:
  505. case 9:
  506. switch(operacja)
  507. {
  508. // Zwiekszenie skladowych tlumienia wartosc KROK_FLOAT/10
  509. case '1':
  510. swiatlo1[indeks][0] += KROK_FLOAT/10.0;
  511. break;
  512.  
  513. // Zmniejszenie stalych tlumienia o wartosc KROK_FLOAT/10
  514. case '!':
  515. swiatlo1[indeks][0] -= KROK_FLOAT/10.0;
  516. break;
  517. }
  518. }
  519. }
  520.  
  521. //////////////////////////////////////////////////////////////////////////////////////////
  522. // Ustawienie parametrow materoalu
  523. void UstawParametryMaterialu(int indeks, char operacja)
  524. {
  525. switch(indeks)
  526. {
  527. // Parametry odbicia swiatla swiatla otoczenia, swiatla rozproszonego, swiatla
  528. // kierunkowego i emitowanego
  529. case 0:
  530. case 1:
  531. case 2:
  532. case 4:
  533. switch(operacja)
  534. {
  535. // Zwiekszenie skladowej R o wartosc KROK_FLOAT
  536. case '1':
  537. material[indeks][0] = (material[indeks][0] >= 1.0) ? 1.0 : material[indeks][0]+ KROK_FLOAT;
  538. break;
  539.  
  540. // Zmniejszenie skladowej R o wartosc KROK_FLOAT
  541. case '!':
  542. material[indeks][0] = (material[indeks][0] <= 0.1) ? 0.0 : material[indeks][0]- KROK_FLOAT;
  543. break;
  544.  
  545. // Zwiekszenie skladowej G o wartosc KROK_FLOAT
  546. case '2':
  547. material[indeks][1] = (material[indeks][1] >= 1.0) ? 1.0 : material[indeks][1]+ KROK_FLOAT;
  548. break;
  549.  
  550. // Zmniejszenie skladowej G o wartosc KROK_FLOAT
  551. case '@':
  552. material[indeks][1] = (material[indeks][1] <= 0.1) ? 0.0 : material[indeks][1]- KROK_FLOAT;
  553. break;
  554.  
  555. // Zwiekszenie skladowej B o wartosc KROK_FLOAT
  556. case '3':
  557. material[indeks][2] = (material[indeks][2] >= 1.0) ? 1.0 : material[indeks][2]+ KROK_FLOAT;
  558. break;
  559.  
  560. // Zmniejszenie skladowej B o wartosc KROK_FLOAT
  561. case '#':
  562. material[indeks][2] = (material[indeks][2] <= 0.1) ? 0.0 : material[indeks][2]- KROK_FLOAT;
  563. break;
  564.  
  565. // Zwiekszenie skladowej A o wartosc KROK_FLOAT
  566. case '4':
  567. material[indeks][3] = (material[indeks][3] >= 1.0) ? 1.0 : material[indeks][3]+ KROK_FLOAT;
  568. break;
  569.  
  570. // Zmniejszenie skladowej A o wartosc KROK_FLOAT
  571. case '$':
  572. material[indeks][3] = (material[indeks][3] <= 0.1) ? 0.0 : material[indeks][3]- KROK_FLOAT;
  573. break;
  574.  
  575.  
  576. }
  577. break;
  578.  
  579. // Parametr opisujacy polysk powierzchni
  580. case 3:
  581. switch(operacja)
  582. {
  583. // Zwiekszenie skladowej R o wartosc KROK_FLOAT*10
  584. case '1':
  585. material[indeks][0] = (material[indeks][0] >= 100.0) ? 100.0 : material[indeks][0]+ KROK_FLOAT * 10.0;
  586. break;
  587.  
  588. // Zmniejszenie skladowej R o wartosc KROK_FLOAT*10
  589. case '!':
  590. material[indeks][0] = (material[indeks][0] <= 0.0) ? 0.0 : material[indeks][0]- KROK_FLOAT * 10.0;
  591. break;
  592. }
  593. break;
  594. }
  595. }
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603. /*void rysujStozek()
  604. {
  605. double R = promien;
  606. double h = wysokosc;
  607. double pio = lPionowych;
  608. double poz = lPoziomych;
  609. double dAlfa, x, y, Rp, rp;
  610. int i, j;
  611.  
  612. if (smooth)
  613. glShadeModel(GL_SMOOTH);
  614. else
  615. glShadeModel(GL_FLAT);
  616.  
  617. if (fill)
  618. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  619. else
  620. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  621.  
  622. dAlfa = 360 / pio;
  623. glColor3f(1.0, 0.0, 1.0);
  624. glBegin(GL_TRIANGLE_FAN);
  625. glVertex3f(0.0, 0.0, 0.0);
  626. for (i = 0; i * dAlfa <= 360.0; i++)
  627. {
  628. glVertex3f(R * cos(DEG2RAD(i * dAlfa)), 0.0, R * sin(DEG2RAD(i * dAlfa)));
  629. }
  630. glEnd();
  631.  
  632. glColor3f(1.0, 0.0, 0.0);
  633. for (j = 0; j < poz; j++)
  634. {
  635. x = R * ((j * (double)(h / poz)) / h);
  636. y = R * (((j * (double)(h / poz)) + (h / poz)) / h);
  637. Rp = R - x;
  638. rp = R - y;
  639. glBegin(GL_QUADS);
  640. for (i = 0; i <= pio; i++)
  641. {
  642. glVertex3f(Rp * cos(DEG2RAD(i * dAlfa)), (j * (double)(h / poz)), Rp * sin(DEG2RAD(i * dAlfa)));
  643. glVertex3f(rp * cos(DEG2RAD(i * dAlfa)), (j * (double)(h / poz)) + (h / poz), rp * sin(DEG2RAD(i * dAlfa)));
  644. glVertex3f(rp * cos(DEG2RAD((i + 1) * dAlfa)), (j * (double)(h / poz)) + (h / poz), rp * sin(DEG2RAD((i + 1) * dAlfa)));
  645. glVertex3f(Rp * cos(DEG2RAD((i + 1) * dAlfa)), (j * (double)(h / poz)), Rp * sin(DEG2RAD((i + 1) * dAlfa)));
  646. }
  647. glEnd();
  648.  
  649. glBegin(GL_LINES);
  650. for (i = 0; i <= pio; i++)
  651. {
  652. glVertex3f(Rp * cos(DEG2RAD(i * dAlfa)), (j * (double)(h / poz)), Rp * sin(DEG2RAD(i * dAlfa)));
  653. glVertex3f(Rp * 1.5 * cos(DEG2RAD(i * dAlfa)), (j * (double)(h / poz)), Rp * 1.5 * sin(DEG2RAD(i * dAlfa)));
  654. glVertex3f(rp * cos(DEG2RAD(i * dAlfa)), (j * (double)(h / poz)) + (h / poz), rp * sin(DEG2RAD(i * dAlfa)));
  655. glVertex3f(rp * 1.5 * cos(DEG2RAD(i * dAlfa)), (j * (double)(h / poz)) + (h / poz), rp * 1.5 *sin(DEG2RAD(i * dAlfa)));
  656.  
  657. }
  658. glEnd();
  659. }
  660. }*/
  661.  
  662.  
  663.  
  664. //////////////////////////////////////////////////////////////////////////////////////////
  665. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu
  666. void UstawParametryWidoku(int szer, int wys)
  667. {
  668. // Zapamietanie wielkosci widoku
  669. szerokoscOkna = szer;
  670. wysokoscOkna = wys;
  671.  
  672. // Ustawienie parametrow viewportu
  673. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  674.  
  675. // Przejscie w tryb modyfikacji macierzy rzutowania
  676. glMatrixMode(GL_PROJECTION);
  677. glLoadIdentity();
  678. gluPerspective(40.0, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
  679.  
  680. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  681. glMatrixMode(GL_MODELVIEW);
  682.  
  683.  
  684. // Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa
  685. glLoadIdentity();
  686. }
  687.  
  688.  
  689. //////////////////////////////////////////////////////////////////////////////////////////
  690. // Funkcja rysujaca na wygenerowanym obrazie walca nkladke z tekstem opisujacym
  691. // aktualne parametry zrodla swiatla i materialu.
  692. void RysujNakladke(void)
  693. {
  694. char buf[255];
  695.  
  696. // Zmiana typu rzutu z perspektywicznego na ortogonalny
  697. glMatrixMode(GL_PROJECTION);
  698. glPushMatrix();
  699. glLoadIdentity();
  700. glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
  701.  
  702. // Modelowanie sceny 2D (zawartosci nakladki)
  703. glMatrixMode(GL_MODELVIEW);
  704. glPushMatrix();
  705. glLoadIdentity();
  706.  
  707. // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
  708. glDisable(GL_LIGHTING);
  709.  
  710. // Okreslenie koloru tekstu
  711. glColor3f(1.0, 1.0, 1.0);
  712.  
  713. // RYSOWANIE MENU PARAMETROW ZRODLA SWIATLA
  714. sprintf(buf, "Aby przyblizyc kamere wcisnij c");
  715. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO - 32);
  716. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  717.  
  718. sprintf(buf, "Aby oddalic kamere wcisnij d");
  719. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO - 42);
  720. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  721.  
  722. sprintf(buf, "Zmiana orientacji kamery w osi X przyciski i lub k");
  723. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO - 52);
  724. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  725.  
  726. sprintf(buf, "Zmiana orientacji kamery w osi Y przyciski j lub k ");
  727. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO - 62);
  728. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  729.  
  730. sprintf(buf, "Zmiana orientacji kamery w osi Z przyciski u lub 0");
  731. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO - 72);
  732. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  733.  
  734. sprintf(buf, "Zmiana liczby podzialow po przycisnieciu v lub V lub");
  735. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO - 82);
  736. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  737.  
  738. sprintf(buf, "Fill lub nie Fill b");
  739. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO - 92);
  740. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  741.  
  742. sprintf(buf, "Zmiana swiatla t lub y");
  743. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO - 102);
  744. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  745.  
  746. sprintf(buf, "Zmiana materialu m");
  747. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO - 102);
  748. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  749.  
  750. /* sprintf(buf, "Swiatlo - (m - zmiana menu na material), (1,2,3,4 - zwiekszenie parametrow), (!,@,#,$) - zmniejszenie parametrow");
  751. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1);
  752. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  753.  
  754. UstawKolorPozycji(ID_MENU_SWIATLA, 0);
  755. sprintf(buf, " - otaczajace (%.1f, %.1f, %.1f, %.1f)", swiatlo1[0][0], swiatlo1[0][1], swiatlo1[0][2],
  756. swiatlo1[0][3]);
  757. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1 - 10);
  758. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  759.  
  760. UstawKolorPozycji(ID_MENU_SWIATLA, 1);
  761. sprintf(buf, " - rozproszone (%.1f, %.1f, %.1f, %.1f)", swiatlo1[1][0], swiatlo1[1][1], swiatlo1[1][2],
  762. swiatlo1[1][3]);
  763. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1 - 20);
  764. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  765.  
  766. UstawKolorPozycji(ID_MENU_SWIATLA, 2);
  767. sprintf(buf, " - lustrzane (%.1f, %.1f, %.1f, %.1f)", swiatlo1[2][0], swiatlo1[2][1], swiatlo1[2][2],
  768. swiatlo1[2][3]);
  769. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1 - 30);
  770. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  771.  
  772. UstawKolorPozycji(ID_MENU_SWIATLA, 3);
  773. sprintf(buf, " - polozenie (%.1f, %.1f, %.1f, %.1f)", swiatlo1[3][0], swiatlo1[3][1], swiatlo1[3][2],
  774. swiatlo1[3][3]);
  775. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1 - 40);
  776. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  777.  
  778. UstawKolorPozycji(ID_MENU_SWIATLA, 4);
  779. sprintf(buf, " - kierunek (%.1f, %.1f, %.1f)", swiatlo1[4][0], swiatlo1[4][1], swiatlo1[4][2]);
  780. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1 - 50);
  781. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  782.  
  783. UstawKolorPozycji(ID_MENU_SWIATLA, 5);
  784. sprintf(buf, " - tl. katowe (%.1f)", swiatlo1[5][0]);
  785. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1 - 60);
  786. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  787.  
  788. UstawKolorPozycji(ID_MENU_SWIATLA, 6);
  789. sprintf(buf, " - kat odciecia(%.1f)", swiatlo1[6][0]);
  790. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1 - 70);
  791. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  792.  
  793. UstawKolorPozycji(ID_MENU_SWIATLA, 7);
  794. sprintf(buf, " - tl. stale (%.2f)", swiatlo1[7][0]);
  795. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1 - 80);
  796. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  797.  
  798. UstawKolorPozycji(ID_MENU_SWIATLA, 8);
  799. sprintf(buf, " - tl. liniowe (%.2f)", swiatlo1[8][0]);
  800. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1 - 90);
  801. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  802.  
  803. UstawKolorPozycji(ID_MENU_SWIATLA, 9);
  804. sprintf(buf, " - tl. kwadrat.(%.2f)", swiatlo1[9][0]);
  805. glRasterPos2i(X_OFFSET_SWIATLO1, Y_OFFSET_SWIATLO1 - 100);
  806. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  807.  
  808.  
  809. // RYSOWANIE MENU PARAMETROW MATERIALU
  810.  
  811. glColor3f(1.0, 1.0, 1.0);
  812. sprintf(buf, "Material - (m - zmiana menu na swiatlo), (1,2,3,4 - zwiekszenie parametrow), (!,@,#,$) - zmniejszenie parametrow");
  813. glRasterPos2i(X_OFFSET_MAT, Y_OFFSET_MAT);
  814. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  815.  
  816. UstawKolorPozycji(ID_MENU_MATERIALU, 0);
  817. sprintf(buf, " - otaczajace (%.6f, %.6f, %.6f, %.6f)", material[0][0], material[0][1],
  818. material[0][2], material[0][3]);
  819. glRasterPos2i(X_OFFSET_MAT, Y_OFFSET_MAT - 10);
  820. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  821.  
  822. UstawKolorPozycji(ID_MENU_MATERIALU, 1);
  823. sprintf(buf, " - rozproszone (%.6f, %.6f, %.6f, %.6f)", material[1][0], material[1][1],
  824. material[1][2], material[1][3]);
  825. glRasterPos2i(X_OFFSET_MAT, Y_OFFSET_MAT - 20);
  826. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  827.  
  828. UstawKolorPozycji(ID_MENU_MATERIALU, 2);
  829. sprintf(buf, " - kierunkowe (%.6f, %.6f, %.6f, %.6f)", material[2][0], material[2][1],
  830. material[2][2], material[2][3]);
  831. glRasterPos2i(X_OFFSET_MAT, Y_OFFSET_MAT - 30);
  832. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  833.  
  834. UstawKolorPozycji(ID_MENU_MATERIALU, 3);
  835. sprintf(buf, " - polysk (%.2f)", material[3][0]);
  836. glRasterPos2i(X_OFFSET_MAT, Y_OFFSET_MAT - 40);
  837. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  838.  
  839. UstawKolorPozycji(ID_MENU_MATERIALU, 4);
  840. sprintf(buf, " - emitowane (%.6f, %.6f, %.6f, %.6f)", material[4][0], material[4][1],
  841. material[4][2], material[4][3]);
  842. glRasterPos2i(X_OFFSET_MAT, Y_OFFSET_MAT - 50);
  843. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  844.  
  845. // RYSOWANIE MENU PARAMETROW WALCA
  846.  
  847. glColor3f(1.0, 1.0, 1.0);
  848.  
  849. sprintf(buf, "Stozek:");
  850. glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT);
  851. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  852.  
  853. sprintf(buf, "(p, P) - promien (%.1f)", promien);
  854. glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 10);
  855. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  856.  
  857. sprintf(buf, "(w, W) - wysokosc (%.1f)", wysokosc);
  858. glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 20);
  859. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  860.  
  861. sprintf(buf, "(v. V) - podzialow pionowych (%d)", lPionowych);
  862. glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 30);
  863. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  864.  
  865. sprintf(buf, "(h, H) - podzialow poziomych (%d)", lPoziomych);
  866. glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 40);
  867. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  868.  
  869. // Przywrocenie macierzy sprzed wywolania funkcji
  870. glMatrixMode(GL_PROJECTION);
  871. glPopMatrix();
  872. glMatrixMode(GL_MODELVIEW);
  873. glPopMatrix();*/
  874.  
  875. // Odblokowanie oswietlenia
  876. glEnable(GL_LIGHTING);
  877. }
  878.  
  879.  
  880. //////////////////////////////////////////////////////////////////////////////////////////
  881. // Funkcja generujaca pojedyncza klatke animacji
  882. void WyswietlObraz(void)
  883. {
  884. // Wyczyszczenie bufora ramki i bufora glebokosci
  885. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  886.  
  887. // Ustawienie oswietlenia sceny (polozenie zrodla swiatla wyznaczane jest w ukladzie
  888. // wspolrzednych obserwatora)
  889. WlaczOswietlenie();
  890.  
  891. // Okreslenie wielkosci widoku, wlaczenie rzutowania perspektywicznego
  892. // i zainicjowanie stosu macierzy modelowania
  893. UstawParametryWidoku(szerokoscOkna, wysokoscOkna);
  894.  
  895.  
  896.  
  897. // Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych
  898. // sceny do ukladu wspolrzednych obserwatora). Obserwator obraca sie wokol punktu 0.0
  899. // na osi OY. Promien obrotu = 20, pochylenie = 20 stopni,
  900. // predkosc obrotu = 0.25 stopnia/ramke.
  901. glTranslatef(0, 0, -OBSERWATOR_ODLEGLOSC);
  902. //glRotatef(20, 1, 0, 0);
  903. //glRotatef(kat, 0, 1, 0);
  904. glRotatef(OBSERWATOR_OBROT_X, 1, 0, 0);
  905. glRotatef(OBSERWATOR_OBROT_Y, 0, 1, 0);
  906. glRotatef(OBSERWATOR_OBROT_Z, 0, 0, 1);
  907.  
  908. // Zdefiniowanie materialu walca
  909. DefiniujMaterial();
  910.  
  911. // Generacja obrazu walca
  912. //RysujWalec(wysokosc, promien, lPoziomych, lPionowych);
  913. //rysujStozek();
  914. zmianaMaterialu();
  915. rysowanieWalca(1,1,3,zmienna, zmienna2);
  916. // Narysowanie tekstow z opisem parametrow oswietlenia i materialu
  917. RysujNakladke();
  918.  
  919. // Przelaczenie buforow ramki
  920. glutSwapBuffers();
  921.  
  922.  
  923. // Modyfikacja kata obrotu
  924. kat += 0.25;
  925. }
  926.  
  927.  
  928. //////////////////////////////////////////////////////////////////////////////////////////
  929. // Funkcja obslugi klawiatury
  930. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  931. {
  932. switch(klawisz)
  933. {
  934. case ']':
  935. katx++;
  936.  
  937. break;
  938. case '}':
  939. katx--;
  940.  
  941. break;
  942. case 'g':
  943. odleglosc++;
  944.  
  945. break;
  946. case 'G':
  947. odleglosc--;
  948.  
  949. break;
  950. case '[':
  951. predkosc++;
  952.  
  953. break;
  954. case '{':
  955. predkosc--;
  956.  
  957. break;
  958. case '9':
  959. smooth = !smooth;
  960.  
  961. break;
  962. case '0':
  963. fill = !fill;
  964.  
  965. break;
  966.  
  967. case 'y':
  968. zrodlo1 = !zrodlo1;
  969. break;
  970. case 't':
  971. zrodlo2 = !zrodlo2;
  972. break;
  973.  
  974. case 'd':
  975. if (OBSERWATOR_ODLEGLOSC >= 40)
  976. OBSERWATOR_ODLEGLOSC = 40;
  977. else
  978. OBSERWATOR_ODLEGLOSC += 1;
  979. break;
  980.  
  981. case 'c':
  982. if (OBSERWATOR_ODLEGLOSC <= 10)
  983. OBSERWATOR_ODLEGLOSC = 10;
  984. else
  985. OBSERWATOR_ODLEGLOSC -= 1;
  986. break;
  987.  
  988. case 'v':
  989. zmienna = (zmienna>4) ? zmienna-1 : zmienna;
  990. break;
  991.  
  992. case 'V':
  993. zmienna = (zmienna<64) ? zmienna+1 : zmienna;
  994. break;
  995.  
  996. case 'h':
  997. zmienna2 = (zmienna2>4) ? zmienna2-1 : zmienna2;
  998. break;
  999.  
  1000. case 'H':
  1001. zmienna2 = (zmienna2<64) ? zmienna2+1 : zmienna2;
  1002. break;
  1003.  
  1004. case 'w':
  1005. wysokosc = (wysokosc == WYS_MAX) ? WYS_MAX : wysokosc + 1;
  1006. break;
  1007.  
  1008. case 'W':
  1009. wysokosc = (wysokosc == 1) ? wysokosc : wysokosc - 1;
  1010. break;
  1011.  
  1012. case 'p':
  1013. promien = (promien == R_MAX) ? R_MAX : promien + 1;
  1014. break;
  1015.  
  1016. case 'P':
  1017. promien = (promien == 1) ? promien : promien - 1;
  1018. break;
  1019.  
  1020. case 'r':
  1021. UstawDomyslneWartosciParametrow();
  1022. break;
  1023.  
  1024. case 'b':
  1025. ZmianaTrybu();
  1026. break;
  1027.  
  1028. case 'm':
  1029. menu = (menu == ID_MENU_SWIATLA) ? ID_MENU_MATERIALU : ID_MENU_SWIATLA;
  1030. break;
  1031.  
  1032. case 'i':
  1033. OBSERWATOR_OBROT_X += 1;
  1034. break;
  1035.  
  1036. case 'j':
  1037. OBSERWATOR_OBROT_Y += 1;
  1038. break;
  1039.  
  1040. case 'k':
  1041. OBSERWATOR_OBROT_X -= 1;
  1042. break;
  1043.  
  1044. case 'l':
  1045. OBSERWATOR_OBROT_Y -= 1;
  1046. break;
  1047.  
  1048. case 'u':
  1049. OBSERWATOR_OBROT_Z += 1;
  1050. break;
  1051.  
  1052. case 'o':
  1053. OBSERWATOR_OBROT_Z -= 1;
  1054. break;
  1055.  
  1056.  
  1057. case '6':
  1058. mat1=1;
  1059. mat2=0;
  1060. break;
  1061.  
  1062. case '7':
  1063. mat1=0;
  1064. mat2=1;
  1065. break;
  1066. case '8':
  1067. mat1=0;
  1068. mat2=0;
  1069. break;
  1070.  
  1071. case '1':
  1072. case '!':
  1073. case '2':
  1074. case '@':
  1075. case '3':
  1076. case '#':
  1077. case '4':
  1078. case '$':
  1079. if (menu == ID_MENU_SWIATLA)
  1080. UstawParametryOswietlenia(sIndeks, klawisz);
  1081. else
  1082. UstawParametryMaterialu(mIndeks, klawisz);
  1083. break;
  1084.  
  1085. // Wcisniecie klawisza ESC powoduje wyjscie z programu
  1086. case 27:
  1087. exit(0);
  1088. }
  1089. }
  1090.  
  1091.  
  1092. //////////////////////////////////////////////////////////////////////////////////////////
  1093. // Funkcja klawiszy specjalnych
  1094. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  1095. {
  1096. switch(klawisz)
  1097. {
  1098. case GLUT_KEY_UP:
  1099. if (menu == ID_MENU_SWIATLA)
  1100. sIndeks = (sIndeks > 0) ? sIndeks - 1 : 0;
  1101. else
  1102. mIndeks = (mIndeks > 0) ? mIndeks - 1 : 0;
  1103. break;
  1104.  
  1105. case GLUT_KEY_DOWN:
  1106. if (menu == ID_MENU_SWIATLA)
  1107. sIndeks = (sIndeks < LPOZ_MENU_SWIATLA - 1) ? sIndeks + 1 : LPOZ_MENU_SWIATLA - 1;
  1108. else
  1109. mIndeks = (mIndeks < LPOZ_MENU_MATERIALU - 1) ? mIndeks + 1 : LPOZ_MENU_MATERIALU - 1;
  1110. break;
  1111. }
  1112. }
  1113.  
  1114.  
  1115.  
  1116. //////////////////////////////////////////////////////////////////////////////////////////
  1117. // Glowna funkcja programu
  1118. int main(int argc, char **argv)
  1119. {
  1120. // Zainicjowanie biblioteki GLUT
  1121. glutInit(&argc, argv);
  1122.  
  1123. // Ustawienie trybu wyswietlania
  1124. glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
  1125.  
  1126. // Ustawienie polozenia dolenego lewego rogu okna
  1127. glutInitWindowPosition(100, 100);
  1128.  
  1129. // Ustawienie rozmiarow okna
  1130. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  1131.  
  1132. // Utworzenie okna
  1133. glutCreateWindow("Oswietlony stozek");
  1134.  
  1135. // Odblokowanie bufora glebokosci
  1136. glEnable(GL_DEPTH_TEST);
  1137.  
  1138. // Ustawienie funkcji wykonywanej na danych w buforze glebokosci
  1139. glDepthFunc(GL_LEQUAL);
  1140.  
  1141. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  1142. glClearDepth(1000.0);
  1143. /*glPushMatrix();
  1144. glTranslatef(-1, -1,-1);
  1145. rysujUklad();
  1146. glPopMatrix();*/
  1147. // Odblokowanie wykonywania operacji na skladowych "alfa"
  1148. glEnable(GL_BLEND);
  1149.  
  1150. // Wybor funkcji mieszajacej kolory
  1151. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  1152.  
  1153. // Ustawienie koloru czyszczenia bufora ramki
  1154. glClearColor (0.0, 0.0, 0.0, 1.0);
  1155.  
  1156. // Zarejestrowanie funkcji (callback) wyswietlajacej
  1157. glutDisplayFunc(WyswietlObraz);
  1158.  
  1159. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  1160. // zmieniane sa rozmiary okna
  1161. glutReshapeFunc(UstawParametryWidoku);
  1162.  
  1163. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  1164. // zadnych zadan
  1165. glutIdleFunc(WyswietlObraz);
  1166.  
  1167. // Zarejestrowanie funkcji obslugi klawiatury
  1168. glutKeyboardFunc(ObslugaKlawiatury);
  1169.  
  1170. // Zarejestrowanie funkcji obslugi klawiszy specjalnych
  1171. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  1172.  
  1173. // Ustawienie domyslnych wartosci parametrow
  1174. UstawDomyslneWartosciParametrow();
  1175.  
  1176. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  1177. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  1178. glutMainLoop();
  1179.  
  1180. return 0;
  1181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement