Advertisement
Guest User

Untitled

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