Advertisement
Guest User

Untitled

a guest
May 25th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.33 KB | None | 0 0
  1.  
  2. #include "stdafx.h"
  3.  
  4. // stała do obsługi menu podręcznego
  5.  
  6. enum
  7. {
  8. EXIT // wyjście
  9. };
  10.  
  11. GLuint texture[5];
  12.  
  13. AUX_RGBImageRec *LoadBMP(char* filename)
  14. {
  15. FILE* file = NULL;
  16.  
  17. if(!filename)
  18. {
  19. return NULL;
  20. }
  21.  
  22. file = fopen(filename, "r");
  23.  
  24. if(file)
  25. {
  26. fclose(file);
  27. return auxDIBImageLoad(filename);
  28. }
  29.  
  30. return NULL;
  31. }
  32.  
  33.  
  34. int LoadGLTextures()
  35. {
  36. int status = false;
  37.  
  38. AUX_RGBImageRec *TextureImage[5];
  39.  
  40. memset(TextureImage, 0, sizeof(void *)*1);
  41.  
  42. if(TextureImage[0] = LoadBMP("crate.bmp"))
  43. {
  44. status = true;
  45.  
  46. glGenTextures(1, &texture[0]);
  47.  
  48. glBindTexture(GL_TEXTURE_2D, texture[0]);
  49.  
  50. gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
  51.  
  52. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  53.  
  54. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  55.  
  56. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  57.  
  58. }
  59.  
  60. if(TextureImage[1] = LoadBMP("metal.bmp"))
  61. {
  62. status = true;
  63.  
  64. glGenTextures(1, &texture[1]);
  65.  
  66. glBindTexture(GL_TEXTURE_2D, texture[1]);
  67.  
  68. gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[1]->sizeX, TextureImage[1]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[1]->data);
  69.  
  70. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  71.  
  72. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  73.  
  74. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  75.  
  76. }
  77.  
  78. if(TextureImage[2] = LoadBMP("obraz.bmp"))
  79. {
  80. status = true;
  81.  
  82. glGenTextures(1, &texture[2]);
  83.  
  84. glBindTexture(GL_TEXTURE_2D, texture[2]);
  85.  
  86. gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[2]->sizeX, TextureImage[2]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[2]->data);
  87.  
  88. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  89.  
  90. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  91.  
  92. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  93.  
  94. }
  95.  
  96. if(TextureImage[3] = LoadBMP("wall.bmp"))
  97. {
  98. status = true;
  99.  
  100. glGenTextures(1, &texture[3]);
  101.  
  102. glBindTexture(GL_TEXTURE_2D, texture[3]);
  103.  
  104. gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[3]->sizeX, TextureImage[3]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[3]->data);
  105.  
  106. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  107.  
  108. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  109.  
  110. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  111.  
  112. }
  113.  
  114.  
  115. if(TextureImage[4] = LoadBMP("wood.bmp"))
  116. {
  117. status = true;
  118.  
  119. glGenTextures(1, &texture[4]);
  120.  
  121. glBindTexture(GL_TEXTURE_2D, texture[4]);
  122.  
  123. gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[4]->sizeX, TextureImage[4]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[4]->data);
  124.  
  125. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  126.  
  127. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  128.  
  129. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  130.  
  131. }
  132.  
  133. if(TextureImage[0])
  134. {
  135. if(TextureImage[0]->data)
  136. {
  137. free(TextureImage[0]->data);
  138.  
  139. }
  140.  
  141. free(TextureImage[0]);
  142. }
  143.  
  144. return status;
  145. }
  146.  
  147.  
  148.  
  149.  
  150. double PredkoscKamery=0;
  151.  
  152. // pionowy kąt pola widzenia
  153.  
  154. GLdouble fovy = 60;
  155.  
  156. float czajnikrot=0;
  157.  
  158. // wpółrzędne położenia obserwatora
  159.  
  160. GLdouble eyex = 0;
  161.  
  162. GLdouble eyey = 0;
  163.  
  164. GLdouble eyez = 3;
  165.  
  166. GLdouble ObrotX=3.14/2.0;
  167.  
  168. GLdouble ObrotY=0;
  169.  
  170. bool KeyUP=false;
  171.  
  172. bool KeyDOWN=false;
  173.  
  174. bool KeyRIGHT=false;
  175.  
  176. bool KeyLEFT=false;
  177.  
  178. // współrzędne punktu w którego kierunku jest zwrócony obserwator,
  179.  
  180. GLdouble centerx = 0;
  181.  
  182. GLdouble centery = 0;
  183.  
  184. GLdouble centerz = -100;
  185.  
  186. int figure=0;
  187.  
  188. float kat=0;
  189.  
  190. GLuint idlisty;
  191.  
  192. // funkcja generująca scenę 3D
  193.  
  194. void GenerujListyWyswietlania()
  195.  
  196. {
  197.  
  198. glEnable(GL_BLEND);
  199. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  200.  
  201. idlisty = glGenLists( 4 );
  202.  
  203. // utworzenie pierwszej listy
  204. glNewList( idlisty + 0, GL_COMPILE );
  205.  
  206. glTranslatef(0,0,10);
  207.  
  208. glutWireCube(1);
  209.  
  210. glEndList();
  211.  
  212.  
  213.  
  214. // utworzenie drugiej listy
  215. glNewList( idlisty + 1, GL_COMPILE );
  216.  
  217. glTranslatef(0,0,8);
  218.  
  219. glutSolidTeapot(1);
  220.  
  221. //glTranslatef(0,0,10);
  222.  
  223. //glutSolidTeapot(1);
  224.  
  225. //glTranslatef(0,0,10);
  226.  
  227. //glutSolidTeapot(1);
  228.  
  229. glEndList();
  230.  
  231. // utworzenie trzeciej listy
  232. glNewList( idlisty + 2, GL_COMPILE );
  233.  
  234.  
  235. glTranslatef(0,0,10);
  236. LoadGLTextures();
  237. glEnable(GL_TEXTURE_2D);
  238.  
  239.  
  240. glBindTexture(GL_TEXTURE_2D, texture[0]);
  241.  
  242. glPushMatrix();
  243. glScaled(10, 1, 1);
  244. glBegin(GL_QUADS);
  245.  
  246.  
  247. // Front face
  248.  
  249. glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  250.  
  251. glTexCoord2f(10.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
  252.  
  253. glTexCoord2f(10.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
  254.  
  255. glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  256.  
  257.  
  258.  
  259.  
  260. // Back face
  261.  
  262. glTexCoord2f(10.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  263.  
  264. glTexCoord2f(10.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  265.  
  266. glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
  267.  
  268. glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  269.  
  270. // Top face
  271.  
  272. glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  273.  
  274. glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  275.  
  276. glTexCoord2f(10.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
  277.  
  278. glTexCoord2f(10.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
  279.  
  280. // Bottom face
  281.  
  282. glTexCoord2f(10.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  283.  
  284. glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  285.  
  286. glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
  287.  
  288. glTexCoord2f(10.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  289. //
  290. //// Right face
  291. //
  292. //glTexCoord2f(10.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  293. //
  294. //glTexCoord2f(10.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
  295. //
  296. //glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
  297. //
  298. //glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
  299. //
  300. //// Left face
  301. //
  302. //glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  303. //
  304. //glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  305. //
  306. //glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  307. //
  308. //glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  309.  
  310. glEnd();
  311.  
  312. const float fog_color[] = { 256.0, 256.0, 256.0, 1.0f };
  313. glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
  314. glDepthMask(GL_TRUE);
  315. glFogfv(GL_FOG_COLOR, fog_color);
  316. glFogf(GL_FOG_START, 1.0f);
  317.  
  318. glFogf(GL_FOG_DENSITY, 0.25f);
  319.  
  320.  
  321. glPopMatrix();
  322.  
  323.  
  324. glPushMatrix();
  325.  
  326. glTranslatef(0, 0, 10);
  327.  
  328. glScaled(10, 1, 1);
  329.  
  330. glBindTexture(GL_TEXTURE_2D, texture[0]);
  331. glBegin(GL_QUADS);
  332.  
  333.  
  334. // Front face
  335.  
  336. glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  337.  
  338. glTexCoord2f(10.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
  339.  
  340. glTexCoord2f(10.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);
  341.  
  342. glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  343.  
  344. glEnd();
  345.  
  346. glBindTexture(GL_TEXTURE_2D, texture[1]);
  347. glBegin(GL_QUADS);
  348.  
  349.  
  350. // Back face
  351.  
  352. glTexCoord2f(10.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  353.  
  354. glTexCoord2f(10.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  355.  
  356. glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
  357.  
  358. glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);
  359.  
  360. // Top face
  361.  
  362. glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  363.  
  364. glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  365.  
  366. glTexCoord2f(10.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
  367.  
  368. glTexCoord2f(10.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
  369.  
  370. // Bottom face
  371.  
  372. glTexCoord2f(10.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  373.  
  374. glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);
  375.  
  376. glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
  377.  
  378. glTexCoord2f(10.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  379. //
  380. //// Right face
  381. //
  382. //glTexCoord2f(10.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);
  383. //
  384. //glTexCoord2f(10.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
  385. //
  386. //glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);
  387. //
  388. //glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
  389. //
  390. //// Left face
  391. //
  392. //glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  393. //
  394. //glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  395. //
  396. //glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  397. //
  398. //glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  399.  
  400. glEnd();
  401. glPopMatrix();
  402.  
  403. glPushMatrix();
  404. glTranslatef(16.5, 0, 5);
  405.  
  406.  
  407.  
  408.  
  409. glBindTexture(GL_TEXTURE_2D, texture[0]);
  410.  
  411.  
  412. glScaled(6.6, 1, 6.6);
  413. glBegin(GL_QUADS);
  414.  
  415.  
  416. glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  417.  
  418. glTexCoord2f(10.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
  419.  
  420. glTexCoord2f(10.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);
  421.  
  422. glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  423.  
  424.  
  425.  
  426. glEnd();
  427.  
  428. glBindTexture(GL_TEXTURE_2D, texture[2]);
  429. glBegin(GL_QUADS);
  430.  
  431. // Back face
  432.  
  433. glTexCoord2f(10.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  434.  
  435. glTexCoord2f(10.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  436.  
  437. glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
  438.  
  439. glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);
  440.  
  441. // Top face
  442.  
  443. glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  444.  
  445. glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  446.  
  447. glTexCoord2f(10.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
  448.  
  449. glTexCoord2f(10.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
  450.  
  451. // Bottom face
  452.  
  453. glTexCoord2f(10.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  454.  
  455. glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);
  456.  
  457. glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
  458.  
  459. glTexCoord2f(10.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  460.  
  461. // Right face
  462.  
  463. glTexCoord2f(10.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);
  464.  
  465. glTexCoord2f(10.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
  466.  
  467. glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);
  468.  
  469. glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
  470.  
  471. // Left face
  472.  
  473. glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -0.67);
  474.  
  475. glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.67);
  476.  
  477. glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.67);
  478.  
  479. glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -0.67);
  480.  
  481. glEnd();
  482. glPopMatrix();
  483.  
  484. glPushMatrix();
  485. glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
  486. glDepthMask(GL_TRUE);
  487. glFogfv(GL_FOG_COLOR, fog_color);
  488. glFogf(GL_FOG_START, 1.0f);
  489.  
  490. glFogf(GL_FOG_DENSITY, 0.25f);
  491.  
  492.  
  493. glTranslatef(18, 0, 10);
  494.  
  495. glutSolidTeapot(1);
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505. glEndList();
  506.  
  507.  
  508.  
  509. }
  510.  
  511. void UstawKamere()
  512. {
  513. double cosx, siny, sinx;
  514.  
  515. double CelX, CelY, CelZ;
  516.  
  517. // wartości funkcji trygonometrycznych
  518.  
  519. // obliczamy tylko raz dla oszczędności
  520.  
  521. if (KeyDOWN) PredkoscKamery=-0.025;
  522.  
  523. if (KeyUP) PredkoscKamery= 0.025;
  524.  
  525. if (KeyLEFT) ObrotX-= 0.025;
  526.  
  527. if (KeyRIGHT) ObrotX+=0.025;
  528.  
  529. siny = sin(ObrotY);
  530.  
  531. cosx = cos(ObrotX);
  532.  
  533. sinx = sin(ObrotX);
  534.  
  535. // nowa pozycja kamery
  536.  
  537. eyex += cosx*PredkoscKamery;
  538.  
  539. eyey += siny*PredkoscKamery;
  540.  
  541. eyez += sinx*PredkoscKamery;
  542.  
  543. // punkt wycelowania kamery powinien
  544.  
  545. // znajdować się gdzieś "przed jej nosem"
  546.  
  547. CelX = eyex+cosx;
  548.  
  549. CelY = eyey+siny;
  550.  
  551. CelZ = eyez+sinx;
  552.  
  553. gluLookAt(eyex, eyey, eyez,CelX, CelY, CelZ, 0, 1, 0);
  554.  
  555. //gluLookAt( eyex, eyey, eyez, centerx, centery, centerz, 0, 1, 0 );
  556.  
  557. PredkoscKamery=0;
  558. }
  559.  
  560. void Display()
  561. {
  562. // kolor tła - zawartość bufora koloru
  563. glClearColor( 1.0, 0.0, 1.0, 1.0 );
  564.  
  565. glEnable(GL_DEPTH_TEST);
  566.  
  567. // czyszczenie bufora koloru
  568. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  569.  
  570. // wybór macierzy modelowania
  571. glMatrixMode( GL_MODELVIEW );
  572.  
  573. // macierz modelowania = macierz jednostkowa
  574. glLoadIdentity();
  575.  
  576. UstawKamere();
  577.  
  578. // ustawienie obserwatora
  579.  
  580. //glRotatef(kat,1,0,0);
  581.  
  582. // przesunięcie obiektu o wektor [0,0,-3]
  583.  
  584. //glTranslatef( 0, 0, 2.0 );
  585.  
  586. // kolor krawędzi sześcianu
  587. glColor3f( 0.5, 1.0, 0.5 );
  588.  
  589. /*glEnable(GL_LIGHTING);
  590. GLfloat ambientlight[]={1.0, 1.0, 1.0, 1.0};
  591. glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientlight);
  592. GLfloat gray[] = {0.75, 0.75, 0.75, 1.0};
  593. glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gray);*/
  594.  
  595. glEnable(GL_COLOR_MATERIAL);
  596. glEnable(GL_LIGHTING);
  597. glEnable(GL_LIGHT0);
  598. glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
  599.  
  600. glNormal3f(0.0, -1.0, 0.0);
  601.  
  602. glEnable(GL_NORMALIZE);
  603.  
  604. GLfloat DiffuseLight1[]={1.0,1.0,1.0,1.0};
  605. GLfloat LightPosition1[]={0.0, 100.0, -100.0, 1.0};
  606. GLfloat AmbientLight[]={0.1, 0.1, 0.1, 1.0};
  607.  
  608. glLightfv( GL_LIGHT0, GL_DIFFUSE, DiffuseLight1 );
  609. glLightfv( GL_LIGHT0, GL_POSITION, LightPosition1 );
  610. glLightfv( GL_LIGHT0, GL_AMBIENT, AmbientLight );
  611.  
  612. GLfloat specular[]={1.0,1.0,1.0,1.0};
  613.  
  614. glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
  615.  
  616. GLfloat specref[]={1.0,1.0,1.0,1.0};
  617. glMaterialfv(GL_FRONT, GL_SPECULAR, specref);
  618. glMateriali(GL_FRONT, GL_SHININESS, 128);
  619.  
  620.  
  621.  
  622. // glutWireCube(1);
  623. switch (figure)
  624. {
  625. case 1:
  626. glCallList(idlisty+0);
  627. break;
  628.  
  629. case 2:
  630. glCallList(idlisty+1);
  631. break;
  632.  
  633. case 3:
  634. glCallList(idlisty+2);
  635. break;
  636. }
  637.  
  638. // skierowanie poleceń do wykonania
  639. glFlush();
  640.  
  641. // zamiana buforów koloru
  642. glutSwapBuffers();
  643.  
  644. }
  645.  
  646. // zmiana wielkości okna
  647.  
  648. void Reshape( int width, int height )
  649. {
  650. // obszar renderingu - całe okno
  651. glViewport( 0, 0, width, height );
  652.  
  653. // wybór macierzy rzutowania
  654. glMatrixMode( GL_PROJECTION );
  655.  
  656. // macierz rzutowania = macierz jednostkowa
  657. glLoadIdentity();
  658.  
  659. // obliczenie aspektu obrazu z uwzględnieniem
  660. // przypadku, gdy wysokość obrazu wynosi 0
  661. GLdouble aspect = 1;
  662.  
  663. if( height > 0 )
  664.  
  665. aspect = width /( GLdouble ) height;
  666.  
  667. // rzutowanie perspektywiczne
  668. gluPerspective( fovy, aspect, 0.01, 100.0 );
  669.  
  670. // generowanie sceny 3D
  671. Display();
  672. }
  673.  
  674. // obsługa klawiatury
  675.  
  676. void Klawisze( unsigned char key, int x, int y )
  677.  
  678. {
  679. // klawisz +
  680. if( key == '+' && fovy < 180 )
  681. fovy++;
  682.  
  683. // klawisz -
  684. if( key == '-' && fovy > 0 )
  685. fovy--;
  686.  
  687. if( key == 'a' && fovy > 0 )
  688. kat++;
  689.  
  690. if( key == 'w' )
  691. PredkoscKamery=0.03;
  692.  
  693. if( key == 's' )
  694. PredkoscKamery=-0.03;
  695.  
  696. if( key == 'e' )
  697. ObrotX+=0.03;
  698.  
  699. if( key == 'q' )
  700. ObrotX-=0.03;
  701.  
  702. if( key == 'r' )
  703. ObrotY+=0.03;
  704.  
  705. if( key == 'f' )
  706. ObrotY-=0.03;
  707.  
  708. // odrysowanie okna
  709. Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
  710. }
  711.  
  712. void KlawiszeSpecjalne( int key, int x, int y )
  713. {
  714. switch( key )
  715. {
  716. // kursor w lewo
  717. case GLUT_KEY_LEFT:
  718. eyex += 0.6;
  719. break;
  720.  
  721. // kursor w górę
  722. case GLUT_KEY_UP:
  723. eyey -= 0.6;
  724. break;
  725.  
  726. // kursor w prawo
  727. case GLUT_KEY_RIGHT:
  728. eyex -= 0.6;
  729. break;
  730.  
  731. // kursor w dół
  732. case GLUT_KEY_DOWN:
  733. eyey += 0.6;
  734. break;
  735. }
  736. // odrysowanie okna
  737. Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
  738. }
  739.  
  740. // obsługa menu podręcznego
  741.  
  742. void Menu( int value )
  743. {
  744.  
  745. switch( value )
  746. {
  747. // wyjście
  748. case EXIT:
  749.  
  750. exit( 0 );
  751.  
  752. // wyjście
  753. case 1:
  754.  
  755. figure=1;
  756.  
  757. break;
  758.  
  759. case 2:
  760.  
  761. figure=2;
  762.  
  763. break;
  764.  
  765. case 3:
  766.  
  767. figure=3;
  768.  
  769. break;
  770.  
  771. }
  772.  
  773. Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
  774. }
  775.  
  776. void KeyDown(int key,int x,int y)
  777. {
  778.  
  779. switch(key){
  780.  
  781. case GLUT_KEY_UP:
  782.  
  783. KeyUP=true;
  784.  
  785. break;
  786.  
  787. case GLUT_KEY_DOWN:
  788.  
  789. KeyDOWN=true;
  790.  
  791. break;
  792.  
  793. case GLUT_KEY_LEFT:
  794.  
  795. KeyLEFT=true;
  796.  
  797.  
  798. break;
  799.  
  800. case GLUT_KEY_RIGHT:
  801.  
  802. KeyRIGHT=true;
  803.  
  804. break;
  805. }
  806. }
  807.  
  808. void KeyUp(int key,int x,int y)
  809. {
  810.  
  811. switch(key)
  812. {
  813. case GLUT_KEY_UP:
  814. KeyUP=false;
  815. break;
  816.  
  817. case GLUT_KEY_DOWN:
  818. KeyDOWN=false;
  819. break;
  820.  
  821. case GLUT_KEY_LEFT:
  822. KeyLEFT=false;
  823. break;
  824.  
  825. case GLUT_KEY_RIGHT:
  826. KeyRIGHT=false;
  827. break;
  828. }
  829. }
  830.  
  831. int main( int argc, char * argv[] )
  832. {
  833. // inicjalizacja biblioteki GLUT
  834. glutInit( & argc, argv );
  835.  
  836. // inicjalizacja bufora ramki
  837. glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
  838.  
  839. // rozmiary głównego okna programu
  840. glutInitWindowSize( 400, 400 );
  841.  
  842. // utworzenie głównego okna programu
  843. #ifdef WIN32
  844. glutCreateWindow( "Sześcian 3" );
  845. #else
  846. glutCreateWindow( "Szescian 3" );
  847. #endif
  848.  
  849. // dołączenie funkcji generującej scenę 3D
  850. glutDisplayFunc( Display );
  851.  
  852. // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
  853. glutReshapeFunc( Reshape );
  854.  
  855. // dołączenie funkcji obsługi klawiatury
  856. glutKeyboardFunc( Klawisze );
  857.  
  858. // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora
  859. // glutSpecialFunc( KlawiszeSpecjalne );
  860.  
  861. glutSpecialFunc(KeyDown);
  862.  
  863. glutSpecialUpFunc(KeyUp);
  864.  
  865. // utworzenie menu podręcznego
  866. glutCreateMenu( Menu );
  867.  
  868. // dodanie pozycji do menu podręcznego
  869. glutAddMenuEntry( "Wyjście", EXIT );
  870. glutAddMenuEntry( "Rys1", 1 );
  871. glutAddMenuEntry( "Rys2", 2 );
  872. glutAddMenuEntry( "Rys3", 3 );
  873.  
  874. // określenie przycisku myszki obsługującej menu podręczne
  875. glutAttachMenu( GLUT_RIGHT_BUTTON );
  876.  
  877. GenerujListyWyswietlania();
  878.  
  879. glutIdleFunc(Display);
  880. // wprowadzenie programu do obsługi pętli komunikatów
  881. glutMainLoop();
  882. return 0;
  883. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement