Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 31.30 KB | None | 0 0
  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 GLM_FORCE_SWIZZLE
  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 "constants.h"
  31. #include "allmodels.h"
  32. #include "lodepng.h"
  33. #include "shaderprogram.h"
  34. #include <time.h>
  35.  
  36. using namespace glm;
  37.  
  38.  
  39. GLuint tex1;
  40.  
  41. GLuint diffTex; //Zmienna reprezentujaca teksturę
  42. GLuint diffTex2; //Zmienna reprezentujaca teksturę
  43.  
  44. GLuint normalTex; //Zmienna reprezentujaca teksturę
  45. GLuint normalTex2;
  46. GLuint heightTex; //Zmienna reprezentująca teksture
  47. GLuint heightTex2;
  48.  
  49. float speed_x = 0; // [radiany/s]
  50. float speed_y = 0; // [radiany/s]
  51. float speed = 3.14;
  52. float speed_wah=500;
  53. float speed_d=0;
  54.  
  55. vec3 pozycja=vec3(0.0f, 0.0f, -11.0f);
  56. float obrot=PI/2;
  57.  
  58.  
  59. time_t seconds;
  60.  
  61.  
  62.  
  63. Models::Torus tor1(1.5,0.5,25,25);
  64. Models::Torus tor2(1.5,0.5,25,25);
  65. Models::Cube cube1;
  66. Models::Torus torus1;
  67. Models::Torus tor3(0.1,2.0,25,25);
  68. Models::Torus torusik(0.05,0.1,25,25);
  69. Models::Torus torusik2(1.0,0.3,35,35);
  70. Models::Torus kolo1(0.3, 0.1, 20, 20);
  71.  
  72. float aspect=1; //Stosunek szerokości do wysokości okna
  73.  
  74. //Uchwyty na shadery
  75. ShaderProgram *shaderProgram; //Wskaźnik na obiekt reprezentujący program cieniujący.
  76.  
  77.  
  78. //Kostka
  79.  
  80. float* vertices_cube=Models::CubeInternal::vertices;
  81. float* normals_cube=Models::CubeInternal::normals;
  82. float* texCoords_cube=Models::CubeInternal::texCoords;
  83. float* c1=Models::CubeInternal::c1;
  84. float* c2=Models::CubeInternal::c2;
  85. float* c3=Models::CubeInternal::c3;
  86. int vertexCount=Models::CubeInternal::vertexCount;
  87.  
  88. /*
  89.  
  90. float* vertices_cube=Models::TorusInternal::vertices;
  91. float* normals_cube=Models::TorusInternal::normals;
  92. float* texCoords_cube=Models::TorusInternal::texCoords;
  93. float* c1=Models::TorusInternal::c1;
  94. float* c2=Models::TorusInternal::c2;
  95. float* c3=Models::TorusInternal::c3;
  96. int vertexCount=Models::TorusInternal::vertexCount;
  97. */
  98.  
  99. //Czajnik
  100. /*float* vertices=Models::TeapotInternal::vertices;
  101. float* normals=Models::TeapotInternal::vertexNormals;
  102. float* texCoords=Models::TeapotInternal::texCoords;
  103. float* c1=Models::TeapotInternal::c1;
  104. float* c2=Models::TeapotInternal::c2;
  105. float* c3=Models::TeapotInternal::c3;
  106. int vertexCount=Models::TeapotInternal::vertexCount;
  107. */
  108.  
  109. vec3 kierunek(float obr,float speed) {
  110. return speed*vec3(cos(obrot),0,sin(obrot));
  111. }
  112.  
  113.  
  114.  
  115. //Procedura obsługi błędów
  116. void error_callback(int error, const char* description) {
  117. fputs(description, stderr);
  118. }
  119.  
  120. //Procedura obsługi klawiatury
  121. void key_callback(GLFWwindow* window, int key,
  122. int scancode, int action, int mods) {
  123. if (action == GLFW_PRESS) {
  124. if (key == GLFW_KEY_LEFT) speed_y = -3.14;
  125. if (key == GLFW_KEY_RIGHT) speed_y = 3.14;
  126. if (key == GLFW_KEY_UP) speed_x = -3.14;
  127. if (key == GLFW_KEY_DOWN) speed_x = 3.14;
  128. if (key==GLFW_KEY_W) pozycja=pozycja+kierunek(obrot,0.2);
  129. if (key==GLFW_KEY_S) pozycja=pozycja-kierunek(obrot,0.2);
  130. if (key==GLFW_KEY_A) pozycja=pozycja-PI/36;
  131. if (key==GLFW_KEY_D) pozycja=pozycja+PI/36;
  132. if (key==GLFW_KEY_G&&speed_d<=PI/2)
  133. speed_d=speed_d+PI/36;
  134. if (key==GLFW_KEY_F&&speed_d>0)
  135. speed_d=speed_d-PI/36;
  136. }
  137.  
  138.  
  139. if (action == GLFW_RELEASE) {
  140. if (key == GLFW_KEY_LEFT) speed_y = 0;
  141. if (key == GLFW_KEY_RIGHT) speed_y = 0;
  142. if (key == GLFW_KEY_UP) speed_x = 0;
  143. if (key == GLFW_KEY_DOWN) speed_x = 0;
  144. }
  145. }
  146.  
  147. //Procedura obługi zmiany rozmiaru bufora ramki
  148. void windowResize(GLFWwindow* window, int width, int height) {
  149. glViewport(0, 0, width, height); //Obraz ma być generowany w oknie o tej rozdzielczości
  150. if (height!=0) {
  151. aspect=(float)width/(float)height; //Stosunek szerokości do wysokości okna
  152. } else {
  153. aspect=1;
  154. }
  155. }
  156.  
  157.  
  158. GLuint readTexture(char* filename) {
  159. GLuint tex;
  160. glActiveTexture(GL_TEXTURE0);
  161.  
  162. //Wczytanie do pamięci komputera
  163. std::vector<unsigned char> image; //Alokuj wektor do wczytania obrazka
  164. unsigned width, height; //Zmienne do których wczytamy wymiary obrazka
  165. //Wczytaj obrazek
  166. unsigned error = lodepng::decode(image, width, height, filename);
  167.  
  168. //Import do pamięci karty graficznej
  169. glGenTextures(1,&tex); //Zainicjuj jeden uchwyt
  170. glBindTexture(GL_TEXTURE_2D, tex); //Uaktywnij uchwyt
  171. //Wczytaj obrazek do pamięci KG skojarzonej z uchwytem
  172. glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0,
  173. GL_RGBA, GL_UNSIGNED_BYTE, (unsigned char*) image.data());
  174.  
  175. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  176. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  177.  
  178. return tex;
  179. }
  180.  
  181. //Procedura inicjująca
  182. void initOpenGLProgram(GLFWwindow* window) {
  183. //************Tutaj umieszczaj kod, który należy wykonać raz, na początku programu************
  184. glClearColor(0, 0, 0, 1); //Czyść ekran na czarno
  185. glEnable(GL_DEPTH_TEST); //Włącz używanie Z-Bufora
  186. glfwSetKeyCallback(window, key_callback); //Zarejestruj procedurę obsługi klawiatury
  187. glfwSetFramebufferSizeCallback(window,windowResize); //Zarejestruj procedurę obsługi zmiany rozmiaru bufora ramki
  188.  
  189. shaderProgram=new ShaderProgram("vshader.glsl",NULL,"fshader.glsl"); //Wczytaj program cieniujący
  190.  
  191. //diffTex=readTexture("bricks2_diffuse.png");
  192. //normalTex=readTexture("bricks2_normal.png");
  193. //heightTex=readTexture("bricks2_height.png");
  194. tex1=readTexture("face4.png");
  195.  
  196. diffTex=readTexture("kora_albedo.png");
  197. diffTex2=readTexture("kora2_albedo.png");
  198. normalTex=readTexture("kora_normal.png");
  199. normalTex2=readTexture("metal_normal.png");
  200. heightTex=readTexture("kora_height.png");
  201. heightTex2=readTexture("metal2_height.png");
  202. }
  203.  
  204. //Zwolnienie zasobów zajętych przez program
  205. void freeOpenGLProgram() {
  206. delete shaderProgram; //Usunięcie programu cieniującego
  207.  
  208. glDeleteTextures(1,&diffTex);
  209. glDeleteTextures(1,&normalTex);
  210. glDeleteTextures(1,&heightTex);
  211.  
  212. }
  213.  
  214. void drawKjub(ShaderProgram *shaderProgram, mat4 mP, mat4 mV, mat4 mM) {
  215. //Włączenie programu cieniującego, który ma zostać użyty do rysowania
  216. //W tym programie wystarczyłoby wywołać to raz, w setupShaders, ale chodzi o pokazanie,
  217. //że mozna zmieniać program cieniujący podczas rysowania jednej sceny
  218. shaderProgram->use();
  219.  
  220. //Przekaż do shadera macierze P,V i M.
  221. //W linijkach poniżej, polecenie:
  222. // shaderProgram->getUniformLocation("P")
  223. //pobiera numer przypisany zmiennej jednorodnej o podanej nazwie
  224. //UWAGA! "P" w powyższym poleceniu odpowiada deklaracji "uniform mat4 P;" w vertex shaderze,
  225. //a mP w glm::value_ptr(mP) odpowiada argumentowi "mat4 mP;" TYM pliku.
  226. //Cała poniższa linijka przekazuje do zmiennej jednorodnej P w vertex shaderze dane z argumentu mP niniejszej funkcji
  227. //Pozostałe polecenia działają podobnie.
  228. //Poniższe polecenia są z grubsza odpowiednikami glLoadMatrixf ze starego opengla
  229. glUniformMatrix4fv(shaderProgram->getUniformLocation("P"),1, false, glm::value_ptr(mP));
  230. glUniformMatrix4fv(shaderProgram->getUniformLocation("V"),1, false, glm::value_ptr(mV));
  231. glUniformMatrix4fv(shaderProgram->getUniformLocation("M"),1, false, glm::value_ptr(mM));
  232.  
  233.  
  234.  
  235. glUniform4f(shaderProgram->getUniformLocation("light1"), 0, 0, -8, 1);
  236. glUniform4f(shaderProgram->getUniformLocation("light2"), 0, 40, 0, 1);
  237.  
  238.  
  239. //Powiąż zmienne typu sampler2D z jednostkami teksturującymi
  240. glUniform1i(shaderProgram->getUniformLocation("diffuseMap"),0);
  241. glUniform1i(shaderProgram->getUniformLocation("normalMap"),1);
  242. glUniform1i(shaderProgram->getUniformLocation("heightMap"),2);
  243.  
  244. //Przypisz tekstury do jednostek teksturujących
  245. glActiveTexture(GL_TEXTURE0);
  246. glBindTexture(GL_TEXTURE_2D,diffTex);
  247. glActiveTexture(GL_TEXTURE1);
  248. glBindTexture(GL_TEXTURE_2D,normalTex);
  249. glActiveTexture(GL_TEXTURE2);
  250. glBindTexture(GL_TEXTURE_2D,heightTex);
  251.  
  252. //Powiedz OpenGL że podczas rysowania nalezy przesłać dane do atrybutów o numerach wskazanych jako argument.
  253. //Polecenie shaderProgram->getAttribLocation("vertex") zwraca numer atrybutu o nazwie "vertex".
  254. //Odpowiada to deklaracji "in vec4 vertex;" w vertex shaderze.
  255. //Z grubsza odpowiednik polecenia glEnableClientState
  256. glEnableVertexAttribArray(shaderProgram->getAttribLocation("vertex"));
  257. glEnableVertexAttribArray(shaderProgram->getAttribLocation("normal"));
  258. glEnableVertexAttribArray(shaderProgram->getAttribLocation("texCoord0"));
  259. glEnableVertexAttribArray(shaderProgram->getAttribLocation("c1"));
  260. glEnableVertexAttribArray(shaderProgram->getAttribLocation("c2"));
  261. glEnableVertexAttribArray(shaderProgram->getAttribLocation("c3"));
  262.  
  263. //Wskaż tablicę z której należy pobrać dane do atrybutu o konkretnym numerze.
  264. //Pierwszym argumentem jest numer przypisany atrybutowi, ostatnim tablica zdanymi.
  265. //Z grubsza są to odpowiedniki poleceń glVertexPointer,glColorPointer i glNormalPointer ze starego OpenGL
  266. glVertexAttribPointer(shaderProgram->getAttribLocation("vertex"),4,GL_FLOAT,false,0,vertices_cube);
  267. glVertexAttribPointer(shaderProgram->getAttribLocation("normal"),4,GL_FLOAT,false,0,normals_cube);
  268. glVertexAttribPointer(shaderProgram->getAttribLocation("texCoord0"),2,GL_FLOAT,false,0,texCoords_cube);
  269. glVertexAttribPointer(shaderProgram->getAttribLocation("c1"),4,GL_FLOAT,false,0,c1);
  270. glVertexAttribPointer(shaderProgram->getAttribLocation("c2"),4,GL_FLOAT,false,0,c2);
  271. glVertexAttribPointer(shaderProgram->getAttribLocation("c3"),4,GL_FLOAT,false,0,c3);
  272.  
  273. //Narysowanie obiektu
  274. glDrawArrays(GL_TRIANGLES,0,vertexCount);
  275.  
  276. //Posprzątanie po sobie
  277. //Odpowiednik sekwencji poleceń glDisableClientState
  278. glDisableVertexAttribArray(shaderProgram->getAttribLocation("vertex"));
  279. glDisableVertexAttribArray(shaderProgram->getAttribLocation("color"));
  280. glDisableVertexAttribArray(shaderProgram->getAttribLocation("normal"));
  281. glDisableVertexAttribArray(shaderProgram->getAttribLocation("texCoord0"));
  282. glDisableVertexAttribArray(shaderProgram->getAttribLocation("c1"));
  283. glDisableVertexAttribArray(shaderProgram->getAttribLocation("c2"));
  284. glDisableVertexAttribArray(shaderProgram->getAttribLocation("c3"));
  285. }
  286.  
  287.  
  288. void drawKjub2(ShaderProgram *shaderProgram, mat4 mP, mat4 mV, mat4 mM) {
  289. //Włączenie programu cieniującego, który ma zostać użyty do rysowania
  290. //W tym programie wystarczyłoby wywołać to raz, w setupShaders, ale chodzi o pokazanie,
  291. //że mozna zmieniać program cieniujący podczas rysowania jednej sceny
  292. shaderProgram->use();
  293.  
  294. //Przekaż do shadera macierze P,V i M.
  295. //W linijkach poniżej, polecenie:
  296. // shaderProgram->getUniformLocation("P")
  297. //pobiera numer przypisany zmiennej jednorodnej o podanej nazwie
  298. //UWAGA! "P" w powyższym poleceniu odpowiada deklaracji "uniform mat4 P;" w vertex shaderze,
  299. //a mP w glm::value_ptr(mP) odpowiada argumentowi "mat4 mP;" TYM pliku.
  300. //Cała poniższa linijka przekazuje do zmiennej jednorodnej P w vertex shaderze dane z argumentu mP niniejszej funkcji
  301. //Pozostałe polecenia działają podobnie.
  302. //Poniższe polecenia są z grubsza odpowiednikami glLoadMatrixf ze starego opengla
  303. glUniformMatrix4fv(shaderProgram->getUniformLocation("P"),1, false, glm::value_ptr(mP));
  304. glUniformMatrix4fv(shaderProgram->getUniformLocation("V"),1, false, glm::value_ptr(mV));
  305. glUniformMatrix4fv(shaderProgram->getUniformLocation("M"),1, false, glm::value_ptr(mM));
  306.  
  307.  
  308. glUniform4f(shaderProgram->getUniformLocation("light1"), 0, 0, -8, 1);
  309. glUniform4f(shaderProgram->getUniformLocation("light2"), 0, 40, 0, 1);
  310.  
  311. //Powiąż zmienne typu sampler2D z jednostkami teksturującymi
  312. glUniform1i(shaderProgram->getUniformLocation("diffuseMap"),0);
  313. //glUniform1i(shaderProgram->getUniformLocation("normalMap"),1);
  314. //glUniform1i(shaderProgram->getUniformLocation("heightMap"),2);
  315.  
  316. //Przypisz tekstury do jednostek teksturujących
  317. glActiveTexture(GL_TEXTURE0);
  318. glBindTexture(GL_TEXTURE_2D,diffTex2);
  319. //glActiveTexture(GL_TEXTURE1);
  320. // glBindTexture(GL_TEXTURE_2D,normalTex2);
  321. //glActiveTexture(GL_TEXTURE2);
  322. //glBindTexture(GL_TEXTURE_2D,heightTex2);
  323.  
  324. //Powiedz OpenGL że podczas rysowania nalezy przesłać dane do atrybutów o numerach wskazanych jako argument.
  325. //Polecenie shaderProgram->getAttribLocation("vertex") zwraca numer atrybutu o nazwie "vertex".
  326. //Odpowiada to deklaracji "in vec4 vertex;" w vertex shaderze.
  327. //Z grubsza odpowiednik polecenia glEnableClientState
  328. glEnableVertexAttribArray(shaderProgram->getAttribLocation("vertex"));
  329. glEnableVertexAttribArray(shaderProgram->getAttribLocation("normal"));
  330. glEnableVertexAttribArray(shaderProgram->getAttribLocation("texCoord0"));
  331. glEnableVertexAttribArray(shaderProgram->getAttribLocation("c1"));
  332. glEnableVertexAttribArray(shaderProgram->getAttribLocation("c2"));
  333. glEnableVertexAttribArray(shaderProgram->getAttribLocation("c3"));
  334.  
  335. //Wskaż tablicę z której należy pobrać dane do atrybutu o konkretnym numerze.
  336. //Pierwszym argumentem jest numer przypisany atrybutowi, ostatnim tablica zdanymi.
  337. //Z grubsza są to odpowiedniki poleceń glVertexPointer,glColorPointer i glNormalPointer ze starego OpenGL
  338. glVertexAttribPointer(shaderProgram->getAttribLocation("vertex"),4,GL_FLOAT,false,0,vertices_cube);
  339. glVertexAttribPointer(shaderProgram->getAttribLocation("normal"),4,GL_FLOAT,false,0,normals_cube);
  340. glVertexAttribPointer(shaderProgram->getAttribLocation("texCoord0"),2,GL_FLOAT,false,0,texCoords_cube);
  341. glVertexAttribPointer(shaderProgram->getAttribLocation("c1"),4,GL_FLOAT,false,0,c1);
  342. glVertexAttribPointer(shaderProgram->getAttribLocation("c2"),4,GL_FLOAT,false,0,c2);
  343. glVertexAttribPointer(shaderProgram->getAttribLocation("c3"),4,GL_FLOAT,false,0,c3);
  344.  
  345. //Narysowanie obiektu
  346. glDrawArrays(GL_TRIANGLES,0,vertexCount);
  347.  
  348. //Posprzątanie po sobie
  349. //Odpowiednik sekwencji poleceń glDisableClientState
  350. glDisableVertexAttribArray(shaderProgram->getAttribLocation("vertex"));
  351. glDisableVertexAttribArray(shaderProgram->getAttribLocation("color"));
  352. glDisableVertexAttribArray(shaderProgram->getAttribLocation("normal"));
  353. glDisableVertexAttribArray(shaderProgram->getAttribLocation("texCoord0"));
  354. glDisableVertexAttribArray(shaderProgram->getAttribLocation("c1"));
  355. glDisableVertexAttribArray(shaderProgram->getAttribLocation("c2"));
  356. glDisableVertexAttribArray(shaderProgram->getAttribLocation("c3"));
  357. }
  358.  
  359.  
  360. void drawKjub3(ShaderProgram *shaderProgram, mat4 mP, mat4 mV, mat4 mM) {
  361. //Włączenie programu cieniującego, który ma zostać użyty do rysowania
  362. //W tym programie wystarczyłoby wywołać to raz, w setupShaders, ale chodzi o pokazanie,
  363. //że mozna zmieniać program cieniujący podczas rysowania jednej sceny
  364. shaderProgram->use();
  365.  
  366. //Przekaż do shadera macierze P,V i M.
  367. //W linijkach poniżej, polecenie:
  368. // shaderProgram->getUniformLocation("P")
  369. //pobiera numer przypisany zmiennej jednorodnej o podanej nazwie
  370. //UWAGA! "P" w powyższym poleceniu odpowiada deklaracji "uniform mat4 P;" w vertex shaderze,
  371. //a mP w glm::value_ptr(mP) odpowiada argumentowi "mat4 mP;" TYM pliku.
  372. //Cała poniższa linijka przekazuje do zmiennej jednorodnej P w vertex shaderze dane z argumentu mP niniejszej funkcji
  373. //Pozostałe polecenia działają podobnie.
  374. //Poniższe polecenia są z grubsza odpowiednikami glLoadMatrixf ze starego opengla
  375. glUniformMatrix4fv(shaderProgram->getUniformLocation("P"),1, false, glm::value_ptr(mP));
  376. glUniformMatrix4fv(shaderProgram->getUniformLocation("V"),1, false, glm::value_ptr(mV));
  377. glUniformMatrix4fv(shaderProgram->getUniformLocation("M"),1, false, glm::value_ptr(mM));
  378.  
  379.  
  380.  
  381. glUniform4f(shaderProgram->getUniformLocation("light1"), 0, 0, -8, 1);
  382. glUniform4f(shaderProgram->getUniformLocation("light2"), 0, 40, 0, 1);
  383.  
  384.  
  385. //Powiąż zmienne typu sampler2D z jednostkami teksturującymi
  386. glUniform1i(shaderProgram->getUniformLocation("diffuseMap"),0);
  387. glUniform1i(shaderProgram->getUniformLocation("normalMap"),1);
  388. glUniform1i(shaderProgram->getUniformLocation("heightMap"),2);
  389.  
  390. //Przypisz tekstury do jednostek teksturujących
  391. glActiveTexture(GL_TEXTURE0);
  392. glBindTexture(GL_TEXTURE_2D,tex1);
  393. glActiveTexture(GL_TEXTURE1);
  394. glBindTexture(GL_TEXTURE_2D,tex1);
  395. glActiveTexture(GL_TEXTURE2);
  396. glBindTexture(GL_TEXTURE_2D,tex1);
  397.  
  398. //Powiedz OpenGL że podczas rysowania nalezy przesłać dane do atrybutów o numerach wskazanych jako argument.
  399. //Polecenie shaderProgram->getAttribLocation("vertex") zwraca numer atrybutu o nazwie "vertex".
  400. //Odpowiada to deklaracji "in vec4 vertex;" w vertex shaderze.
  401. //Z grubsza odpowiednik polecenia glEnableClientState
  402. glEnableVertexAttribArray(shaderProgram->getAttribLocation("vertex"));
  403. glEnableVertexAttribArray(shaderProgram->getAttribLocation("normal"));
  404. glEnableVertexAttribArray(shaderProgram->getAttribLocation("texCoord0"));
  405. glEnableVertexAttribArray(shaderProgram->getAttribLocation("c1"));
  406. glEnableVertexAttribArray(shaderProgram->getAttribLocation("c2"));
  407. glEnableVertexAttribArray(shaderProgram->getAttribLocation("c3"));
  408.  
  409. //Wskaż tablicę z której należy pobrać dane do atrybutu o konkretnym numerze.
  410. //Pierwszym argumentem jest numer przypisany atrybutowi, ostatnim tablica zdanymi.
  411. //Z grubsza są to odpowiedniki poleceń glVertexPointer,glColorPointer i glNormalPointer ze starego OpenGL
  412. glVertexAttribPointer(shaderProgram->getAttribLocation("vertex"),4,GL_FLOAT,false,0,vertices_cube);
  413. glVertexAttribPointer(shaderProgram->getAttribLocation("normal"),4,GL_FLOAT,false,0,normals_cube);
  414. glVertexAttribPointer(shaderProgram->getAttribLocation("texCoord0"),2,GL_FLOAT,false,0,texCoords_cube);
  415. glVertexAttribPointer(shaderProgram->getAttribLocation("c1"),4,GL_FLOAT,false,0,c1);
  416. glVertexAttribPointer(shaderProgram->getAttribLocation("c2"),4,GL_FLOAT,false,0,c2);
  417. glVertexAttribPointer(shaderProgram->getAttribLocation("c3"),4,GL_FLOAT,false,0,c3);
  418.  
  419. //Narysowanie obiektu
  420. glDrawArrays(GL_TRIANGLES,0,vertexCount);
  421.  
  422. //Posprzątanie po sobie
  423. //Odpowiednik sekwencji poleceń glDisableClientState
  424. glDisableVertexAttribArray(shaderProgram->getAttribLocation("vertex"));
  425. glDisableVertexAttribArray(shaderProgram->getAttribLocation("color"));
  426. glDisableVertexAttribArray(shaderProgram->getAttribLocation("normal"));
  427. glDisableVertexAttribArray(shaderProgram->getAttribLocation("texCoord0"));
  428. glDisableVertexAttribArray(shaderProgram->getAttribLocation("c1"));
  429. glDisableVertexAttribArray(shaderProgram->getAttribLocation("c2"));
  430. glDisableVertexAttribArray(shaderProgram->getAttribLocation("c3"));
  431. }
  432.  
  433.  
  434.  
  435.  
  436. void rysuj_torusiki(mat4 V, mat4 M, float angle)
  437. {
  438.  
  439. // mat4 M=mat4(1.0f);
  440.  
  441.  
  442. mat4 M1=translate(M,vec3(2.1f,0,0));
  443. M1=rotate(M1,angle,vec3(0.0f,0.0f,1.0f));
  444. glLoadMatrixf(value_ptr(V*M1));
  445. tor1.drawSolid();
  446.  
  447.  
  448. mat4 M2=translate(M,vec3(-1.1f,0,0));
  449. M2=rotate(M2,-angle,vec3(0.0f,0.0f,1.0f));
  450. M2=scale(M2,vec3(0.7f,0.7f,0.7f));
  451. glLoadMatrixf(value_ptr(V*M2));
  452. tor2.drawSolid();
  453.  
  454. for(int k=0;k< 360;k+=20){
  455.  
  456. float kat=((PI*k)/180)+2;
  457. mat4 K = rotate(M1,kat,vec3(0.0f,0.0f,1.0f));
  458. K = translate(K,vec3(2.1f,0,0));
  459. K=scale(K,vec3(0.1f,0.1f,0.1f));
  460. glLoadMatrixf(value_ptr(V*K));
  461. cube1.drawSolid();
  462.  
  463. }
  464.  
  465.  
  466. for(int k=7;k< 360;k+=20){
  467.  
  468. float kat=((PI*k)/180)+2;
  469. mat4 K = rotate(M2,-kat,vec3(0.0f,0.0f,1.0f));
  470. K = translate(K,vec3(2.1f,0,0));
  471. K=scale(K,vec3(0.1f,0.1f,0.1f));
  472. glLoadMatrixf(value_ptr(V*K));
  473. cube1.drawSolid();
  474.  
  475. }
  476.  
  477. }
  478.  
  479. void rysuj_torus(mat4 V, mat4 M,float angle)
  480. {
  481. mat4 Mtorus=M;
  482. Mtorus=scale(Mtorus,vec3(1.5f,1.5f,1.5f));
  483. glLoadMatrixf(value_ptr(V*Mtorus));
  484. Models::torus.drawSolid();
  485. /*
  486. mat4 Mz = M;
  487. //Mz = translate(Mz, vec3(0.0f, 0.0f, 0.0f));
  488. //Mz = scale(Mz, vec3(wys/2.0f,szer/2.0f,gleb/2.0f));
  489. glLoadMatrixf(value_ptr(V*Mz));
  490. Models::torus.drawSolid();
  491. */
  492.  
  493.  
  494. }
  495.  
  496.  
  497. void draw_torus(mat4 V, mat4 M, float a, float b, float c){
  498. mat4 Mt = M;
  499. Mt = scale(Mt, vec3(a/2.0f, b/2.0f,c/2.0f));
  500. glLoadMatrixf(value_ptr(V*Mt));
  501. glColor3d(0.855,0.647,0.126);
  502. kolo1.drawSolid();
  503. }
  504.  
  505.  
  506.  
  507.  
  508. //Procedura rysująca zawartość sceny
  509. void drawScene(GLFWwindow* window, float angle_x, float angle_y, float angle, float angle_zeg, float angle_wah) {
  510. //************Tutaj umieszczaj kod rysujący obraz******************l
  511.  
  512. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //Wykonaj czyszczenie bufora kolorów i głębokości
  513.  
  514. glm::mat4 P = glm::perspective(50 * PI / 180, aspect, 1.0f, 50.0f); //Wylicz macierz rzutowania
  515.  
  516. /*glm::mat4 V = glm::lookAt( //Wylicz macierz widoku
  517. glm::vec3(0.0f, 0.0f, -11.0f),
  518. glm::vec3(0.0f, 0.0f, 0.0f),
  519. glm::vec3(0.0f, 1.0f, 0.0f));
  520. */
  521.  
  522. glm::mat4 V = glm::lookAt( //Wylicz macierz widoku
  523. pozycja,
  524. pozycja+kierunek(obrot,1),
  525. vec3(0.0f,1.0f,0.0f));
  526.  
  527.  
  528.  
  529. //Wylicz macierz modelu rysowanego obiektu
  530. glm::mat4 M = glm::mat4(1.0f);
  531. M = glm::rotate(M, angle_x, glm::vec3(1, 0, 0));
  532. M = glm::rotate(M, angle_y, glm::vec3(0, 1, 0));
  533.  
  534.  
  535. //mat4 M1=M;
  536. //M1=translate(M,vec3(2.1f,0,0));
  537. //M1=rotate(M1,angle,vec3(0.0f,0.0f,1.0f));
  538. //glLoadMatrixf(value_ptr(V*M1));
  539. //tor1.drawSolid();
  540.  
  541. //mat4 Mws1=M;
  542. // glLoadMatrixf(value_ptr(V*Mws1));
  543. //Models::cube.drawSolid();
  544.  
  545.  
  546.  
  547.  
  548. //drawKjub2(shaderProgram,P,V,M);
  549.  
  550.  
  551.  
  552. //Narysuj obiekt
  553.  
  554. //////////////głowa zegara//////////////
  555. drawKjub(shaderProgram,P,V,M);
  556.  
  557.  
  558.  
  559.  
  560. //////////////prawa scianka//////////////
  561. mat4 Mp1=M;
  562. //M1=scale(M1,vec3(5.0f,5.0f,5.0f));
  563. Mp1=scale(Mp1, vec3(-0.1f, 1.5f, 1.0f));
  564. //M1 = glm::rotate(M, (angle/4), glm::vec3(0, 1, 0));
  565. Mp1=translate(Mp1,vec3(9.0f,-1.65f,0.0f));
  566. //M1=scale(M,vec3(1.0f,1.0f,0.5f));
  567. drawKjub(shaderProgram, P, V, Mp1);
  568.  
  569.  
  570.  
  571. //////////////lewa scianka//////////////
  572. mat4 Mp2=M;
  573. //M1=scale(M1,vec3(5.0f,5.0f,5.0f));
  574. Mp2=scale(Mp2, vec3(-0.1f, 1.5f, 1.0f));
  575. //M1 = glm::rotate(M, (angle/4), glm::vec3(0, 1, 0));
  576. Mp2=translate(Mp2,vec3(-9.0f,-1.65f,0.0f));
  577. //M1=scale(M,vec3(1.0f,1.0f,0.5f));
  578. drawKjub(shaderProgram, P, V, Mp2);
  579.  
  580.  
  581.  
  582. //////////////drzwi//////////////
  583. //mat4 Md1=M;
  584. /* mat4 M11=M;
  585. M11=translate(M11,vec3(0.0f,0.0f,-2.0f));
  586. mat4 Md1=M11;
  587. //M1=scale(M1,vec3(5.0f,5.0f,5.0f));
  588. Md1=scale(Md1, vec3(-0.1f, 1.5f, 1.0f));
  589. //M1 = glm::rotate(M, (angle/4), glm::vec3(0, 1, 0));
  590. Md1=translate(Md1,vec3(-9.0f,-1.65f,0.0f));
  591. //M1=scale(M,vec3(1.0f,1.0f,0.5f));
  592. drawKjub(shaderProgram, P, V, Md1); */
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601. //////////////tylnia scianka//////////////
  602. mat4 Mp3=M;
  603. //M1=scale(M1,vec3(5.0f,5.0f,5.0f));
  604. Mp3=scale(Mp3, vec3(1.0f, 1.5f, -0.1f));
  605. //M1 = glm::rotate(M, (angle/4), glm::vec3(0, 1, 0));
  606. Mp3=translate(Mp3,vec3(0.0f,-1.65f,-9.0f));
  607. //M1=scale(M,vec3(1.0f,1.0f,0.5f));
  608. drawKjub(shaderProgram, P, V, Mp3);
  609.  
  610.  
  611.  
  612. //////////////drzwi2//////////////
  613.  
  614. //mat4 Mm=M;
  615. // Mm=translate(Mm,vec3(3.5f,0.0f,-0.9));
  616.  
  617. mat4 Mz=M;
  618. //M1=scale(M1,vec3(5.0f,5.0f,5.0f));
  619. //Md=rotate(Md, speed_d, vec3(0.0f, -1.0f, 0.0f));
  620. Mz=scale(Mz, vec3(-0.01f, 1.5f, 0.01f));
  621. //M1 = glm::rotate(M, (angle/4), glm::vec3(0, 1, 0));
  622. Mz=translate(Mz,vec3(-100.0f,-1.65f,-100.0f));
  623. //M1=scale(M,vec3(1.0f,1.0f,0.5f));
  624. drawKjub(shaderProgram, P, V, Mz);
  625.  
  626. mat4 Md=Mz;
  627. //M1=scale(M1,vec3(5.0f,5.0f,5.0f));
  628. //Md=rotate(Mz, speed_d, vec3(0.0f, -1.0f, 0.0f));
  629. Md=rotate(Md, speed_d, vec3(0.0f, 1.0f, 0.0f));
  630. Md=scale(Md, vec3(100.0f, 1.0f, 1.1f));
  631. //M1 = glm::rotate(M, (angle/4), glm::vec3(0, 1, 0));
  632. Md=translate(Md,vec3(1.0f,0.0f,0.0f));
  633. //Md=rotate(Mz, speed_d, vec3(0.0f, -1.0f, 0.0f));
  634. //M1=scale(M,vec3(1.0f,1.0f,0.5f));
  635. drawKjub(shaderProgram, P, V, Md);
  636.  
  637.  
  638.  
  639. //////////////tarcza//////////////
  640.  
  641. //mat4 Mtar=M;
  642. //Mtar=scale(Mtar, vec3(0.5f, 0.3f, 0.4f));
  643. //Mtar=translate(M,vec3(0.0f,-1.65f,5.0f));
  644. //glLoadMatrixf(value_ptr(V*Mtar));
  645. //torusik2.drawSolid();
  646.  
  647.  
  648. mat4 M1=M;
  649. // M1=rotate(M1,angle,vec3(0.0f,0.0f,1.0f));
  650. M1=translate(M1,vec3(0.0f,0.0f,5.0f));
  651. glLoadMatrixf(value_ptr(V*M1));
  652. //draw_torus(V,M1,2.0f,2.0f,2.0f);
  653.  
  654.  
  655.  
  656.  
  657.  
  658. //mat4 M1=translate(M,vec3(2.0f,1.5f,2.0f));
  659. //M1= scale(M1, vec3(0.05f,0.05f,0.05f));
  660. //M1=rotate(M1,angle,vec3(0.0f,0.0f,1.0f));
  661. //glLoadMatrixf(value_ptr(V*M1));
  662. //mat4 Mtor=M;
  663. //Mtor=scale(Mtor, vec3(0.1f, 0.1f, 0.1f));
  664. //torusik2.drawSolid();
  665.  
  666.  
  667.  
  668.  
  669. //////////////male cos na srodku tarczy//////////////
  670.  
  671. mat4 Mcos=M;
  672. //M1=scale(M1,vec3(5.0f,5.0f,5.0f));
  673. Mcos=scale(M, vec3(0.03f, 0.03f, -0.03f));
  674. //M1 = glm::rotate(M, (angle/4), glm::vec3(0, 1, 0));
  675. Mcos=translate(Mcos,vec3(0.0f,0.0f,35.0f));
  676. //M1=scale(M,vec3(1.0f,1.0f,0.5f));
  677. // drawKjub2(shaderProgram, P, V, Mcos);
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687. //////////////wskazowka minuty//////////////
  688.  
  689.  
  690. // mat4 Mwsk1=Mcos;
  691. /*
  692. for(int k=0; k<=360; k=k+6)
  693. {
  694. float kat=((kat*5)/kat);
  695. //float kat = (GLfloat)glfwGetTime()
  696. Mwsk1 = rotate(Mcos, angle, vec3(0.0f,0.0f,1.0f));
  697. Mwsk1=translate(Mwsk1,vec3(0.0f,15.0f,0.0f));
  698. Mwsk1=scale(Mwsk1, vec3(1.0f, 10.0f, 1.0f));
  699. drawKjub2(shaderProgram, P, V, Mwsk1);
  700. } */
  701.  
  702. /*
  703. Mwsk1 = rotate(Mcos, angle_zeg, vec3(0.0f,0.0f,1.0f));
  704. Mwsk1=translate(Mwsk1,vec3(0.0f,15.0f,0.0f));
  705. Mwsk1=scale(Mwsk1, vec3(1.0f, 10.0f, 1.0f));
  706. drawKjub2(shaderProgram, P, V, Mwsk1);
  707. */
  708.  
  709.  
  710.  
  711.  
  712.  
  713. //tarcza zegara z teksturka
  714. mat4 Mcos2=M;
  715. Mcos2=translate(Mcos2, vec3(0.0f,0.0f,-1.0f));
  716. Mcos2=scale(Mcos2,vec3(1.0f,1.0f,0.01));
  717. glLoadMatrixf(value_ptr(V*Mcos2));
  718. drawKjub3(shaderProgram, P, V, Mcos2);
  719.  
  720.  
  721.  
  722.  
  723.  
  724. //wskazówka minutowa
  725. Mcos2=M;
  726. Mcos2=translate(Mcos2, vec3 (-0.0f,1.0f,-0.918f));
  727. Mcos2=rotate(Mcos2,angle_zeg,vec3(0,0,1)); // tutaj zmieniamy kąt wychylenia wahadła
  728.  
  729. mat4 Mniewiem=Mcos2;
  730. Mniewiem=translate(Mniewiem, vec3 (0.0f,0.2f,0.0f));
  731. Mniewiem=scale(Mniewiem, vec3(0.01,0.18,0.01));
  732. glLoadMatrixf(value_ptr(V*Mniewiem));
  733. //drawKjub(shaderProgram, P, V, Mniewiem);
  734.  
  735.  
  736. //////////////wskazowka godziny//////////////
  737.  
  738. mat4 Mwsk2=Mcos;
  739. //M1=scale(M1,vec3(5.0f,5.0f,5.0f));
  740.  
  741. Mwsk2 = rotate(Mcos,angle/144,vec3(0.0f,0.0f,1.0f));
  742. Mwsk2=translate(Mwsk2,vec3(0.0f,15.0f,0.0f));
  743. Mwsk2=scale(Mwsk2, vec3(1.0f, 10.0f, 1.0f));
  744.  
  745. drawKjub2(shaderProgram, P, V, Mwsk2);
  746.  
  747.  
  748. //////////////wskazowka minutowa2//////////////
  749.  
  750.  
  751.  
  752. mat4 Mwsk3=Mcos;
  753. //M1=scale(M1,vec3(5.0f,5.0f,5.0f));
  754.  
  755. Mwsk3 = rotate(Mcos,angle/12,vec3(0.0f,0.0f,1.0f));
  756. Mwsk3=translate(Mwsk3,vec3(0.0f,16.0f,0.0f));
  757. Mwsk3=scale(Mwsk3, vec3(1.0f, 11.0f, 1.0f));
  758.  
  759. drawKjub2(shaderProgram, P, V, Mwsk3);
  760.  
  761.  
  762.  
  763. //////////////wahadlo//////////////
  764.  
  765. mat4 Mwah=Mcos;
  766. //M1=scale(M1,vec3(5.0f,5.0f,5.0f));
  767.  
  768. //Mwsk3 = rotate(Mcos,angle/12,vec3(0.0f,0.0f,1.0f));
  769. Mwah=rotate(Mwah,angle_wah,vec3(0.0f,0.0f,1.0f));
  770. Mwah=translate(Mwah,vec3(0.0f,-58.0f,-20.0f));
  771. Mwah=scale(Mwah, vec3(1.0f, 25.0f, 1.0f));
  772. //Mwah=rotate(Mwah,angle_wah,vec3(0,0,1));
  773.  
  774. drawKjub2(shaderProgram, P, V, Mwah);
  775.  
  776.  
  777.  
  778. mat4 Mtor=M;
  779. Mtor=translate(M,vec3(-0.7f,-1.5f,1.0f));
  780. Mtor=scale(Mtor, vec3(0.15f,0.15f,0.15f));
  781. // rysuj_torusiki(V,Mtor,angle);
  782.  
  783.  
  784. //mój torus_próba
  785. // mat4 M1=translate(M,vec3(2.1f,0,0));
  786. // M1=rotate(M1,angle,vec3(0.0f,0.0f,1.0f));
  787. //glLoadMatrixf(value_ptr(V*M1));
  788. // drawTorus(shaderProgram, P, V, M);
  789.  
  790.  
  791.  
  792. //Przerzuć tylny bufor na przedni
  793. glfwSwapBuffers(window);
  794.  
  795.  
  796. }
  797.  
  798.  
  799.  
  800. int main(void)
  801. {
  802. GLFWwindow* window; //Wskaźnik na obiekt reprezentujący okno
  803.  
  804. glfwSetErrorCallback(error_callback);//Zarejestruj procedurę obsługi błędów
  805.  
  806. if (!glfwInit()) { //Zainicjuj bibliotekę GLFW
  807. fprintf(stderr, "Nie można zainicjować GLFW.\n");
  808. exit(EXIT_FAILURE);
  809. }
  810.  
  811. window = glfwCreateWindow(500, 500, "OpenGL", NULL, NULL); //Utwórz okno 500x500 o tytule "OpenGL" i kontekst OpenGL.
  812.  
  813. if (!window) //Jeżeli okna nie udało się utworzyć, to zamknij program
  814. {
  815. fprintf(stderr, "Nie można utworzyć okna.\n");
  816. glfwTerminate();
  817. exit(EXIT_FAILURE);
  818. }
  819.  
  820. glfwMakeContextCurrent(window); //Od tego momentu kontekst okna staje się aktywny i polecenia OpenGL będą dotyczyć właśnie jego.
  821. glfwSwapInterval(1); //Czekaj na 1 powrót plamki przed pokazaniem ukrytego bufora
  822.  
  823. if (glewInit() != GLEW_OK) { //Zainicjuj bibliotekę GLEW
  824. fprintf(stderr, "Nie można zainicjować GLEW.\n");
  825. exit(EXIT_FAILURE);
  826. }
  827.  
  828. initOpenGLProgram(window); //Operacje inicjujące
  829.  
  830. float angle = 0;
  831. float angle_x = 0; //Kąt obrotu obiektu
  832. float angle_y = 0; //Kąt obrotu obiektu
  833. float angle_zeg=0.0f; //kat do wskazowek
  834. float angle_wah=0.0f;
  835. int lewo=1;
  836. int pom=0.01;
  837.  
  838. glfwSetTime(0); //Wyzeruj licznik czasu
  839.  
  840. //Główna pętla
  841. while (!glfwWindowShouldClose(window)) //Tak długo jak okno nie powinno zostać zamknięte
  842. {
  843. angle += speed*glfwGetTime();
  844. angle_x += speed_x*glfwGetTime(); //Zwiększ kąt o prędkość kątową razy czas jaki upłynął od poprzedniej klatki
  845. angle_y += speed_y*glfwGetTime(); //Zwiększ kąt o prędkość kątową razy czas jaki upłynął od poprzedniej klatki
  846. glfwSetTime(0); //Wyzeruj licznik czasu
  847. pom=pom+0.01;
  848.  
  849.  
  850. //angle_wah+=speed*1000000*glfwGetTime();
  851.  
  852. //angle_wah+=speed*sin(20*glfwGetTime())*((3.14)/4);
  853.  
  854. //angle_wah=(angle_wah)+100*lewo*sin(100*glfwGetTime())*((3.14)/4);
  855. angle_wah+=10000*speed*lewo*glfwGetTime();
  856. if (angle_wah>=0.3)
  857. {lewo=-1;
  858. //angle_wah=(angle_wah)+100*lewo*sin(100*glfwGetTime())*((3.14)/4);
  859. angle_wah+=10000*speed*lewo*glfwGetTime();
  860. }
  861. else if (angle_wah<=-0.3)
  862. {lewo=1;
  863. //angle_wah=(angle_wah)+100*lewo*sin(1000*glfwGetTime())*((3.14)/4);
  864. angle_wah+=10000*speed*lewo*glfwGetTime();
  865. }
  866. //angle_wah=(angle_wah)+lewo*speed_wah*glfwGetTime(); //left decyduje czy prawo czy lewo
  867.  
  868. drawScene(window,angle_x,angle_y,angle,angle_zeg, angle_wah); //Wykonaj procedurę rysującą
  869. glfwPollEvents(); //Wykonaj procedury callback w zalezności od zdarzeń jakie zaszły.
  870. }
  871.  
  872. freeOpenGLProgram();
  873.  
  874. glfwDestroyWindow(window); //Usuń kontekst OpenGL i okno
  875. glfwTerminate(); //Zwolnij zasoby zajęte przez GLFW
  876. exit(EXIT_SUCCESS);
  877. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement