Advertisement
pytk

Untitled

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