Facebook
From Tacky Penguin, 7 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 304
  1. /*
  2. Niniejszy program jest wolnym oprogramowaniem; możesz go
  3. rozprowadzać dalej i / lub modyfikować na warunkach Powszechnej
  4. Licencji Publicznej GNU, wydanej przez Fundację Wolnego
  5. Oprogramowania - według wersji 2 tej Licencji lub(według twojego
  6. wyboru) którejś z późniejszych wersji.
  7.  
  8. Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on
  9. użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej
  10. gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH
  11. ZASTOSOWAŃ.W celu uzyskania bliższych informacji sięgnij do
  12. Powszechnej Licencji Publicznej GNU.
  13.  
  14. Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz
  15. Powszechnej Licencji Publicznej GNU(GNU General Public License);
  16. jeśli nie - napisz do Free Software Foundation, Inc., 59 Temple
  17. Place, Fifth Floor, Boston, MA  02110 - 1301  USA
  18. */
  19.  
  20. #define GLM_FORCE_RADIANS
  21. #define GLEW_STATIC
  22.  
  23. #include <GL/glew.h>
  24. #include <GLFW/glfw3.h>
  25. #include <glm/glm.hpp>
  26. #include <glm/gtc/type_ptr.hpp>
  27. #include <glm/gtc/matrix_transform.hpp>
  28. #include <stdlib.h>
  29. #include <stdio.h>
  30. #include <lodepng.h>
  31. #include "constants.h"
  32. #include "allmodels.h"
  33. #include "mycube.h"
  34.  
  35. using namespace glm;
  36.  
  37. float aspect=1.0f; //Aktualny stosunek szerokości do wysokości okna
  38. float speed_x=0; //Szybkość kątowa obrotu obiektu w radianach na sekundę wokół osi x
  39. float speed_y=0; //Szybkość kątowa obrotu obiektu w radianach na sekundę wokół osi y
  40. GLuint tex; //Uchwyt – deklaracja globalna
  41.  
  42.  
  43.  
  44.  
  45.  
  46. //Procedura obsługi błędów
  47. void error_callback(int error, const char* description) {
  48.         fputs(description, stderr);
  49. }
  50.  
  51. //Procedura obługi zmiany rozmiaru bufora ramki
  52. void windowResize(GLFWwindow* window, int width, int height) {
  53.     glViewport(0, 0, width, height); //Obraz ma być generowany w oknie o tej rozdzielczości
  54.     aspect=(float)width/(float)height; //Stosunek szerokości do wysokości okna
  55. }
  56.  
  57. //Procedura obsługi klawiatury
  58. void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods){
  59.     if (action == GLFW_PRESS) {
  60.         if (key == GLFW_KEY_LEFT) speed_y=PI/2;
  61.         if (key == GLFW_KEY_RIGHT) speed_y=-PI/2;
  62.         if (key == GLFW_KEY_UP) speed_x=PI/2;
  63.         if (key == GLFW_KEY_DOWN) speed_x=-PI/2;
  64.     }
  65.  
  66.     if (action == GLFW_RELEASE) {
  67.         if (key == GLFW_KEY_LEFT) speed_y=0;
  68.         if (key == GLFW_KEY_RIGHT) speed_y=0;
  69.         if (key == GLFW_KEY_UP) speed_x=0;
  70.         if (key == GLFW_KEY_DOWN) speed_x=0;
  71.     }
  72. }
  73.  
  74. //Procedura inicjująca
  75. void initOpenGLProgram(GLFWwindow* window) {
  76.         //************Tutaj umieszczaj kod, który należy wykonać raz, na początku programu************
  77.     glfwSetFramebufferSizeCallback(window, windowResize); //Zarejestruj procedurę obsługi zmiany rozdzielczości bufora ramki
  78.     glfwSetKeyCallback(window, key_callback); //Zarejestruj procedurę obsługi klawiatury
  79.  
  80.         glClearColor(0,0,0,1); //Ustaw kolor czyszczenia ekranu
  81.  
  82.         glEnable(GL_LIGHTING); //Włącz tryb cieniowania
  83.         glEnable(GL_LIGHT0); //Włącz zerowe źródło światła
  84.         glEnable(GL_DEPTH_TEST); //Włącz używanie budora głębokości
  85.         //glEnable(GL_COLOR_MATERIAL); //Włącz śledzenie kolorów przez materiał
  86.     glEnable(GL_TEXTURE_2D);
  87.     glEnable(GL_NORMALIZE);
  88.         //Wczytanie i import obrazka – w initOpenGLProgram
  89.     //Wczytanie do pamięci komputera
  90.     std::vector<unsigned char> image; //Alokuj wektor do wczytania obrazka
  91.     unsigned width, height; //Zmienne do których wczytamy wymiary obrazka
  92.     //Wczytaj obrazek
  93.     unsigned error = lodepng::decode(image, width, height, "bricks.png");
  94.     //Import do pamięci karty graficznej
  95.     glGenTextures(1,&tex); //Zainicjuj jeden uchwyt
  96.     glBindTexture(GL_TEXTURE_2D, tex); //Uaktywnij uchwyt
  97.     //Wczytaj obrazek do pamięci KG skojarzonej z uchwytem
  98.     glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0,
  99.     GL_RGBA, GL_UNSIGNED_BYTE, (unsigned char*) image.data());
  100.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  101.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  102.  
  103.  
  104. }
  105.  
  106. //Procedura rysująca zawartość sceny
  107. void drawScene(GLFWwindow* window,float angle_x,float angle_y) {
  108.         //************Tutaj umieszczaj kod rysujący obraz******************l
  109.     float ambientemmisio[]={0,0,0,1};
  110.     float ambientemmisio2[]={0,0,0,1};
  111.     float difussion[]={0.7,0.5,0.5,1};
  112.     float specular[] = {0,0,0,1};
  113.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //Wyczyść bufor kolorów (czyli przygotuj "płótno" do rysowania)
  114.  
  115.     //***Przygotowanie do rysowania****
  116.     mat4 P=perspective(50.0f*PI/180.0f,aspect,1.0f,50.0f); //Wylicz macierz rzutowania P
  117.     mat4 V=lookAt( //Wylicz macierz widoku
  118.                   vec3(0.0f,0.0f,-5.0f),
  119.                   vec3(0.0f,0.0f,0.0f),
  120.                   vec3(0.0f,1.0f,0.0f));
  121.     glMatrixMode(GL_PROJECTION); //Włącz tryb modyfikacji macierzy rzutowania
  122.     glLoadMatrixf(value_ptr(P)); //Załaduj macierz rzutowania
  123.  
  124.     glMatrixMode(GL_MODELVIEW);  //Włącz tryb modyfikacji macierzy model-widok
  125.  
  126.  
  127.     //Rysowanie kostki
  128.     mat4 M=mat4(1.0f);
  129.     M=rotate(M,angle_x,vec3(1.0f,0.0f,0.0f));
  130.     M=rotate(M,angle_y,vec3(0.0f,1.0f,0.0f));
  131.     glLoadMatrixf(value_ptr(V));
  132.     float lightPos[]={0,0,-6,1};
  133.     float lightPos2[]= {0,0,1,0};
  134.  
  135.     glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
  136.     glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,lightPos2);
  137.     glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,10);
  138.     glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,128);
  139.     float test[]={0.1,0.1,0.1,0.1};
  140.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT,test),
  141.  
  142.  
  143.     glLoadMatrixf(value_ptr(V*M));
  144.  
  145.     //glColor3d(0,1,0);
  146.     //Models::cube.drawSolid();
  147.     glBindTexture(GL_TEXTURE_2D,tex);
  148.     Models::detailedCube.drawSolid();
  149.     // glEnableClientState( GL_VERTEX_ARRAY );
  150.      //glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  151.     //glEnableClientState( GL_NORMAL_ARRAY );
  152.     //glEnableClientState( GL_COLOR_ARRAY );
  153.     //glVertexPointer( 3, GL_FLOAT, 0, myCubeVertices);
  154.     //glTexCoordPointer( 2, GL_FLOAT, 0, myCubeTexColors);
  155.     //glNormalPointer( GL_FLOAT, 0, myCubeVertices);
  156.     glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambientemmisio);
  157.     glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,ambientemmisio);
  158.     glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular);
  159.     glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,difussion);
  160.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50 );
  161.  
  162.     //glColorPointer( 3, GL_FLOAT, 0, myCubeColors);
  163.     //glDrawArrays(GL_QUADS,0, myCubeVertexCount);
  164.     //glDisableClientState( GL_VERTEX_ARRAY );
  165.     //glDisableClientState( GL_COLOR_ARRAY );
  166.     //glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  167.     //glDisableClientState( GL_NORMAL_ARRAY );
  168.  
  169.     glfwSwapBuffers(window); //Przerzuć tylny bufor na przedni
  170. }
  171.  
  172. int main(void)
  173. {
  174.         GLFWwindow* window; //Wskaźnik na obiekt reprezentujący okno
  175.  
  176.         glfwSetErrorCallback(error_callback);//Zarejestruj procedurę obsługi błędów
  177.  
  178.         if (!glfwInit()) { //Zainicjuj bibliotekę GLFW
  179.                 fprintf(stderr, "Nie można zainicjować GLFW.\n");
  180.                 exit(EXIT_FAILURE);
  181.         }
  182.  
  183.         window = glfwCreateWindow(500, 500, "OpenGL", NULL, NULL);  //Utwórz okno 500x500 o tytule "OpenGL" i kontekst OpenGL.
  184.  
  185.         if (!window) //Jeżeli okna nie udało się utworzyć, to zamknij program
  186.         {
  187.                 glfwTerminate();
  188.                 exit(EXIT_FAILURE);
  189.         }
  190.  
  191.         glfwMakeContextCurrent(window); //Od tego momentu kontekst okna staje się aktywny i polecenia OpenGL będą dotyczyć właśnie jego.
  192.         glfwSwapInterval(1); //Czekaj na 1 powrót plamki przed pokazaniem ukrytego bufora
  193.  
  194.         GLenum err;
  195.         if ((err=glewInit()) != GLEW_OK) { //Zainicjuj bibliotekę GLEW
  196.                 fprintf(stderr, "Nie można zainicjować GLEW: %s\n", glewGetErrorString(err));
  197.                 exit(EXIT_FAILURE);
  198.         }
  199.  
  200.         initOpenGLProgram(window); //Operacje inicjujące
  201.  
  202.  
  203.         float angle_x=0.0f; //Aktualny kąt obrotu obiektu wokół osi x
  204.         float angle_y=0.0f; //Aktualny kąt obrotu obiektu wokół osi y
  205.         glfwSetTime(0); //Wyzeruj timer
  206.  
  207.         //Główna pętla
  208.         while (!glfwWindowShouldClose(window)) //Tak długo jak okno nie powinno zostać zamknięte
  209.         {
  210.             angle_x+=speed_x*glfwGetTime(); //Oblicz przyrost kąta obrotu i zwiększ aktualny kąt
  211.         angle_y+=speed_y*glfwGetTime(); //Oblicz przyrost kąta obrotu i zwiększ aktualny kąt
  212.             glfwSetTime(0); //Wyzeruj timer
  213.                 drawScene(window,angle_x,angle_y); //Wykonaj procedurę rysującą
  214.                 glfwPollEvents(); //Wykonaj procedury callback w zalezności od zdarzeń jakie zaszły.
  215.         }
  216.         //Usunięcie tekstury z pamięci karty graficznej – po głownej pętli
  217.     glDeleteTextures(1,&tex);
  218.  
  219.         glfwDestroyWindow(window); //Usuń kontekst OpenGL i okno
  220.         glfwTerminate(); //Zwolnij zasoby zajęte przez GLFW
  221.         exit(EXIT_SUCCESS);
  222. }
  223.