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