Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.80 KB | None | 0 0
  1.  
  2. #include <gl/glut.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5.  
  6. // Definicja stalych
  7. #define DLUGOSC_BOKU 5.0
  8. #define OBSERWATOR_FOV_Y 30.0 //kat
  9. #define PI 3.1416
  10. #define X_OFFSET_SWIATLO 10
  11. #define Y_OFFSET_SWIATLO 0
  12. #define X_OFFSET_MAT 10
  13. #define Y_OFFSET_MAT 100
  14. #define X_OFFSET_OBIEKT 10
  15. #define Y_OFFSET_OBIEKT 245
  16. #define ID_MENU_SWIATLA 0
  17. #define ID_MENU_MATERIALU 1
  18. #define LPOZ_MENU_SWIATLA 10
  19. #define LPOZ_MENU_MATERIALU 5
  20. GLUquadricObj *orb;
  21. int w = 0;
  22. // Zmienne globalne
  23. double bok = DLUGOSC_BOKU;
  24. int szerokoscOkna = 800;
  25. int wysokoscOkna = 600;
  26. float OBSERWATOR_ODLEGLOSC = 40.0;
  27. float OBSERWATOR_OBROT_X = 20.0;
  28. float OBSERWATOR_OBROT_Y = 20.0;
  29. float OBSERWATOR_OBROT_Z = 0.0;
  30. float odlmax = 90.0;
  31. float odlmin = 5.0;
  32. float N = 20;
  33. float r1 = 3.0;
  34. float h = 4.0;
  35. float angle = 0;
  36. float R1 = 10; //promien wewnetrzny
  37. float R2 = 12.58;
  38. float H = 4.83;
  39. GLfloat liczbaPodzialow = 4.0;
  40. double dAlpha = 90.0;
  41. GLfloat obr = 0.0;
  42. GLfloat or = 0.0;
  43. GLfloat lul = 0.0;
  44. GLfloat prom = 6.0;
  45. GLfloat obrotplanety0= 0.0;
  46. GLfloat spinplanety = 0.0;
  47. GLfloat x = 0;
  48. GLfloat y = 0;
  49. GLfloat z = 0;
  50. double ringInnerRadius = 10.0;
  51. double ringHeight = 4;
  52. GLfloat ringWidth = 4;
  53. double M_PI = 3.14159265359;
  54. int tryb_rysowania = 1;
  55. int oswietlenie1 = 1;
  56. int oswietlenie2 = 1;
  57. int material = 1;
  58. int trybCieni = 1;
  59.  
  60.  
  61. double DEG2RAD(double deg) {
  62. return deg * M_PI / 180.0;
  63. }
  64. // Tablica parametrow swiatla
  65.  
  66. GLfloat swiatlo1[10][4] = { //reflektor bialy
  67. { 1.0, 1.0, 1.0, 1.0 }, // [0] otoczenie
  68. { 1.0, 1.0, 1.0, 1.0 }, // [1] rozproszenie
  69. { 1.0, 1.0, 1.0, 1.0 }, // [2] lustrzane
  70. { 0.0, 0.0, 0.0, 1.0 }, // [3] polozenie
  71. { -1.0, 0.0, 0.0, 0.0 }, // [4] kierunek swiecenia
  72. { 0.0, 0.0, 0.0, 0.0 }, // [5] tlumienie katowe swiatla
  73. { 45.0, 0.0, 0.0, 0.0 },// [6] kat odciecia swiatla
  74. { 1.0, 0.0, 0.0, 0.0 }, // [7] stale tlumienie
  75. { 0.0, 0.0, 0.0, 0.0 }, // [8] tlumienie liniowe
  76. { 0.0, 0.0, 0.0, 0.0 } }; // [9] tlumienie kwadratowe
  77.  
  78. GLfloat swiatlo2[10][4] = {
  79. { 1.0, 1.0, 0.0, 1.0 }, // [0] otoczenie
  80. { 1.0, 1.0, 0.0, 1.0 }, // [1] rozproszenie
  81. { 1.0, 1.0, 0.0, 1.0 }, // [2] lustrzane
  82. { 10.0,10.0,10.0,1.0 }, // [3] polozenie
  83. { 0.0, 0.0, 0.0, 1.0 }, // [4] kierunek swiecenia
  84. { 0.0, 0.0, 0.0, 0.0 }, // [5] tlumienie katowe swiatla
  85. { 180.0, 0.0, 0.0, 0.0 },// [6] kat odciecia swiatla
  86. { 1.0, 0.0, 0.0, 0.0 }, // [7] stale tlumienie
  87. { 0.0, 0.0, 0.0, 0.0 }, // [8] tlumienie liniowe
  88. { 0.0, 0.0, 0.0, 0.0 } }; // [9] tlumienie kwadratowe
  89.  
  90.  
  91.  
  92. GLfloat material2[6][4] = { //matowy niebieski
  93. { 0.0, 0.33, 0.0, 1.000000 }, // [0] wspolczynnik odbicia swiatla otoczenia
  94. { 0.1, 0.44, 0.1, 1.000000 }, // [1] wspolczynnik odbicia swiatla rozproszonego
  95. { 0.0, 0.0, 0.0, 1.000000 }, // [2] wspolczynnik odbicia swiatla lustrzanego
  96. { 0.0, 0.0, 0.0, 0.0 }, // [3] polysk
  97. { 0.0, 0.0, 1.0, 0.0 } }; // [4] kolor swiatla emitowanego
  98.  
  99.  
  100. GLfloat material1[6][4] = { //blyszczacy żółty
  101. { 1,1,0, 1.000000 }, // [0] wspolczynnik odbicia swiatla otoczenia
  102. { 1,1,0, 1.000000 }, // [1] wspolczynnik odbicia swiatla rozproszonego
  103. { 0,0,0,0.000000 }, // [2] wspolczynnik odbicia swiatla lustrzanego
  104. { 75, 75, 75, 1.0 }, // [3] polysk
  105. { 0, 0, 0.0, 0.0 } }; // [4] kolor swiatla emitowanego
  106.  
  107.  
  108.  
  109. GLfloat material3[6][4] = { //grafit
  110. { 0.105882, 0.058824, 0.113725, 1.000000 }, // [0] wspolczynnik odbicia swiatla otoczenia
  111. { 0.427451, 0.470588, 0.541176, 1.000000 }, // [1] wspolczynnik odbicia swiatla rozproszonego
  112. { 0.333333, 0.333333, 0.521569, 1.000000 }, // [2] wspolczynnik odbicia swiatla lustrzanego
  113. { 9.8461, 9.8461, 9.84612, 1.0 }, // [3] polysk
  114. { 0.0, 0.0, 0.0, 0.0 } }; // [4] kolor swiatla emitowanego
  115.  
  116.  
  117. // Prototypy funkcji
  118. //void RysujSzescian(double a);
  119. void UstawParametryWidoku(int szer, int wys);
  120. void WyswietlObraz(void);
  121. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  122. void WlaczOswietlenie(void);
  123. void RysujTekstRastrowy(void *font, char *tekst);
  124. void RysujNakladke(int N);
  125.  
  126. void Menu(void)
  127. {
  128. char buf[255];
  129.  
  130. // Zmiana typu rzutu z perspektywicznego na ortogonalny
  131. glMatrixMode(GL_PROJECTION);
  132. glPushMatrix();
  133. glLoadIdentity();
  134. glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
  135.  
  136. // Modelowanie sceny 2D (zawartosci nakladki)
  137. glMatrixMode(GL_MODELVIEW);
  138. glPushMatrix();
  139. glLoadIdentity();
  140.  
  141. // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
  142. glDisable(GL_LIGHTING);
  143.  
  144. // Okreslenie koloru tekstu
  145. glColor3f(1.0, 0.0, 1.0);
  146.  
  147. // RYSOWANIE MENU PARAMETROW ZRODLA SWIATLA
  148.  
  149. sprintf(buf, "~Predkosc orbity 1: </>");
  150. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO);
  151. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  152.  
  153. sprintf(buf, "~Przyblizenie/oddalenie: +/-");
  154. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO+90);
  155. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  156.  
  157. sprintf(buf, "~Obrot obs wokół osi: lewo/gora/prawo/dol i F1/F2");
  158. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO +80);
  159. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  160.  
  161. sprintf(buf, "~Zwiekszenie/zmiejszenie liczby podzialow: g/h");
  162. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 70);
  163. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  164.  
  165. sprintf(buf, "~Zmiana modelu geometrycznego bryly: p");
  166. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 60);
  167. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  168.  
  169. sprintf(buf, "~Wlaczanie swiatel: v b");
  170. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 50);
  171. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  172.  
  173. sprintf(buf, "~Zmiana materialu: 1 2 3");
  174. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 40);
  175. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  176.  
  177. sprintf(buf, "~Zmiana cieniowania t");
  178. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 30);
  179. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  180.  
  181. sprintf(buf, "~Wlacz/wylacz wektory normalne r");
  182. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 20);
  183. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  184.  
  185. sprintf(buf, "~Zwieksz/zmniejsz promien swiatla 1: o/u");
  186. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 10);
  187. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  188.  
  189. sprintf(buf, "~Obrot orbity swiatla 1: 9/0");
  190. glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO);
  191. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  192.  
  193.  
  194. // Przywrocenie macierzy sprzed wywolania funkcji
  195. glMatrixMode(GL_PROJECTION);
  196. glPopMatrix();
  197. glMatrixMode(GL_MODELVIEW);
  198. glPopMatrix();
  199.  
  200. // Odblokowanie oswietlenia
  201. glEnable(GL_LIGHTING);
  202. }
  203.  
  204. ////////////////////////////////////////////////////////////////////////////////
  205. void RysujPierscien() {
  206.  
  207. int i;
  208. // Sciana boczna wewnetrzna
  209. glColor3f(0.0, 1.0, 1.0);
  210.  
  211.  
  212.  
  213. // Sciana boczna zewnetrzna
  214. glBegin(GL_QUAD_STRIP);
  215.  
  216. for (i = 0; i <= liczbaPodzialow; i++) {
  217.  
  218. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  219. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  220.  
  221. }
  222.  
  223. glEnd();
  224.  
  225. // Dolna podstawa
  226. glColor3f(1.0, 1.0, 0.0);
  227. glBegin(GL_QUAD_STRIP);
  228.  
  229.  
  230. for (i = 0; i <= liczbaPodzialow; i++) {
  231.  
  232. glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0.0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
  233. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  234.  
  235. }
  236.  
  237. glEnd();
  238.  
  239. // Gorna podstawa
  240. glColor3f(1.0, 0.0, 1.0);
  241. glBegin(GL_QUAD_STRIP);
  242.  
  243. for (i = 0; i <= liczbaPodzialow; i++) {
  244.  
  245. glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
  246. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  247.  
  248. }
  249.  
  250. glEnd();
  251.  
  252. }
  253.  
  254. void RysujPierscien1() {
  255.  
  256. int i;
  257. // Sciana boczna wewnetrzna
  258. glColor3f(0.0, 1.0, 1.0);
  259.  
  260.  
  261.  
  262. // Sciana boczna zewnetrzna
  263. glBegin(GL_LINES);
  264.  
  265. for (i = 0; i <= liczbaPodzialow; i++) {
  266.  
  267. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  268. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  269.  
  270. }
  271.  
  272. glEnd();
  273.  
  274. // Dolna podstawa
  275. glColor3f(1.0, 1.0, 0.0);
  276. glBegin(GL_QUAD_STRIP);
  277.  
  278.  
  279. for (i = 0; i <= liczbaPodzialow; i++) {
  280.  
  281. glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0.0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
  282. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  283.  
  284. }
  285.  
  286. glEnd();
  287.  
  288. // Gorna podstawa
  289. glColor3f(1.0, 0.0, 1.0);
  290. glBegin(GL_QUAD_STRIP);
  291.  
  292. for (i = 0; i <= liczbaPodzialow; i++) {
  293.  
  294. glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
  295. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  296.  
  297. }
  298.  
  299. glEnd();
  300.  
  301. }
  302.  
  303.  
  304.  
  305.  
  306. void WlaczOswietlenie(void) {
  307.  
  308. // Odblokowanie oswietlenia
  309. glEnable(GL_LIGHTING);
  310.  
  311. if (oswietlenie1 == 1) glEnable(GL_LIGHT1);
  312. else glDisable(GL_LIGHT1);
  313.  
  314. if (oswietlenie2 == 1) glEnable(GL_LIGHT2);
  315. else glDisable(GL_LIGHT2);
  316.  
  317. glPopMatrix();
  318. glPopMatrix();
  319.  
  320. // Inicjowanie zrodla swiatla
  321. glPushMatrix();
  322. glLightfv(GL_LIGHT2, GL_AMBIENT, swiatlo2[0]);
  323. glLightfv(GL_LIGHT2, GL_DIFFUSE, swiatlo2[1]);
  324. glLightfv(GL_LIGHT2, GL_SPECULAR, swiatlo2[2]);
  325. glLightfv(GL_LIGHT2, GL_POSITION, swiatlo2[3]);
  326. glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, swiatlo2[4]);
  327. glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, swiatlo2[5][0]);
  328. glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, swiatlo2[6][0]);
  329. glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, swiatlo2[7][0]);
  330. glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, swiatlo2[8][0]);
  331. glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, swiatlo2[9][0]);
  332. glPopMatrix();
  333.  
  334.  
  335. glPushMatrix();
  336.  
  337. glRotatef(90, 1, 0, 0);
  338. glColor3f(1.0, 1.0, 0.0);
  339. glRotatef(obr, 1, 0, 0);
  340. glRotatef(obrotplanety0, 0, 0, -1);
  341.  
  342. glColor3f(0.0, 0.0, 1.0);
  343. glRotatef(-90.0, 1, 0, 0);
  344. glColor3f(1, 1, 1);
  345. glRotatef(obrotplanety0, 0, 1, 0);
  346. glTranslatef(prom, 0, 0);
  347. obrotplanety0 += lul;
  348.  
  349. glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo1[0]);
  350. glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo1[1]);
  351. glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo1[2]);
  352. glLightfv(GL_LIGHT1, GL_POSITION, swiatlo1[3]);
  353. glRotatef(obrotplanety0, -1, 0, 0);
  354. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo1[4]);
  355. glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, swiatlo1[5][0]);
  356. glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, swiatlo1[6][0]);
  357. glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, swiatlo1[7][0]);
  358. glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, swiatlo1[8][0]);
  359. glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, swiatlo1[9][0]);
  360.  
  361.  
  362. glPopMatrix();
  363. glPopMatrix();
  364.  
  365.  
  366.  
  367. }
  368.  
  369. void DefiniujMaterial(void)
  370. {
  371. if (material == 1) {
  372. glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
  373. glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
  374. glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
  375. glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
  376. glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
  377. }
  378.  
  379. if (material == 2) {
  380. glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
  381. glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
  382. glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
  383. glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
  384. glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
  385.  
  386. }
  387.  
  388. if (material == 3) {
  389. glMaterialfv(GL_FRONT, GL_AMBIENT, material3[0]);
  390. glMaterialfv(GL_FRONT, GL_DIFFUSE, material3[1]);
  391. glMaterialfv(GL_FRONT, GL_SPECULAR, material3[2]);
  392. glMaterialfv(GL_FRONT, GL_SHININESS, material3[3]);
  393. glMaterialfv(GL_FRONT, GL_EMISSION, material3[4]);
  394. }
  395. }
  396.  
  397. void RysujTekstRastrowy(void *font, char *tekst)
  398. {
  399. int i;
  400.  
  401. for (i = 0; i < (int)strlen(tekst); i++)
  402. glutBitmapCharacter(font, tekst[i]);
  403.  
  404. }
  405.  
  406. void RysujNakladke(int N)
  407. {
  408.  
  409. // Zmiana typu rzutu z perspektywicznego na ortogonalny
  410. glMatrixMode(GL_PROJECTION);
  411. glPushMatrix();
  412. glLoadIdentity();
  413. glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
  414. // Modelowanie sceny 2D (zawartosci nakladki)
  415. glMatrixMode(GL_MODELVIEW);
  416. glPushMatrix();
  417. glLoadIdentity();
  418. // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
  419. glDisable(GL_LIGHTING);
  420. // Okreslenie koloru tekstu
  421. glColor3f(1.0, 1.0, 1.0);
  422.  
  423.  
  424. // Okreslenie koloru tekstu
  425. glColor3f(0.7, 1.0, 0.9);
  426.  
  427. // RYSOWANIE MENU PARAMETROW ZRODLA SWIATLA
  428.  
  429.  
  430. // Przywrocenie macierzy sprzed wywolania funkcji
  431. glMatrixMode(GL_PROJECTION);
  432. glPopMatrix();
  433. glMatrixMode(GL_MODELVIEW);
  434. glPopMatrix();
  435.  
  436. // Odblokowanie oswietlenia
  437. glEnable(GL_LIGHTING);
  438. }
  439.  
  440.  
  441.  
  442. void wektory()
  443. {
  444. double i;
  445. double dAlfa = 360 / N;
  446. double R = 15;
  447. glColor3f(1, 1, 1);
  448. glBegin(GL_LINES);
  449. for (i = 0; i*dAlfa <= 360.0; i++)
  450. {
  451.  
  452. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  453. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), -1.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  454. glVertex3f((ringInnerRadius + ringWidth+1) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth + 1) * sin(DEG2RAD(i * dAlpha)));
  455. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  456.  
  457. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  458. glVertex3f((ringInnerRadius + ringWidth-1) * cos(DEG2RAD(i * dAlpha)), ringHeight+1, (ringInnerRadius + ringWidth - 1) * sin(DEG2RAD(i * dAlpha)));
  459. glVertex3f((ringInnerRadius + ringWidth+1) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth + 1) * sin(DEG2RAD(i * dAlpha)));
  460. glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
  461.  
  462. glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0.0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
  463. glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), -1.0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
  464. glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0.0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
  465. glVertex3f((ringInnerRadius-1) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius - 1) * sin(DEG2RAD(i * dAlpha)));
  466.  
  467.  
  468. }
  469. glEnd();
  470. }
  471. ///////////////////////////////////////////////////////////////////////////////////
  472.  
  473. void RysujUklad() {
  474. glColor3f(1, 0, 0);
  475. glBegin(GL_LINES);
  476. glVertex3f(-40, 0, 0);
  477. glVertex3f(40, 0, 0);
  478. glColor3f(0, 1, 0);
  479. glVertex3f(0, -40, 0);
  480. glVertex3f(0, 40, 0);
  481. glColor3f(0, 0, 1);
  482. glVertex3f(0, 0, -40);
  483. glVertex3f(0, 0, 40);
  484. glEnd();
  485.  
  486. }
  487.  
  488. //////////////////////////////////////////////////////////////////////////////////
  489. void RysujStozek() {
  490.  
  491. glBegin(GL_TRIANGLE_FAN);
  492. glColor3f(0.0, 1.0, 0.0);
  493. glVertex3f(0.0, 0.0, 0.0);
  494. for (angle = 0.0; angle <= (2.0*PI + 1 / N); angle += (2 * PI / N))
  495. {
  496. glVertex3f(r1* cos(angle), 0.0, r1* sin(angle));
  497. }
  498. glEnd();
  499.  
  500. glBegin(GL_TRIANGLE_FAN);//sciany
  501. glVertex3f(0.0, h, 0.0);
  502. for (angle = 0.0; angle <= (2.0*PI + 1 / N); angle += (2 * PI / N))
  503. {
  504. glVertex3f(r1* cos(angle), 0.0, r1* sin(angle));
  505. }
  506. glEnd();
  507.  
  508. }
  509.  
  510. //////////////////////////////////////////////////////////////////////////////
  511.  
  512.  
  513.  
  514. //////////////////////////////////////////////////////////////////////////////////////////
  515. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu.
  516. // Powinna być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  517.  
  518. void UstawParametryWidoku(int szer, int wys)
  519. {
  520. // Zapamietanie wielkosci widoku
  521. szerokoscOkna = szer;
  522. wysokoscOkna = wys;
  523.  
  524. // Ustawienie parametrow viewportu
  525. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  526.  
  527. // Przejscie w tryb modyfikacji macierzy rzutowania
  528. glMatrixMode(GL_PROJECTION);
  529. glLoadIdentity();
  530. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna / (float)wysokoscOkna, 1.0, 1000.0);
  531. }
  532.  
  533.  
  534. //////////////////////////////////////////////////////////////////////////////////////////
  535. // Funkcja wyswietlajaca pojedyncza klatke animacji
  536. void WyswietlObraz(void)
  537. {
  538.  
  539. char buf[255];
  540.  
  541. // Wyczyszczenie bufora koloru i bufora glebokosci
  542. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  543.  
  544. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  545. glMatrixMode(GL_MODELVIEW);
  546.  
  547. // Zastapienie aktywnej macierzy macierza jednostkowa
  548. glLoadIdentity();
  549.  
  550.  
  551. // Ustalenie polozenia obserwatora
  552. glTranslatef(0, 0, -OBSERWATOR_ODLEGLOSC);
  553.  
  554. glRotatef(OBSERWATOR_OBROT_X, 1, 0, 0);
  555. glRotatef(OBSERWATOR_OBROT_Y, 0, 1, 0);
  556. glRotatef(OBSERWATOR_OBROT_Z, 0, 0, 1);
  557.  
  558. Menu();
  559.  
  560. // Narysowanie bryl
  561. //RysujSzescian(bok);
  562. //RysujUklad();
  563. //Planety();
  564. RysujPierscien();
  565. //RysujPierscien1();
  566. if (w == 1)
  567. {
  568. wektory();
  569. }
  570.  
  571.  
  572. glPushMatrix();
  573. //Wlaczenie oswietlenia
  574. WlaczOswietlenie();
  575. glPopMatrix();
  576. // Przelaczenie buforow ramki
  577. glutSwapBuffers();
  578.  
  579. //Wlaczenie materialow
  580. DefiniujMaterial();
  581.  
  582. //Rysowanie menu
  583. RysujNakladke(liczbaPodzialow);
  584.  
  585.  
  586. }
  587.  
  588. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  589. {
  590. switch (klawisz)
  591. {
  592. case GLUT_KEY_UP:
  593. OBSERWATOR_OBROT_X = (OBSERWATOR_OBROT_X >= 360.0) ? 0.0 : OBSERWATOR_OBROT_X + 1.0;
  594. break;
  595.  
  596. case GLUT_KEY_DOWN:
  597. OBSERWATOR_OBROT_X = (OBSERWATOR_OBROT_X <= -360.0) ? 0.0 : OBSERWATOR_OBROT_X - 1.0;
  598. break;
  599.  
  600. case GLUT_KEY_LEFT:
  601. OBSERWATOR_OBROT_Y = (OBSERWATOR_OBROT_Y <= -360.0) ? 0.0 : OBSERWATOR_OBROT_Y - 1.0;
  602. break;
  603.  
  604. case GLUT_KEY_RIGHT:
  605. OBSERWATOR_OBROT_Y = (OBSERWATOR_OBROT_Y >= 360.0) ? 0.0 : OBSERWATOR_OBROT_Y + 1.0;
  606. break;
  607. case GLUT_KEY_F1:
  608. OBSERWATOR_OBROT_Z = (OBSERWATOR_OBROT_Z <= -360.0) ? 0.0 : OBSERWATOR_OBROT_Z - 1.0;
  609. break;
  610.  
  611. case GLUT_KEY_F2:
  612. OBSERWATOR_OBROT_Z = (OBSERWATOR_OBROT_Z >= 360.0) ? 0.0 : OBSERWATOR_OBROT_Z + 1.0;
  613. break;
  614.  
  615. }
  616. }
  617.  
  618. //////////////////////////////////////////////////////////////////////////////////////////
  619. // Funkcja obslugi klawiatury
  620. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  621. {
  622.  
  623. if (klawisz == 'e')
  624. exit(0);
  625. else if (klawisz == 'r')
  626. {
  627. if (w == 1) {
  628. w = 0;
  629. }
  630. else
  631. w = 1;
  632.  
  633. }
  634. else if (klawisz == '+')
  635. OBSERWATOR_ODLEGLOSC = (OBSERWATOR_ODLEGLOSC > odlmin) ? OBSERWATOR_ODLEGLOSC - 1.0 : OBSERWATOR_ODLEGLOSC;
  636. else if (klawisz == '-')
  637. OBSERWATOR_ODLEGLOSC = (OBSERWATOR_ODLEGLOSC < odlmax) ? OBSERWATOR_ODLEGLOSC + 1.0 : OBSERWATOR_ODLEGLOSC;
  638. else if (klawisz == 'q') {
  639. if (N > 4)
  640. N -= 1;
  641. }
  642. else if (klawisz == 'w') {
  643. if (N < 64)
  644. N += 1;
  645. }
  646. else if (klawisz == 'g')
  647. {
  648.  
  649. liczbaPodzialow = (liczbaPodzialow > 4) ? liczbaPodzialow - 1 : liczbaPodzialow;
  650. dAlpha = 360.0 / liczbaPodzialow;
  651. }
  652. else if (klawisz == 'h')
  653. {
  654. liczbaPodzialow = (liczbaPodzialow < 64) ? liczbaPodzialow + 1 : liczbaPodzialow;
  655. dAlpha = 360.0 / liczbaPodzialow;
  656. }
  657. else if (klawisz == 'p') {
  658. tryb_rysowania = (tryb_rysowania == 1) ? 0 : 1;
  659. if (tryb_rysowania == 1) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  660. else glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  661. }
  662. else if (klawisz == 'v')
  663. oswietlenie1 = oswietlenie1 == 0 ? 1 : 0;
  664. else if (klawisz == 'b')
  665. oswietlenie2 = oswietlenie2 == 0 ? 1 : 0;
  666. else if (klawisz == '1')
  667. material = 1;
  668. else if (klawisz == '2')
  669. material = 2;
  670. else if (klawisz == '3')
  671. material = 3;
  672. else if (klawisz == '4')
  673. {
  674. or += 15;
  675.  
  676.  
  677. }
  678. else if (klawisz == '5')
  679. or-=15;
  680. else if (klawisz == '/')
  681. RysujPierscien1();
  682. else if (klawisz == '9')
  683. obr--;
  684. else if (klawisz == '0')
  685. {
  686. obr++;
  687.  
  688.  
  689.  
  690. }
  691. else if (klawisz == 'o')
  692. {
  693. if (prom >0)
  694. {
  695. prom--;
  696. }
  697. }
  698. else if (klawisz == 'u')
  699. {
  700. if (prom < 5)
  701. {
  702. prom++;
  703. }
  704. }
  705. else if (klawisz == ',')
  706. {
  707. if (lul >= 0.25)
  708. lul = lul - 0.25;
  709. }
  710. else if (klawisz == '.')
  711. {
  712. if (lul<= 0.5)
  713. lul = lul + 0.25;
  714. }
  715. else if (klawisz == 't') {
  716. trybCieni = trybCieni == 0 ? 1 : 0;
  717. if (trybCieni == 0) glShadeModel(GL_SMOOTH);
  718. else glShadeModel(GL_FLAT);
  719. }
  720. }
  721.  
  722.  
  723.  
  724. //////////////////////////////////////////////////////////////////////////////////////////
  725. // Glowna funkcja programu
  726. int main(int argc, char **argv)
  727. {
  728. // Zainicjowanie biblioteki GLUT
  729. glutInit(&argc, argv);
  730.  
  731. // Ustawienie trybu wyswietlania
  732. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  733.  
  734. // Ustawienie polozenia dolenego lewego rogu okna
  735. glutInitWindowPosition(100, 100);
  736.  
  737. // Ustawienie rozmiarow okna
  738. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  739.  
  740. // Utworzenie okna
  741. glutCreateWindow("Szescian");
  742.  
  743. // Odblokowanie bufora glebokosci
  744. glEnable(GL_DEPTH_TEST);
  745.  
  746. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  747. glClearDepth(1000.0);
  748.  
  749. // Ustawienie koloru czyszczenia bufora ramki
  750. glClearColor(0.0f, 0.0f, 0.3f, 0.0f);
  751.  
  752. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  753. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  754.  
  755. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  756. glutDisplayFunc(WyswietlObraz);
  757.  
  758. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  759. // zmieniane sa rozmiary okna
  760. glutReshapeFunc(UstawParametryWidoku);
  761.  
  762. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  763. // zadnych zadan
  764. glutIdleFunc(WyswietlObraz);
  765.  
  766. // Zarejestrowanie funkcji obslugi klawiatury
  767. glutKeyboardFunc(ObslugaKlawiatury);
  768. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  769. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  770. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  771. glutMainLoop();
  772.  
  773. return 0;
  774. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement