Advertisement
adwas33

Untitled

Apr 12th, 2022
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <GL/glew.h>
  3. #include <SFML/Window.hpp>
  4. #include <SFML/System/Time.hpp>
  5.  
  6. #include <glm/glm.hpp>
  7. #include <glm/gtc/matrix_transform.hpp>
  8. #include <glm/gtc/type_ptr.hpp>
  9.  
  10.  
  11. // Kody shaderów
  12. const GLchar* vertexSource = R"glsl(
  13. #version 150 core
  14. in vec3 position;
  15. in vec3 color;
  16. uniform mat4 model;
  17. uniform mat4 view;
  18. uniform mat4 proj;
  19. out vec3 Color;
  20. void main(){
  21.  
  22. Color = color;
  23.  
  24. gl_Position = proj * view * model * vec4(position, 1.0);
  25.  
  26. }
  27. )glsl";
  28.  
  29. const GLchar* fragmentSource = R"glsl(
  30. #version 150 core
  31. in vec3 Color;
  32. out vec4 outColor;
  33. void main()
  34. {
  35. outColor = vec4(Color, 1.0);
  36. }
  37. )glsl";
  38. //ZMIENNE OPISUJĄCE KAMERE
  39. glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
  40. glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
  41. glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
  42. float obrot = 0;
  43.  
  44. //
  45.  
  46.  
  47.  
  48.  
  49. bool firstMouse = true;
  50. //
  51. glm::vec3 ustawKamereMysz(sf::Window* window, GLfloat xpos, GLfloat ypos)
  52. {
  53. GLfloat lastX;
  54. GLfloat lastY;
  55.  
  56. if (firstMouse) // initially set to true
  57. {
  58. lastX = xpos;
  59. lastY = ypos;
  60. firstMouse = false;
  61. }
  62.  
  63. sf::Vector2i localPosition = sf::Mouse::getPosition();
  64. lastX = localPosition.x;
  65. lastY = localPosition.y;
  66.  
  67. GLfloat xoffset = xpos - lastX;
  68. GLfloat yoffset = lastY - ypos;
  69.  
  70. //sf::Vector2i localPosition = sf::Mouse::getPosition();
  71. //lastX = localPosition.x;
  72. //lastY = localPosition.y;
  73.  
  74. GLdouble yaw = -90; //obrót względem osi Y
  75. GLdouble pitch = 0; //obrót względem osi X
  76.  
  77. GLfloat sensitivity = 0.1f;
  78. xoffset *= sensitivity;
  79. yoffset *= sensitivity;
  80.  
  81. yaw += xoffset;
  82. pitch += yoffset;
  83.  
  84. if (pitch > 89.0f)
  85. pitch = 89.0f;
  86. if (pitch < -89.0f)
  87. pitch = -89.0f;
  88.  
  89. glm::vec3 direction;
  90. direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
  91. direction.y = sin(glm::radians(pitch));
  92. direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
  93. return direction;
  94. }
  95. //
  96.  
  97.  
  98. int main()
  99. {
  100. sf::ContextSettings settings;
  101. settings.depthBits = 24;
  102. settings.stencilBits = 8;
  103.  
  104. // Okno renderingu
  105. sf::Window window(sf::VideoMode(800, 600, 32), "OpenGL", sf::Style::Titlebar | sf::Style::Close, settings);
  106. window.setMouseCursorGrabbed(true); //przechwycenie kursora myszy w oknie ------------
  107. window.setMouseCursorVisible(false); //ukrycie kursora myszy ---------------------
  108. window.setFramerateLimit(20);
  109.  
  110.  
  111. // Inicjalizacja GLEW
  112. glewExperimental = GL_TRUE;
  113. glewInit();
  114.  
  115. // Utworzenie VAO (Vertex Array Object)
  116. GLuint vao;
  117. glGenVertexArrays(1, &vao);
  118. glBindVertexArray(vao);
  119.  
  120. // Utworzenie VBO (Vertex Buffer Object)
  121. // i skopiowanie do niego danych wierzchołkowych
  122. GLuint vbo;
  123. glGenBuffers(1, &vbo);
  124.  
  125.  
  126.  
  127. /*
  128.  
  129. ///Zmiana 2) - odwrócony trójkąt
  130. GLfloat* vertices = new GLfloat[]{
  131. -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,// Top-left
  132. 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,// Top-right
  133. 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-right
  134.  
  135. 0.5f, -0.5f, 0.0f, 0.0f, 1.0f,// Bottom-right
  136. -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,// Bottom-left
  137. -0.5f, 0.5f, 1.0f, 0.0f, 0.0f // Top-left
  138.  
  139. };
  140. */
  141. float vertices[] = {
  142. -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
  143. 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
  144. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f,
  145. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f,
  146. -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  147. -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
  148. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f,
  149. 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  150. 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 0.0f,
  151. 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 0.0f,
  152. -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
  153. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f,
  154. -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  155. -0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f,
  156. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  157. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  158. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f,
  159. -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  160. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  161. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f,
  162. 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  163. 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  164. 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f,
  165. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  166. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  167. 0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.0f,
  168. 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  169. 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  170. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f,
  171. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  172. -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  173. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f,
  174. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  175. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  176. -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f,
  177. -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f
  178. };
  179.  
  180. glBindBuffer(GL_ARRAY_BUFFER, vbo);
  181. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  182.  
  183. // Utworzenie i skompilowanie shadera wierzchołków
  184. GLuint vertexShader =
  185. glCreateShader(GL_VERTEX_SHADER);
  186. glShaderSource(vertexShader, 1, &vertexSource, NULL);
  187. glCompileShader(vertexShader);
  188.  
  189. // Utworzenie i skompilowanie shadera fragmentów
  190. GLuint fragmentShader =
  191. glCreateShader(GL_FRAGMENT_SHADER);
  192. glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
  193. glCompileShader(fragmentShader);
  194.  
  195. // Zlinkowanie obu shaderów w jeden wspólny program
  196. GLuint shaderProgram = glCreateProgram();
  197. glAttachShader(shaderProgram, vertexShader);
  198. glAttachShader(shaderProgram, fragmentShader);
  199. glBindFragDataLocation(shaderProgram, 0, "outColor");
  200. glLinkProgram(shaderProgram);
  201. glUseProgram(shaderProgram);
  202.  
  203. // Specifikacja formatu danych wierzchołkowych
  204. GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
  205. glEnableVertexAttribArray(posAttrib);
  206. glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), 0);
  207. GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
  208. glEnableVertexAttribArray(colAttrib);
  209.  
  210. //3)Zepsuje tutaj w tym miejscu ostatni parametr i program zamiast się wysypać zmieni kolor figury w środku
  211.  
  212. glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
  213.  
  214. // Rozpoczęcie pętli zdarzeń
  215. bool running = true;
  216. //ZMIANY
  217. int punkty_ = 6;
  218. long prymityw = GL_TRIANGLES;
  219. GLfloat mouse_y = 500;
  220. GLfloat mouse_x = 600;
  221. //ZMIANY
  222.  
  223.  
  224.  
  225.  
  226.  
  227. glm::mat4 model = glm::mat4(1.0f);
  228.  
  229. model = glm::rotate(model, glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f));
  230.  
  231. GLint uniTrans = glGetUniformLocation(shaderProgram, "model");
  232. glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(model));
  233.  
  234. glm::mat4 view;
  235. view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f),
  236. glm::vec3(0.0f, 0.0f, 0.0f),
  237. glm::vec3(0.0f, 1.0f, 0.0f));
  238.  
  239. GLint uniView = glGetUniformLocation(shaderProgram, "view");
  240. glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));
  241. glm::mat4 proj = glm::perspective(glm::radians(45.0f), 800.0f / 800.0f, 0.06f, 100.0f);
  242. GLint uniProj = glGetUniformLocation(shaderProgram, "proj");
  243. glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(proj));
  244.  
  245. view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
  246. float cameraSpeed = 0.1f;
  247. float obrot = 0.3f;
  248.  
  249.  
  250.  
  251. sf::Clock clock;
  252. sf::Time time;
  253.  
  254.  
  255.  
  256. while (running) {
  257. sf::Event windowEvent;
  258. time = clock.getElapsedTime();
  259. clock.restart();
  260.  
  261. float cameraSpeed = 0.02f * time.asMicroseconds();
  262.  
  263. while (window.pollEvent(windowEvent)) {
  264. switch (windowEvent.type) {
  265. case sf::Event::Closed:
  266. running = false;
  267. break;
  268.  
  269. case sf::Event::KeyPressed:
  270. {
  271. switch (windowEvent.key.code)
  272. {
  273. case sf::Keyboard::Num1:
  274. prymityw = GL_POINTS;
  275. break;
  276. case sf::Keyboard::Num2:
  277. prymityw = GL_LINES;
  278. break;
  279. case sf::Keyboard::Num3:
  280. prymityw = GL_LINE_STRIP;
  281. break;
  282. case sf::Keyboard::Num4:
  283. prymityw = GL_LINE_LOOP;
  284. break;
  285. case sf::Keyboard::Num5:
  286. prymityw = GL_TRIANGLES;
  287. break;
  288. case sf::Keyboard::Num6:
  289. prymityw = GL_TRIANGLE_STRIP;
  290. break;
  291. case sf::Keyboard::Num7:
  292. prymityw = GL_TRIANGLE_FAN;
  293. break;
  294. case sf::Keyboard::Num8:
  295. prymityw = GL_QUADS;
  296. break;
  297. case sf::Keyboard::Num9:
  298. prymityw = GL_QUAD_STRIP;
  299. break;
  300. case sf::Keyboard::Num0:
  301. prymityw = GL_POLYGON;
  302. break;
  303. case sf::Keyboard::Left:
  304. cameraPos += glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
  305. view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
  306. glGetUniformLocation(shaderProgram, "view");
  307. glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));
  308. break;
  309. case sf::Keyboard::Right:
  310. cameraPos -= glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
  311. view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
  312. glGetUniformLocation(shaderProgram, "view");
  313. glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));
  314. break;
  315. case sf::Keyboard::Up:
  316. cameraPos -= cameraSpeed * cameraUp;
  317. view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
  318. glGetUniformLocation(shaderProgram, "view");
  319. glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));
  320. break;
  321.  
  322. case sf::Keyboard::Down:
  323. cameraPos += cameraSpeed * cameraUp;
  324. view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
  325. glGetUniformLocation(shaderProgram, "view");
  326. glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));
  327. break;
  328. case sf::Keyboard::R:
  329. model = glm::rotate(model, glm::radians(30.0f) + obrot, glm::vec3(0.0f, 0.0f, 1.0f));
  330. glGetUniformLocation(shaderProgram, "model");
  331. glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(model));
  332. break;
  333. case sf::Keyboard::Escape:
  334. window.close();
  335. return 0;
  336. break;
  337.  
  338.  
  339.  
  340.  
  341.  
  342. }
  343. case sf::Event::MouseMoved:
  344. glm::vec3 direction;
  345. direction = ustawKamereMysz(&window, mouse_x, mouse_y);
  346. cameraFront = glm::normalize(direction);
  347. view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
  348. glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));
  349.  
  350. break;
  351. }
  352. }
  353. // Nadanie scenie koloru czarnego
  354. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  355. glClear(GL_COLOR_BUFFER_BIT);
  356.  
  357. // Narysowanie trójkąta na podstawie 3 wierzchołków
  358. ///Zmiana 2.1 z 3 wierzchołków na 6 wierzchołków
  359. ///
  360. //glBindBuffer(GL_ARRAY_BUFFER, buffer);
  361.  
  362.  
  363.  
  364.  
  365. glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * punkty_ * 6, vertices,
  366. GL_STATIC_DRAW);
  367. glDrawArrays(prymityw, 0, punkty_);
  368. // Wymiana buforów tylni/przedni
  369. window.display();
  370. }
  371. }
  372. // Kasowanie programu i czyszczenie buforów
  373. glDeleteProgram(shaderProgram);
  374. glDeleteShader(fragmentShader);
  375. glDeleteShader(vertexShader);
  376. glDeleteBuffers(1, &vbo);
  377. glDeleteVertexArrays(1, &vao);
  378. // Zamknięcie okna renderingu
  379. window.close();
  380. return 0;
  381.  
  382. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement