Advertisement
Guest User

Untitled

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