Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.39 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <time.h>
  6. #include "GL\glew.h"
  7. #include "GL\freeglut.h"
  8.  
  9. #include "shaderLoader.h" //narzŕdzie do │adowania i kompilowania shaderˇw z pliku
  10.  
  11.  
  12. //funkcje algebry liniowej
  13. #include "glm/vec3.hpp" // glm::vec3
  14. #include "glm/vec4.hpp" // glm::vec4
  15. #include "glm/mat4x4.hpp" // glm::mat4
  16. #include "glm/gtc/matrix_transform.hpp" // glm::translate, glm::rotate, glm::scale, glm::perspective
  17.  
  18.  
  19. #define PI 3.14159265359
  20. #define SIZE 100000
  21.  
  22. //Wymiary okna
  23. int screen_width = 640;
  24. int screen_height = 480;
  25.  
  26. int i;
  27.  
  28. int pozycjaMyszyX; // na ekranie
  29. int pozycjaMyszyY;
  30. int mbutton; // wcisiety klawisz myszy
  31.  
  32. double kameraX= 10.0;
  33. double kameraZ = 18.0;
  34. double kameraD = -7.0;
  35. double kameraPredkosc;
  36. double kameraKat = 20;
  37. double kameraPredkoscObrotu;
  38. double poprzednie_kameraX;
  39. double poprzednie_kameraZ;
  40. double poprzednie_kameraD;
  41.  
  42. double rotation = 0;
  43.  
  44.  
  45. //macierze
  46. glm::mat4 MV; //modelview - macierz modelu i świata
  47. glm::mat4 P; //projection - macierz projekcji, czyli naszej perspektywy
  48.  
  49.  
  50. float vertices[SIZE];
  51.  
  52.  
  53. //shaders
  54. GLuint programID = 0;
  55.  
  56. unsigned int VBO;
  57.  
  58. /*###############################################################*/
  59. void mysz(int button, int state, int x, int y)
  60. {
  61. mbutton = button;
  62. switch (state)
  63. {
  64. case GLUT_UP:
  65. break;
  66. case GLUT_DOWN:
  67. pozycjaMyszyX = x;
  68. pozycjaMyszyY = y;
  69. poprzednie_kameraX = kameraX;
  70. poprzednie_kameraZ = kameraZ;
  71. poprzednie_kameraD = kameraD;
  72. break;
  73.  
  74. }
  75. }
  76. /*******************************************/
  77. void mysz_ruch(int x, int y)
  78. {
  79. if (mbutton == GLUT_LEFT_BUTTON)
  80. {
  81. kameraX = poprzednie_kameraX - (pozycjaMyszyX - x) * 0.1;
  82. kameraZ = poprzednie_kameraZ - (pozycjaMyszyY - y) * 0.1;
  83. }
  84. if (mbutton == GLUT_RIGHT_BUTTON)
  85. {
  86. kameraD = poprzednie_kameraD + (pozycjaMyszyY - y) * 0.1;
  87. }
  88.  
  89. }
  90. /******************************************/
  91.  
  92. float dx = 0;
  93. float dz = 1.0;
  94.  
  95. void klawisz(GLubyte key, int x, int y)
  96. {
  97. switch (key) {
  98.  
  99. case 27: /* Esc - koniec */
  100. exit(1);
  101. break;
  102.  
  103. case 'x':
  104. dx += 0.1;
  105. break;
  106. case '1':
  107. dz+=0.1;
  108. break;
  109. case '2':
  110. dz-=0.1;
  111. break;
  112. }
  113.  
  114.  
  115. }
  116. /*###############################################################*/
  117. void rysuj(void)
  118. {
  119.  
  120. //GLfloat color[] = { 1.0f, 0.0f, 0.0f, 1.0f };
  121. //glClearBufferfv(GL_COLOR, 0, color);
  122.  
  123. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Kasowanie ekranu
  124.  
  125. glUseProgram(programID); //u┐yj programu, czyli naszego shadera
  126.  
  127. MV = glm::mat4(1.0f); //macierz jednostkowa
  128. MV = glm::translate(MV, glm::vec3(dx, 0, kameraD));
  129. MV = glm::rotate(MV, (float)glm::radians(kameraZ), glm::vec3(1, 0, 0));
  130. MV = glm::rotate(MV, (float)glm::radians(kameraX), glm::vec3(0, 1, 0));
  131.  
  132. glm::mat4 MVP = P * MV;
  133.  
  134. /*Zmienne jednorodne (ang. uniform variable), zwane także zmiennym globalnymi,sązmiennymi,
  135. których wartośc jest stała w obrębie obiektu programu. Shadery mogą zmienne jednorodne tylko odczytywac */
  136.  
  137. GLuint MVP_id = glGetUniformLocation(programID, "MVP"); // pobierz lokalizację zmiennej 'uniform' "MV" w programie
  138. glUniformMatrix4fv(MVP_id, 1, GL_FALSE, &(MVP[0][0])); // wyślij tablicę mv do lokalizacji "MV", która jest typu mat4
  139.  
  140. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  141. glDrawArrays(GL_POINTS, 0, i); // Zaczynamy od 0 i rysujemy wszystkie wierzcho│ki
  142.  
  143. glFlush();
  144. glutSwapBuffers();
  145.  
  146. }
  147. /*###############################################################*/
  148. void rozmiar(int width, int height)
  149. {
  150. screen_width = width;
  151. screen_height = height;
  152.  
  153. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  154. glViewport(0, 0, screen_width, screen_height);
  155.  
  156. P = glm::perspective(glm::radians(60.0f), (GLfloat)screen_width / (GLfloat)screen_height, 1.0f, 1000.0f);
  157.  
  158. glutPostRedisplay(); // Przerysowanie sceny
  159. }
  160.  
  161. /*###############################################################*/
  162. void idle()
  163. {
  164. glutPostRedisplay();
  165. }
  166.  
  167. /*###############################################################*/
  168. GLfloat k = 0.05;
  169. GLfloat ad = 0.0;
  170.  
  171. void timer(int value) {
  172.  
  173. ad+= k;
  174.  
  175. if(ad>1 || ad<0)
  176. k=-k;
  177.  
  178. //GLfloat attrib[] = { ad, 0.0f, 0.0f };
  179. //Aktualizacja wartości atrybutu wejściowego 1.
  180. //glVertexAttrib3fv(0, attrib);
  181.  
  182. /*
  183.  
  184. W vertex_shader np:
  185. layout (location = 1) in vec3 incolor;
  186.  
  187. */
  188. glutTimerFunc(20, timer, 0);
  189. }
  190. /*###############################################################*/
  191. int main(int argc, char **argv)
  192. {
  193. for( float u = 0.0; u <= 2.0; u += 0.02 )
  194. {
  195. for( float v = 0.0; v <= 2.0 * PI; v += 0.02 )
  196. {
  197. vertices[i++] = u*sin(v);
  198. vertices[i++] = exp(-u*u)*(sin(2*PI*u)-u*cos(3*v));
  199. vertices[i++] = u*cos(v);
  200. }
  201. }
  202.  
  203. glutInit(&argc, argv);
  204. glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB | GLUT_DEPTH);
  205. glutInitWindowSize(screen_width, screen_height);
  206. glutInitWindowPosition(0, 0);
  207. glutCreateWindow("Przyklad 3");
  208.  
  209. glewInit(); //init rozszerzeszeń OpenGL z biblioteki GLEW
  210.  
  211. glutDisplayFunc(rysuj); // def. funkcji rysuj¦cej
  212. glutIdleFunc(idle); // def. funkcji rysuj¦cej w czasie wolnym procesoora (w efekcie: ci¦gle wykonywanej)
  213. glutTimerFunc(20, timer, 0);
  214. glutReshapeFunc(rozmiar); // def. obs-ugi zdarzenia resize (GLUT)
  215.  
  216. glutKeyboardFunc(klawisz); // def. obsługi klawiatury
  217. glutMouseFunc(mysz); // def. obsługi zdarzenia przycisku myszy (GLUT)
  218. glutMotionFunc(mysz_ruch); // def. obsługi zdarzenia ruchu myszy (GLUT)
  219.  
  220.  
  221. glEnable(GL_DEPTH_TEST);
  222.  
  223. //glPointSize(3.0f);
  224.  
  225. //tworzenie bufora wierzcholków
  226. glGenBuffers(1, &VBO);
  227. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  228. glBufferData(GL_ARRAY_BUFFER, i*sizeof(float), vertices, GL_STATIC_DRAW);
  229.  
  230. /* úadowanie shadera, tworzenie programu *************************/
  231. /* i linkowanie go oraz sprawdzanie b│ŕdˇw! **********************/
  232. programID = loadShaders("vertex_shader.glsl", "fragment_shader.glsl");
  233.  
  234. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  235. glEnableVertexAttribArray(0); // pierwszy buform atrybuˇw: wierzcho│ki
  236. glVertexAttribPointer(
  237. 0, // atrybut 0. musi odpowiadaŠ atrybutowi w programie shader
  238. 3, // wielkoťŠ (x,y,z)
  239. GL_FLOAT, // typ
  240. GL_FALSE, // czy znormalizowany [0-1]?
  241. 0, // stride
  242. (void*)0 // array buffer offset
  243. );
  244.  
  245. glutMainLoop(); // start
  246.  
  247. glDeleteBuffers(1,&VBO);
  248.  
  249. return(0);
  250. }
  251.  
  252. main.cpp
  253. Wyświetlanie main.cpp.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement