Guest User

Untitled

a guest
Jan 10th, 2018
319
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 24.18 KB | None | 0 0
  1. //*********************************************************************
  2. //
  3. //  PLIK ŹRÓDŁOWY:       main.cpp
  4. //
  5. //  OPIS:               Program służy do tworzenia oświetlonego i
  6. //                      oteksturowanego modelu jajka 3-D
  7. //
  8. //  AUTOR:              Kamil Kozak, [email protected]
  9. //                     
  10. //
  11. //  DATA                10.01.2018 (Versja 1.00).
  12. //  MODYFIKACJI:
  13. //
  14. //  PLATFORMA:          System operacyjny:  Microsoft Windows 10.
  15. //                      Kompilator:  Microsoft Visual Studi Community 2015 v14.0.
  16. //
  17. //  MATERIAŁY          Nie wykorzystano.
  18. //  ŹRÓDŁOWE:           
  19. //     
  20. //  UŻYTE BIBLIOTEKI   Nie używano.
  21. //  NIESTANDARDOWE
  22. //     
  23. //*********************************************************************
  24. #define _CRT_SECURE_NO_WARNINGS
  25. #include <windows.h>
  26. #include <gl/gl.h>
  27. #include <gl/glut.h>
  28. #include <math.h>
  29. #include <ctime>
  30. #include <stdio.h>
  31. using namespace std;
  32. //static GLfloat theta[] = { 0.0, 0.0, 0.0 }; // trzy kąty obrotu
  33. typedef float point3[3];
  34. int model = 1;  // 1- punkty, 2- siatka, 3 - wypełnione trójkąty
  35. #define N 100
  36. #define pi 3.1415
  37. point3 colors[N][N]; // tablica przechowująca kolory
  38. point3 normal[N][N];
  39. point3 texture[N][N];
  40. static GLfloat viewer[] = { 0.0, 0.0, 10.0 };
  41. static GLfloat thetaX = 0.0;   // kąt obrotu obiektu
  42. static GLfloat thetaY = 0.0;
  43. static GLfloat theta_distance = 10.0;
  44. static GLfloat pix2angle;     // przelicznik pikseli na stopnie
  45. static bool lightVersion = false;
  46. float forw = 1.0 / N;
  47.  
  48.  
  49. static GLint status = 0;       // stan klawiszy myszy
  50.                                // 0 - nie naciśnięto żadnego klawisza
  51.                                // 1 - naciśnięty zostać lewy klawisz
  52.  
  53. static int x_pos_old = 0;       // poprzednia pozycja kursora myszy
  54.  
  55. static int delta_x = 0;        // różnica pomiędzy pozycją bieżącą
  56.                                // i poprzednią kursora myszy
  57. static int y_pos_old = 0;       // poprzednia pozycja kursora myszy
  58.  
  59. static int delta_y = 0;        // różnica pomiędzy pozycją bieżącą
  60.                                // i poprzednią kursora myszy
  61. int distance = 0;
  62.  
  63. static int delta_distance = 0;
  64. //Funkcja rysująca jajko
  65.  
  66. /*************************************************************************************/
  67. // Funkcja wczytuje dane obrazu zapisanego w formacie TGA w pliku o nazwie
  68. // FileName, alokuje pamięć i zwraca wskaźnik (pBits) do bufora w którym
  69. // umieszczone są dane.
  70. // Ponadto udostępnia szerokość (ImWidth), wysokość (ImHeight) obrazu
  71. // tekstury oraz dane opisujące format obrazu według specyfikacji OpenGL
  72. // (ImComponents) i (ImFormat).
  73. // Jest to bardzo uproszczona wersja funkcji wczytującej dane z pliku TGA.
  74. // Działa tylko dla obrazów wykorzystujących 8, 24, or 32 bitowy kolor.
  75. // Nie obsługuje plików w formacie TGA kodowanych z kompresją RLE.
  76. /*************************************************************************************/
  77.  
  78.  
  79. GLbyte *LoadTGAImage(const char *FileName, GLint *ImWidth, GLint *ImHeight, GLint *ImComponents, GLenum *ImFormat)
  80. {
  81.  
  82.     /*************************************************************************************/
  83.  
  84.     // Struktura dla nagłówka pliku  TGA
  85.  
  86.  
  87. #pragma pack(1)            
  88.     typedef struct
  89.     {
  90.         GLbyte    idlength;
  91.         GLbyte    colormaptype;
  92.         GLbyte    datatypecode;
  93.         unsigned short    colormapstart;
  94.         unsigned short    colormaplength;
  95.         unsigned char     colormapdepth;
  96.         unsigned short    x_orgin;
  97.         unsigned short    y_orgin;
  98.         unsigned short    width;
  99.         unsigned short    height;
  100.         GLbyte    bitsperpixel;
  101.         GLbyte    descriptor;
  102.     }TGAHEADER;
  103. #pragma pack(8)
  104.  
  105.     FILE *pFile;
  106.     TGAHEADER tgaHeader;
  107.     unsigned long lImageSize;
  108.     short sDepth;
  109.     GLbyte    *pbitsperpixel = NULL;
  110.  
  111.  
  112.     /*************************************************************************************/
  113.  
  114.     // Wartości domyślne zwracane w przypadku błędu
  115.  
  116.     *ImWidth = 0;
  117.     *ImHeight = 0;
  118.     *ImFormat = GL_BGR_EXT;
  119.     *ImComponents = GL_RGB8;
  120.  
  121.     pFile = fopen(FileName, "rb");
  122.     if (pFile == NULL)
  123.         return NULL;
  124.  
  125.     /*************************************************************************************/
  126.     // Przeczytanie nagłówka pliku
  127.  
  128.  
  129.     fread(&tgaHeader, sizeof(TGAHEADER), 1, pFile);
  130.  
  131.  
  132.     /*************************************************************************************/
  133.  
  134.     // Odczytanie szerokości, wysokości i głębi obrazu
  135.  
  136.     *ImWidth = tgaHeader.width;
  137.     *ImHeight = tgaHeader.height;
  138.     sDepth = tgaHeader.bitsperpixel / 8;
  139.  
  140.  
  141.     /*************************************************************************************/
  142.     // Sprawdzenie, czy głębia spełnia założone warunki (8, 24, lub 32 bity)
  143.  
  144.     if (tgaHeader.bitsperpixel != 8 && tgaHeader.bitsperpixel != 24 && tgaHeader.bitsperpixel != 32)
  145.         return NULL;
  146.  
  147.     /*************************************************************************************/
  148.  
  149.     // Obliczenie rozmiaru bufora w pamięci
  150.  
  151.  
  152.     lImageSize = tgaHeader.width * tgaHeader.height * sDepth;
  153.  
  154.  
  155.     /*************************************************************************************/
  156.  
  157.     // Alokacja pamięci dla danych obrazu
  158.  
  159.  
  160.     pbitsperpixel = (GLbyte*)malloc(lImageSize * sizeof(GLbyte));
  161.  
  162.     if (pbitsperpixel == NULL)
  163.         return NULL;
  164.  
  165.     if (fread(pbitsperpixel, lImageSize, 1, pFile) != 1)
  166.     {
  167.         free(pbitsperpixel);
  168.         return NULL;
  169.     }
  170.  
  171.  
  172.     /*************************************************************************************/
  173.  
  174.     // Ustawienie formatu OpenGL
  175.  
  176.  
  177.     switch (sDepth)
  178.  
  179.     {
  180.  
  181.     case 3:
  182.  
  183.         *ImFormat = GL_BGR_EXT;
  184.  
  185.         *ImComponents = GL_RGB8;
  186.  
  187.         break;
  188.  
  189.     case 4:
  190.  
  191.         *ImFormat = GL_BGRA_EXT;
  192.  
  193.         *ImComponents = GL_RGBA8;
  194.  
  195.         break;
  196.  
  197.     case 1:
  198.  
  199.         *ImFormat = GL_LUMINANCE;
  200.  
  201.         *ImComponents = GL_LUMINANCE8;
  202.  
  203.         break;
  204.  
  205.     };
  206.  
  207.  
  208.  
  209.     fclose(pFile);
  210.  
  211.  
  212.  
  213.     return pbitsperpixel;
  214.  
  215. }
  216.  
  217. /*************************************************************************************/
  218.  
  219. int Egg()
  220. {
  221.     point3 points[N][N];
  222.  
  223.     for (int u = 0; u < N; u++)
  224.     {
  225.         for (int v = 0; v < N; v++)
  226.         {
  227.             float i = (float)u / N;
  228.             float j = (float)v / N;
  229.  
  230.             texture[u][v][0] = i;
  231.             texture[u][v][1] = j;
  232.  
  233.             points[u][v][0] = (-90 * pow(i, 5) + 225 * pow(i, 4) - 270 * pow(i, 3) + 180 * pow(i, 2) - 45 * i)*cos(3.14*j);
  234.             points[u][v][1] = (160 * pow(i, 4) - 320 * pow(i, 3) + 160 * pow(i, 2)) - 5.0;
  235.             points[u][v][2] = (-90 * pow(i, 5) + 225 * pow(i, 4) - 270 * pow(i, 3) + 180 * pow(i, 2) - 45 * i)*sin(3.14*j);
  236.         }
  237.     }
  238.  
  239.     //Jajko jako zbiór punktów
  240.     if (model == 1)
  241.     {
  242.         for (int u = 0; u < N; u++)
  243.         {
  244.             for (int v = 0; v < N; v++)
  245.             {
  246.                 glBegin(GL_POINTS);
  247.                 glVertex3fv(points[u][v]);
  248.                 //glVertex3f(points[u][v][0], points[u][v][1], points[u][v][2]);
  249.                 glEnd();
  250.             }
  251.         }
  252.     }
  253.     //Jajko jako siatka linii
  254.     if (model == 2)
  255.     {
  256.         for (int u = 0; u < N - 1; u++)
  257.         {
  258.             for (int v = 0; v < N - 1; v++)
  259.             {
  260.                 glBegin(GL_LINES);
  261.                 glVertex3fv(points[u][v]); // Rysowanie trójkątów z linii
  262.                 glVertex3fv(points[u][v + 1]);
  263.                 glVertex3fv(points[u + 1][v]);
  264.                 glVertex3fv(points[u + 1][v + 1]);
  265.                 glVertex3fv(points[u + 1][v]);
  266.                 glVertex3fv(points[u][v + 1]);
  267.                 glEnd();
  268.             }
  269.         }
  270.     }
  271.  
  272.     // Jajko jako kolorowe trójkąty
  273.     if (model == 3)
  274.     {
  275.         glBegin(GL_TRIANGLES);
  276.         for (int u = 0; u < N - 1; u++)
  277.         {
  278.             for (int v = 0; v < N - 1 ; v++)
  279.             {
  280.                 /*glBegin(GL_TRIANGLES);
  281.  
  282.                 glNormal3fv(normal[u][v]);
  283.                 glTexCoord2fv(texture[u][v]);
  284.                 glVertex3fv(points[u][v]);
  285.  
  286.                 glNormal3fv(normal[u+1][v]);
  287.                 glTexCoord2fv(points[u + 1][v]);
  288.                 glVertex3fv((points[u + 1][v]));
  289.  
  290.                 glNormal3fv(normal[u][v+1]);
  291.                 glTexCoord2fv(texture[u][v + 1]);
  292.                 glVertex3fv((points[u][v + 1]));
  293.                 glEnd();
  294.  
  295.                 glBegin(GL_TRIANGLES);
  296.                 glNormal3fv(normal[u+1][v+1]);
  297.                 glTexCoord2fv(texture[u + 1][v + 1]);
  298.                 glVertex3fv((points[u + 1][v + 1]));
  299.  
  300.                 glNormal3fv(normal[u+1][v]);
  301.                 glTexCoord2fv(texture[u + 1][v]);
  302.                 glVertex3fv((points[u + 1][v]));
  303.  
  304.                 glNormal3fv(normal[u][v+1]);
  305.                 glTexCoord2fv(texture[u][v + 1]);
  306.                 glVertex3fv((points[u][v + 1]));
  307.                 glEnd(); */
  308.  
  309.                
  310.                 if (u == N - 1)
  311.                 {
  312.                    
  313.                     glNormal3fv(normal[u][v]);
  314.                     glTexCoord2fv(texture[u][v]);
  315.                     glVertex3fv(points[u][v]);
  316.                    
  317.                     glNormal3fv(normal[0][v]);
  318.                     glTexCoord2fv(points[0][v]);
  319.                     glVertex3fv((points[0][v]));
  320.                    
  321.                     glNormal3fv(normal[u][0]);
  322.                     glTexCoord2fv(texture[u][0]);
  323.                     glVertex3fv((points[u][0]));
  324.                    
  325.                     glNormal3fv(normal[0][0]);
  326.                     glTexCoord2fv(texture[0][0]);
  327.                     glVertex3fv((points[0][0]));
  328.                    
  329.                     glNormal3fv(normal[u][0]);
  330.                     glTexCoord2fv(texture[u][0]);
  331.                     glVertex3fv((points[u][0]));
  332.                    
  333.                     glNormal3fv(normal[0][v]);
  334.                     glTexCoord2fv(texture[0][v]);
  335.                     glVertex3fv((points[0][v]));
  336.                 }
  337.                 else if (v == N - 1)
  338.                 {
  339.                    
  340.                     glNormal3fv(normal[u][v]);
  341.                     glTexCoord2fv(texture[u][v]);
  342.                     glVertex3fv(points[u][v]);
  343.                    
  344.                     glNormal3fv(normal[u + 1][v]);
  345.                     glTexCoord2fv(texture[u+1][v]);
  346.                     glVertex3fv((points[u + 1][v]));
  347.                    
  348.                     glNormal3fv(normal[u][v]);
  349.                     glTexCoord2fv(texture[u][v]);
  350.                     glVertex3fv((points[u][v]));
  351.                    
  352.                     glNormal3fv(normal[u + 1][v]);
  353.                     glTexCoord2fv(texture[u+1][v]);
  354.                     glVertex3fv((points[u + 1][v]));
  355.                    
  356.                     glNormal3fv(normal[u][v]);
  357.                     glTexCoord2fv(texture[u][v]);
  358.                     glVertex3fv((points[u][v]));
  359.                    
  360.                     glNormal3fv(normal[u + 1][v]);
  361.                     glTexCoord2fv(texture[u+1][v]);
  362.                     glVertex3fv((points[u + 1][v]));
  363.                 }
  364.                 else
  365.                 {
  366.                    
  367.                     glNormal3fv(normal[u][v]);
  368.                     glTexCoord2fv(texture[u][v]);
  369.                     glVertex3fv(points[u][v]);
  370.                    
  371.                     glNormal3fv(normal[u + 1][v]);
  372.                     glTexCoord2fv(texture[u+1][v]);
  373.                     glVertex3fv((points[u + 1][v]));
  374.                    
  375.                     glNormal3fv(normal[u][v + 1]);
  376.                     glTexCoord2fv(texture[u][v+1]);
  377.                     glVertex3fv((points[u][v + 1]));
  378.                    
  379.                     glNormal3fv(normal[u + 1][v + 1]);
  380.                     glTexCoord2fv(texture[u+1][v+1]);
  381.                     glVertex3fv((points[u + 1][v + 1]));
  382.                    
  383.                     glNormal3fv(normal[u][v + 1]);
  384.                     glTexCoord2fv(texture[u][v+1]);
  385.                     glVertex3fv((points[u][v + 1]));
  386.                    
  387.                     glNormal3fv(normal[u + 1][v]);
  388.                     glTexCoord2fv(texture[u+1][v]);
  389.                     glVertex3fv((points[u + 1][v]));
  390.                 }
  391.                
  392.             }
  393.         }
  394.         glEnd();
  395.     }
  396.     return 0;
  397. }
  398.  
  399. void EggVectors() {
  400.     // Liczenie Punktow
  401.     for (int i = 0; i < N; i++) {
  402.         for (int j = 0; j < N; j++) {
  403.             float u = i * forw;
  404.             float v = j * forw;
  405.  
  406.             //Kolory
  407.             GLfloat* color = new GLfloat[3];
  408.             color[0] = ((double)rand() / (RAND_MAX));
  409.             color[1] = ((double)rand() / (RAND_MAX));
  410.             color[2] = ((double)rand() / (RAND_MAX));
  411.  
  412.             float xU = (-450 * pow(u, 4) + 900 * pow(u, 3) - 810 * pow(u, 2) + 360 * u - 45) * cos(pi * v);
  413.             float xV = pi * (90 * pow(u, 5) - 225 * pow(u, 4) + 270 * pow(u, 3) - 180 * pow(u, 2) + 45 * u) * sin(pi * v);
  414.             float yU = (640 * pow(u, 3) - 960 * pow(u, 2) + 320 * u);
  415.             float yV = 0;
  416.             float zU = (-450 * pow(u, 4) + 900 * pow(u, 3) - 810 * pow(u, 2) + 360 * u - 45)  * sin(pi * v);
  417.             float zV = -pi * (90 * pow(u, 5) - 225 * pow(u, 4) + 270 * pow(u, 3) - 180 * pow(u, 2) + 45 * u) * cos(pi * v);
  418.  
  419.             normal[i][j][0] = yU * zV - zU * yV;
  420.             normal[i][j][1] = zU * xV - xU * zV;
  421.             normal[i][j][2] = xU * yV - yU * xV;
  422.  
  423.  
  424.             float vectorLenght = sqrt(normal[i][j][0] * normal[i][j][0] + normal[i][j][1] * normal[i][j][1] + normal[i][j][2] * normal[i][j][2]);
  425.  
  426.  
  427.             normal[i][j][0] = normal[i][j][0] / vectorLenght;
  428.             normal[i][j][1] = normal[i][j][1] / vectorLenght;
  429.             normal[i][j][2] = normal[i][j][2] / vectorLenght;
  430.  
  431.             if (vectorLenght == 0) {
  432.  
  433.                 if (i == 0) {
  434.                     normal[i][j][0] = 0.0f;
  435.                     normal[i][j][1] = -1.0f;
  436.                     normal[i][j][2] = 0.0f;
  437.                 }
  438.                 if (i == N - 1) {
  439.                     normal[i][j][0] = 0.0f;
  440.                     normal[i][j][1] = 1.0f;
  441.                     normal[i][j][2] = 0.0f;
  442.                 }
  443.  
  444.             }
  445.         }
  446.     }
  447.  
  448.     for (int i = N / 2; i < N; i++)
  449.     {
  450.         for (int j = 0; j < N; j++)
  451.         {
  452.             for (int k = 0; k < 3; k++)
  453.             {
  454.                 normal[i][j][k] *= -1;
  455.             }
  456.         }
  457.     }
  458. }
  459.  
  460. /*************************************************************************************/
  461. // Funkcja rysująca osie układu współrzędnych
  462. void Axes(void)
  463. {
  464.     point3  x_min = { -5.0, 0.0, 0.0 };
  465.     point3  x_max = { 5.0, 0.0, 0.0 };
  466.     // początek i koniec obrazu osi x
  467.  
  468.     point3  y_min = { 0.0, -5.0, 0.0 };
  469.     point3  y_max = { 0.0,  5.0, 0.0 };
  470.     // początek i koniec obrazu osi y
  471.  
  472.     point3  z_min = { 0.0, 0.0, -5.0 };
  473.     point3  z_max = { 0.0, 0.0,  5.0 };
  474.     //  początek i koniec obrazu osi y
  475.     glColor3f(1.0f, 0.0f, 0.0f);  // kolor rysowania osi - czerwony
  476.     glBegin(GL_LINES); // rysowanie osi x
  477.     glVertex3fv(x_min);
  478.     glVertex3fv(x_max);
  479.     glEnd();
  480.  
  481.     glColor3f(0.0f, 1.0f, 0.0f);  // kolor rysowania - zielony
  482.     glBegin(GL_LINES);  // rysowanie osi y
  483.     glVertex3fv(y_min);
  484.     glVertex3fv(y_max);
  485.     glEnd();
  486.  
  487.     glColor3f(0.0f, 0.0f, 1.0f);  // kolor rysowania - niebieski
  488.     glBegin(GL_LINES); // rysowanie osi z
  489.     glVertex3fv(z_min);
  490.     glVertex3fv(z_max);
  491.     glEnd();
  492. }
  493.  
  494. /*************************************************************************************/
  495. // Funkcja "bada" stan myszy i ustawia wartości odpowiednich zmiennych globalnych
  496.  
  497. void Mouse(int btn, int state, int x, int y)
  498. {
  499.  
  500.  
  501.     if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  502.     {
  503.         x_pos_old = x;         // przypisanie aktualnie odczytanej pozycji kursora
  504.         y_pos_old = y;
  505.         // jako pozycji poprzedniej
  506.         status = 1;          // wcięnięty został lewy klawisz myszy
  507.         status = lightVersion ? 3 : 1;
  508.     }
  509.     else if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
  510.     {
  511.         distance = y;
  512.  
  513.         status = 2;
  514.         status = lightVersion ? 4 : 2;
  515.     }
  516. }
  517.  
  518. /*************************************************************************************/
  519. // Funkcja "monitoruje" położenie kursora myszy i ustawia wartości odpowiednich
  520. // zmiennych globalnych
  521.  
  522. void Motion(GLsizei x, GLsizei y)
  523. {
  524.  
  525.     delta_x = x - x_pos_old;     // obliczenie różnicy położenia kursora myszy
  526.  
  527.     delta_y = y - y_pos_old;
  528.  
  529.     x_pos_old = x;            // podstawienie bieżącego położenia jako poprzednie
  530.  
  531.     y_pos_old = y;
  532.  
  533.     delta_distance = y - distance;
  534.  
  535.     distance = y;
  536.  
  537.     glutPostRedisplay();     // przerysowanie obrazu sceny
  538. }
  539.  
  540. /*************************************************************************************/
  541.  
  542.  
  543. /*************************************************************************************/
  544. // Funkcja określająca co ma być rysowane (zawsze wywoływana gdy trzeba
  545. // przerysować scenę)
  546. void RenderScene(void)
  547. {
  548.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  549.     // Czyszczenie okna aktualnym kolorem czyszczącym
  550.  
  551.     glLoadIdentity();
  552.     // Czyszczenie macierzy bieżącej
  553.     gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  554.     // Zdefiniowanie położenia obserwatora
  555.     glDisable(GL_LIGHTING);
  556.     Axes();
  557.     glEnable(GL_LIGHTING);
  558.     // Narysowanie osi przy pomocy funkcji zdefiniowanej wyżej
  559.  
  560.     if (status == 1)                     // jeśli lewy klawisz myszy wcięnięty
  561.     {
  562.         thetaX += delta_x  *pix2angle / 40.0;    // modyfikacja kąta obrotu o kat proporcjonalny
  563.         thetaY += delta_y * pix2angle / 40.0;
  564.     }                                            // do różnicy położeń kursora myszy
  565.     if (status == 2)                    // jeśli prawy klawisz myszy jest wciśnięty        
  566.     {
  567.         theta_distance += delta_distance / 10.0;
  568.     }
  569.  
  570.     viewer[0] = theta_distance * cos(thetaX) * cos(thetaY);
  571.     viewer[1] = theta_distance * sin(thetaY);
  572.     viewer[2] = theta_distance * sin(thetaX) * cos(thetaY);
  573.  
  574.     Egg();
  575.  
  576.     //Oswietlenie
  577.  
  578.     glFlush();
  579.     // Przekazanie poleceń rysujących do wykonania
  580.  
  581.     glutSwapBuffers();
  582. }
  583.  
  584. /*************************************************************************************/
  585. // Funkcja ustalająca stan renderowania
  586.  
  587. void MyInit(void)
  588. {
  589.     EggVectors();
  590.     //glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  591.     // Kolor czyszcący (wypełnienia okna) ustawiono na czarny
  592.  
  593.         /*************************************************************************************/
  594.  
  595.         // Zmienne dla obrazu tekstury
  596.  
  597.  
  598.  
  599.         GLbyte *pBytes;
  600.         GLint ImWidth, ImHeight, ImComponents;
  601.         GLenum ImFormat;
  602.  
  603.  
  604.         // ..................................      
  605.         //       Pozostała część funkcji MyInit()
  606.  
  607.         // ..................................
  608.  
  609.         /*************************************************************************************/
  610.  
  611.         // Teksturowanie będzie prowadzone tyko po jednej stronie ściany
  612.  
  613.         //glEnable(GL_CULL_FACE);
  614.  
  615.  
  616.         /*************************************************************************************/
  617.  
  618.         //  Przeczytanie obrazu tekstury z pliku o nazwie tekstura.tga
  619.  
  620.         pBytes = LoadTGAImage("P3_t.tga", &ImWidth, &ImHeight, &ImComponents, &ImFormat);
  621.  
  622.  
  623.         /*************************************************************************************/
  624.  
  625.         // Zdefiniowanie tekstury 2-D
  626.  
  627.         glTexImage2D(GL_TEXTURE_2D, 0, ImComponents, ImWidth, ImHeight, 0, ImFormat, GL_UNSIGNED_BYTE, pBytes);
  628.  
  629.         /*************************************************************************************/
  630.  
  631.         // Zwolnienie pamięci
  632.  
  633.         free(pBytes);
  634.  
  635.  
  636.         /*************************************************************************************/
  637.  
  638.         // Włączenie mechanizmu teksturowania
  639.  
  640.         glEnable(GL_TEXTURE_2D);
  641.  
  642.         /*************************************************************************************/
  643.  
  644.         // Ustalenie trybu teksturowania
  645.  
  646.         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  647.  
  648.         /*************************************************************************************/
  649.  
  650.         // Określenie sposobu nakładania tekstur
  651.  
  652.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  653.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  654.  
  655.         glClearColor(0.0f, 0.0f, 0.1f, 1.0f);
  656.  
  657.     /*************************************************************************************/
  658.     //  Definicja materiału z jakiego zrobiony jest czajnik
  659.     //  i definicja źródła światła
  660.     /*************************************************************************************/
  661.  
  662.     /*************************************************************************************/
  663.     // Definicja materiału z jakiego zrobiony jest czajnik
  664.  
  665.     GLfloat mat_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
  666.     // współczynniki ka =[kar,kag,kab] dla światła otoczenia
  667.  
  668.     GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
  669.     // współczynniki kd =[kdr,kdg,kdb] światła rozproszonego
  670.  
  671.     GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  672.     // współczynniki ks =[ksr,ksg,ksb] dla światła odbitego                
  673.  
  674.     GLfloat mat_shininess = { 10.0 };
  675.     // współczynnik n opisujący połysk powierzchni
  676.  
  677.     /*************************************************************************************/
  678.     // Definicja źródła światła
  679.     //GLfloat spot_direction[] = { -1.0, -1.0, 0.0 };
  680.  
  681.     GLfloat light_position[] = { 10.0f, 0.0f, 0.0f, 1.0f};
  682.     // położenie źródła
  683.  
  684.     GLfloat light_ambient[] = { 0.0, 0.0, 0.1, 1.0};
  685.     // składowe intensywności świecenia źródła światła otoczenia
  686.     // Ia = [Iar,Iag,Iab]
  687.  
  688.     GLfloat light_diffuse[] = { 0.0, 0.0, 1.0, 1.0 };
  689.     // składowe intensywności świecenia źródła światła powodującego
  690.     // odbicie dyfuzyjne Id = [Idr,Idg,Idb]
  691.  
  692.     GLfloat light_specular[] = { 0.5, 0.5, 1.0, 1.0 };
  693.     // składowe intensywności świecenia źródła światła powodującego
  694.     // odbicie kierunkowe Is = [Isr,Isg,Isb]
  695.  
  696.     GLfloat att_constant = { 1.0 };
  697.     // składowa stała ds dla modelu zmian oświetlenia w funkcji
  698.     // odległości od źródła
  699.  
  700.     GLfloat att_linear = { 0.35f };
  701.     // składowa liniowa dl dla modelu zmian oświetlenia w funkcji
  702.     // odległości od źródła
  703.  
  704.     GLfloat att_quadratic = { 0.051f };
  705.     // składowa kwadratowa dq dla modelu zmian oświetlenia w funkcji
  706.     // odległości od źródła
  707.  
  708.     /*************************************************************************************/
  709.     // Ustawienie parametrów materiału i źródła światła
  710.     /*************************************************************************************/
  711.     // Ustawienie patrametrów materiału
  712.  
  713.     glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  714.     glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
  715.     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  716.     glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
  717.  
  718.     /*************************************************************************************/
  719.     // Ustawienie parametrów źródła
  720.  
  721.     glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  722.     glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  723.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  724.     //glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  725.     //glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
  726.     //glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, att_constant);
  727.     //glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, att_linear);
  728.     //glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, att_quadratic);
  729.  
  730.     /*************************************************************************************/
  731.     // Ustawienie opcji systemu oświetlania sceny
  732.  
  733.     glShadeModel(GL_SMOOTH); // właczenie łagodnego cieniowania
  734.     glEnable(GL_LIGHTING);   // właczenie systemu oświetlenia sceny
  735.     glEnable(GL_LIGHT0);     // włączenie źródła o numerze 0
  736.     glEnable(GL_DEPTH_TEST); // włączenie mechanizmu z-bufora
  737.  
  738.                              /*************************************************************************************/
  739. }
  740. /*************************************************************************************/
  741. // Funkcja ma za zadanie utrzymanie stałych proporcji rysowanych
  742. // w przypadku zmiany rozmiarów okna.
  743. // Parametry vertical i horizontal (wysokość i szerokość okna) są
  744. // przekazywane do funkcji za każdym razem gdy zmieni się rozmiar okna.
  745.  
  746. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  747. {
  748.     pix2angle = 360.0 / (float)horizontal;  // przeliczenie pikseli na stopnie
  749.     GLfloat AspectRatio;
  750.     // Deklaracja zmiennej AspectRatio  określającej proporcję
  751.     // wymiarów okna
  752.     if (vertical == 0)  // Zabezpieczenie przed dzieleniem przez 0
  753.         vertical = 1;
  754.     glViewport(0, 0, horizontal, vertical);
  755.     // Ustawienie wielkościokna okna widoku (viewport)
  756.     // W tym przypadku od (0,0) do (horizontal, vertical)  
  757.     glMatrixMode(GL_PROJECTION);
  758.     // Przełączenie macierzy bieżącej na macierz projekcji
  759.     glLoadIdentity();
  760.     // Czyszcznie macierzy bieżącej            
  761.     gluPerspective(70, 1.0, 1.0, 30.0);
  762.     // Ustawienie parametrów dla rzutu perspektywicznego
  763.  
  764.  
  765.     if (horizontal <= vertical)
  766.         glViewport(0, (vertical - horizontal) / 2, horizontal, horizontal);
  767.  
  768.     else
  769.         glViewport((horizontal - vertical) / 2, 0, vertical, vertical);
  770.     // Ustawienie wielkości okna okna widoku (viewport) w zależności
  771.     // relacji pomiędzy wysokością i szerokością okna
  772.     glMatrixMode(GL_MODELVIEW);
  773.     // Przełączenie macierzy bieżącej na macierz widoku modelu                                  
  774.     glLoadIdentity();
  775.     // Czyszcenie macierzy bieżącej
  776. }
  777.  
  778. //Funkcja reagowania na klawisze klawiatury
  779. void keys(unsigned char key, int x, int y)
  780. {
  781.     if (key == 'p') model = 1;
  782.     if (key == 'w') model = 2;
  783.     if (key == 's') model = 3;
  784.     if (key == 'x') {
  785.         lightVersion = !lightVersion;
  786.     }
  787.  
  788.     for (int u = 0; u < N; u++) // Wylosowanie kolorów do tablicy
  789.     {
  790.         for (int v = 0; v < N; v++)
  791.         {
  792.             for (int k = 0; k < 3; k++)
  793.             {
  794.                 float color = (rand() % 100);
  795.                 color = color / 100;
  796.                 colors[u][v][k] = color;
  797.             }
  798.         }
  799.     }
  800.  
  801.     RenderScene(); // przerysowanie obrazu sceny
  802. }
  803.  
  804.  
  805. void main(void)
  806. {
  807.     srand(time(NULL));
  808.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  809.  
  810.     glutInitWindowSize(300, 300);
  811.  
  812.     glutCreateWindow("Układ współrzędnych 3-D");
  813.  
  814.     glutKeyboardFunc(keys);
  815.  
  816.     glutMouseFunc(Mouse);
  817.     // Ustala funkcję zwrotną odpowiedzialną za badanie stanu myszy
  818.  
  819.     glutMotionFunc(Motion);
  820.     // Ustala funkcję zwrotną odpowiedzialną za badanie ruchu myszy
  821.  
  822.  
  823.     glutDisplayFunc(RenderScene);
  824.     // Określenie, że funkcja RenderScene będzie funkcją zwrotną
  825.     // (callback function).  Bedzie ona wywoływana za każdym razem
  826.     // gdy zajdzie potrzba przeryswania okna
  827.     glutReshapeFunc(ChangeSize);
  828.     // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną
  829.     // zazmiany rozmiaru okna      
  830.     MyInit();
  831.     // Funkcja MyInit() (zdefiniowana powyżej) wykonuje wszelkie
  832.     // inicjalizacje konieczne  przed przystąpieniem do renderowania
  833.     glEnable(GL_DEPTH_TEST);
  834.     // Włączenie mechanizmu usuwania powierzchni niewidocznych
  835.  
  836.     glutMainLoop();
  837.     // Funkcja uruchamia szkielet biblioteki GLUT
  838. }
  839. /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment