Advertisement
Guest User

Untitled

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