Advertisement
Guest User

Untitled

a guest
Aug 28th, 2015
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.94 KB | None | 0 0
  1. #define GLFW_DLL
  2.  
  3. #include <GL/glew.h>
  4. #include <GLFW/glfw3.h>
  5. #include <glm\mat4x4.hpp>
  6. #include <glm/gtc/type_ptr.hpp>
  7. #include <glm\gtc\quaternion.hpp>
  8. #include <glm\gtc\matrix_transform.hpp>
  9. #include <SOIL.h>
  10.  
  11. #include <string>
  12.  
  13. #include "Shader.hpp"
  14. #include "Cube.hpp"
  15. #include "lighting.hpp"
  16. #include "camera.hpp"
  17. #include "material.hpp"
  18. #include "utility.hpp"
  19. #include "model.hpp"
  20.  
  21. #pragma region "Constants"
  22. const char* TITLE = "Predator-Prey Simulation";
  23.  
  24. const float WIDTH = 1920.f;
  25. const float HEIGHT = 1080.f;
  26. const float FIELD_OF_VIEW = 90.f;
  27. const float NEAR_PLANE = 0.1f;
  28. const float FAR_PLANE = 100.f;
  29.  
  30. const glm::vec3 START_CAMERA_POSITION = glm::vec3(0.f, 2.f, 4.f);
  31. const glm::vec3 START_CAMERA_FRONT = glm::vec3(0.f, 0.f, -1.f);
  32. const glm::vec3 START_CAMERA_UP = glm::vec3(0.f, 1.f, 0.f);
  33.  
  34. const char* DEFAULT_VERTEX_SHADER_FILE = "vert.glsl";
  35. const char* DEFAULT_FRAGMENT_SHADER_FILE = "frag.glsl";
  36. const char* LIGHT_OBJECT_FRAGMENT_SHADER_FILE = "light.glsl";
  37.  
  38. const bool USE_POINT_LIGHTING = true;
  39. const bool USE_DIRECTIONAL_LIGHTING = true;
  40. const bool USE_SPOT_LIGHTING = true;
  41. const int NUM_POINT_LIGHTS = 3;
  42. #pragma endregion
  43.  
  44. Model model;
  45.  
  46. Material material;
  47.  
  48. PointLight pointLight[NUM_POINT_LIGHTS];
  49. DirectionalLight directionalLight;
  50. SpotLight spotLight;
  51.  
  52. Camera camera;
  53. Orientation orientation;
  54.  
  55. FrameTiming frameTiming;
  56. Input input;
  57.  
  58. Shader shader;
  59. Shader lightShader;
  60.  
  61. Cube cube;
  62. Cube cubeLamp;
  63.  
  64. GLFWwindow* window;
  65. glm::mat4 projectionMatrix;
  66.  
  67. glm::vec3 cubePositions[] = {
  68. glm::vec3(0.0f, 0.0f, 0.0f),
  69. glm::vec3(2.0f, 5.0f, -4.0f),
  70. glm::vec3(-1.5f, -2.2f, -2.5f),
  71. glm::vec3(-3.8f, -2.0f, -6.3f),
  72. glm::vec3(2.4f, -0.4f, -3.5f),
  73. glm::vec3(-1.7f, 3.0f, -7.5f),
  74. glm::vec3(1.3f, -2.0f, -2.5f),
  75. glm::vec3(1.5f, 2.0f, -2.5f),
  76. glm::vec3(1.5f, 0.2f, -1.5f),
  77. glm::vec3(-1.3f, 1.0f, -1.5f)
  78. };
  79.  
  80. GLuint amount = 104907;
  81. glm::mat4* modelMatrices;
  82. float* instanceColours;
  83.  
  84.  
  85. void instancedRender() {
  86. lightShader.use();
  87.  
  88. glUniformMatrix4fv(glGetUniformLocation(lightShader.program, "projection"), 1, GL_FALSE, value_ptr(projectionMatrix));
  89. glUniformMatrix4fv(glGetUniformLocation(lightShader.program, "view"), 1, GL_FALSE, value_ptr(camera.viewMatrix));
  90. glUniform3fv(glGetUniformLocation(lightShader.program, "pointLight.ambient"), 1, value_ptr(glm::vec3(1.f)));
  91. glUniform3fv(glGetUniformLocation(lightShader.program, "pointLight.diffuse"), 1, value_ptr(glm::vec3(1.f)));
  92. glUniform3fv(glGetUniformLocation(lightShader.program, "pointLight.specular"), 1, value_ptr(glm::vec3(1.f)));
  93. glBindVertexArray(cube.vao);
  94. glDrawArraysInstanced(GL_TRIANGLES, 0, 36, amount);
  95. glBindVertexArray(0);
  96.  
  97. }
  98.  
  99. void initInstancedRender() {
  100. lightShader = Shader(DEFAULT_VERTEX_SHADER_FILE, LIGHT_OBJECT_FRAGMENT_SHADER_FILE);
  101.  
  102. camera.position = START_CAMERA_POSITION;
  103. camera.front = START_CAMERA_FRONT;
  104. camera.up = START_CAMERA_UP;
  105. camera.speed = 50.f;
  106. camera.viewMatrix = lookAt(camera.position, camera.position + camera.front, camera.up);
  107.  
  108. projectionMatrix = glm::infinitePerspective(glm::radians(FIELD_OF_VIEW), WIDTH / HEIGHT, 0.1f);
  109.  
  110. modelMatrices = new glm::mat4[amount];
  111. int index = 0;
  112. for (GLint x = 0; x < 187; x++) {
  113. for (GLint z = 0; z < 561; z++) {
  114. glm::mat4 model;
  115. model = glm::scale(model, glm::vec3(3.F, 1.F, 1.F));
  116. model = glm::translate(model, glm::vec3(-x * 1.9F, 0.f, -z * 1.9F));
  117. modelMatrices[index++] = model;
  118. }
  119. }
  120.  
  121. instanceColours = new float[amount];
  122.  
  123. std::fstream in;
  124. in.open("data5.txt", std::fstream::in);
  125. std::string line;
  126. std::vector<float> v;
  127. std::getline(in, line);
  128. float value;
  129. std::istringstream iss(line);
  130. std::copy(std::istream_iterator<float>(iss),
  131. std::istream_iterator<float>(),
  132. std::back_inserter(v));
  133.  
  134. in.close();
  135.  
  136. int i1 = 0;
  137. for (float f : v) {
  138. instanceColours[i1] = v.at(i1);
  139. i1++;
  140. }
  141.  
  142. cube.init();
  143.  
  144. orientation.pitch = -25.f;
  145. orientation.yaw = -90.f;
  146. orientation.roll = 0.f;
  147.  
  148. input.previousMousePosX = WIDTH / 2.f;
  149. input.previousMousePosY = HEIGHT / 2.f;
  150. input.mouseInitiallyMoved = true;
  151. input.mouseSensitivity = 0.2f;
  152.  
  153. GLuint buffer;
  154. GLuint buffer2;
  155. glBindVertexArray(cube.vao);
  156. glGenBuffers(1, &buffer);
  157. glBindBuffer(GL_ARRAY_BUFFER, buffer);
  158. glBufferData(GL_ARRAY_BUFFER, amount * sizeof(glm::mat4), &modelMatrices[0], GL_STATIC_DRAW);
  159. // Set attribute pointers for matrix (4 times vec4)
  160. glEnableVertexAttribArray(3);
  161. glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (GLvoid*)0);
  162. glEnableVertexAttribArray(4);
  163. glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (GLvoid*)(sizeof(glm::vec4)));
  164. glEnableVertexAttribArray(5);
  165. glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (GLvoid*)(2 * sizeof(glm::vec4)));
  166. glEnableVertexAttribArray(6);
  167. glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (GLvoid*)(3 * sizeof(glm::vec4)));
  168.  
  169. glVertexAttribDivisor(3, 1);
  170. glVertexAttribDivisor(4, 1);
  171. glVertexAttribDivisor(5, 1);
  172. glVertexAttribDivisor(6, 1);
  173.  
  174. glGenBuffers(1, &buffer2);
  175. glBindBuffer(GL_ARRAY_BUFFER, buffer2);
  176. glBufferData(GL_ARRAY_BUFFER, amount * sizeof(float), &instanceColours[0], GL_STATIC_DRAW);
  177. glEnableVertexAttribArray(7);
  178. glVertexAttribPointer(7, 1, GL_FLOAT, GL_FALSE, sizeof(float), (GLvoid*)0);
  179.  
  180. glVertexAttribDivisor(7, 1);
  181.  
  182. glBindVertexArray(0);
  183. }
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192. void initSimulation()
  193. {
  194.  
  195.  
  196.  
  197.  
  198. shader = Shader(DEFAULT_VERTEX_SHADER_FILE, DEFAULT_FRAGMENT_SHADER_FILE);
  199. lightShader = Shader(DEFAULT_VERTEX_SHADER_FILE, LIGHT_OBJECT_FRAGMENT_SHADER_FILE);
  200.  
  201. camera.position = START_CAMERA_POSITION;
  202. camera.front = START_CAMERA_FRONT;
  203. camera.up = START_CAMERA_UP;
  204. camera.speed = 5.f;
  205. camera.viewMatrix = lookAt(camera.position, camera.position + camera.front, camera.up);
  206.  
  207. projectionMatrix = glm::perspective(glm::radians(FIELD_OF_VIEW), WIDTH / HEIGHT, NEAR_PLANE, FAR_PLANE);
  208.  
  209.  
  210. //RED
  211. pointLight[0].ambient = glm::vec3(0.05f, 0.f, 0.0f);
  212. pointLight[0].diffuse = glm::vec3(0.7f, 0.f, 0.0f);
  213. pointLight[0].specular = glm::vec3(1.f, 0.f, 0.f);
  214. pointLight[0].attenuation.constant = 1.f;
  215. pointLight[0].attenuation.linear = 0.14f;
  216. pointLight[0].attenuation.quadratic = 0.07f;
  217. pointLight[0].position = glm::vec3(0.f);
  218.  
  219. //GREEN
  220. pointLight[1].ambient = glm::vec3(0.0f, 0.05f, 0.0f);
  221. pointLight[1].diffuse = glm::vec3(0.0f, 0.7f, 0.0f);
  222. pointLight[1].specular = glm::vec3(0.f, 1.f, 0.f);
  223. pointLight[1].attenuation.constant = 1.f;
  224. pointLight[1].attenuation.linear = 0.14f;
  225. pointLight[1].attenuation.quadratic = 0.07f;
  226. pointLight[1].position = glm::vec3(1.f, 0.f, 0.f);
  227.  
  228. //BLUE
  229. pointLight[2].ambient = glm::vec3(0.0f, 0.f, 0.05f);
  230. pointLight[2].diffuse = glm::vec3(0.0f, 0.f, 0.9f);
  231. pointLight[2].specular = glm::vec3(0.f, 0.f, 1.f);
  232. pointLight[2].attenuation.constant = 1.f;
  233. pointLight[2].attenuation.linear = 0.14f;
  234. pointLight[2].attenuation.quadratic = 0.07f;
  235. pointLight[2].position = glm::vec3(2.f, 0.f, 0.f);
  236.  
  237. directionalLight.ambient = glm::vec3(0.1f, 0.1f, 0.1f);
  238. directionalLight.diffuse = glm::vec3(0.3f, 0.3f, 0.3f);
  239. directionalLight.specular = glm::vec3(1.f, 1.f, 1.f);
  240. directionalLight.direction = glm::vec3(0.f, 1.f, 0.f);
  241.  
  242. spotLight.ambient = glm::vec3(0.0f, 0.f, 1.f);
  243. spotLight.diffuse = glm::vec3(0.0f, 0.f, 1.f);
  244. spotLight.specular = glm::vec3(0.f, 0.f, 1.f);
  245. spotLight.attenuation.constant = 1.f;
  246. spotLight.attenuation.linear = 0.045f;
  247. spotLight.attenuation.quadratic = 0.0075f;
  248. spotLight.position = camera.position;
  249. spotLight.direction = camera.front;
  250. spotLight.innerCutoffAngle = 6.f;
  251. spotLight.outerCutoffAngle = 20.f;
  252.  
  253. material.shininess = 32.f;
  254. glGenTextures(1, &material.diffuseMap);
  255. int width;
  256. int height;
  257. unsigned char* img;
  258. img = SOIL_load_image("box_diffuse.png", &width, &height, nullptr, SOIL_LOAD_RGB);
  259. glBindTexture(GL_TEXTURE_2D, material.diffuseMap);
  260. glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, img);
  261. glGenerateMipmap(GL_TEXTURE_2D);
  262. SOIL_free_image_data(img);
  263. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  264. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  265. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  266. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST);
  267.  
  268. glGenTextures(1, &material.specularMap);
  269. img = SOIL_load_image("box_specular.png", &width, &height, nullptr, SOIL_LOAD_RGB);
  270. glBindTexture(GL_TEXTURE_2D, material.specularMap);
  271. glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, img);
  272. glGenerateMipmap(GL_TEXTURE_2D);
  273. SOIL_free_image_data(img);
  274. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  275. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  276. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  277. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST);
  278.  
  279. cubeLamp = Cube();
  280. cubeLamp.init();
  281.  
  282. cube = Cube();
  283. cube.init();
  284.  
  285. model = Model("Metroid/metroid.DAE");
  286.  
  287. orientation.pitch = -25.f;
  288. orientation.yaw = -90.f;
  289. orientation.roll = 0.f;
  290.  
  291. input.previousMousePosX = WIDTH / 2.f;
  292. input.previousMousePosY = HEIGHT / 2.f;
  293. input.mouseInitiallyMoved = true;
  294. input.mouseSensitivity = 0.2f;
  295. }
  296.  
  297.  
  298. void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
  299. void mouse_callback(GLFWwindow* window, double xpos, double ypos);
  300.  
  301. void moveCamera() {
  302. auto movementFactor = camera.speed * frameTiming.deltaTime;
  303.  
  304. if (input.keyPressedStates[GLFW_KEY_W])
  305. camera.position += camera.front * movementFactor;
  306. if (input.keyPressedStates[GLFW_KEY_S])
  307. camera.position -= camera.front * movementFactor;
  308. if (input.keyPressedStates[GLFW_KEY_A])
  309. camera.position -= normalize(cross(camera.front, camera.up)) * movementFactor;
  310. if (input.keyPressedStates[GLFW_KEY_D])
  311. camera.position += normalize(cross(camera.front, camera.up)) * movementFactor;
  312. }
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320. void renderObject()
  321. {
  322. shader.use();
  323.  
  324. glUniform3fv(glGetUniformLocation(shader.program, "cameraPosition"), 1, value_ptr(camera.position));
  325.  
  326. glUniform1i(glGetUniformLocation(shader.program, "material.diffuse"), 0);
  327. glUniform1i(glGetUniformLocation(shader.program, "material.specular"), 1);
  328. glUniform1f(glGetUniformLocation(shader.program, "material.shininess"), material.shininess);
  329.  
  330. for (auto i = 0; i < NUM_POINT_LIGHTS; i++)
  331. {
  332. auto index = std::to_string(i);
  333. //pointLight[i].position.x = sin(glfwGetTime() + i * 300);
  334. //pointLight[i].position.z = -2.f + cos(glfwGetTime() + i * 300);
  335. //pointLight[i].position.y = 1.f;
  336. glUniform3fv(glGetUniformLocation(shader.program, ("pointLight[" + index + "].ambient").c_str()), 1, value_ptr(pointLight[i].ambient));
  337. glUniform3fv(glGetUniformLocation(shader.program, ("pointLight[" + index + "].diffuse").c_str()), 1, value_ptr(pointLight[i].diffuse));
  338. glUniform3fv(glGetUniformLocation(shader.program, ("pointLight[" + index + "].specular").c_str()), 1, value_ptr(pointLight[i].specular));
  339. glUniform3fv(glGetUniformLocation(shader.program, ("pointLight[" + index + "].position").c_str()), 1, value_ptr(pointLight[i].position));
  340. glUniform1f(glGetUniformLocation(shader.program, ("pointLight[" + index + "].attenuation.constant").c_str()), pointLight[i].attenuation.constant);
  341. glUniform1f(glGetUniformLocation(shader.program, ("pointLight[" + index + "].attenuation.linear").c_str()), pointLight[i].attenuation.linear);
  342. glUniform1f(glGetUniformLocation(shader.program, ("pointLight[" + index + "].attenuation.quadratic").c_str()), pointLight[i].attenuation.quadratic);
  343. }
  344.  
  345. glUniform3fv(glGetUniformLocation(shader.program, "directionalLight.ambient"), 1, value_ptr(directionalLight.ambient));
  346. glUniform3fv(glGetUniformLocation(shader.program, "directionalLight.diffuse"), 1, value_ptr(directionalLight.diffuse));
  347. glUniform3fv(glGetUniformLocation(shader.program, "directionalLight.specular"), 1, value_ptr(directionalLight.specular));
  348. glUniform3fv(glGetUniformLocation(shader.program, "directionalLight.direction"), 1, value_ptr(directionalLight.direction));
  349.  
  350. spotLight.position = camera.position;
  351. spotLight.direction = camera.front;
  352. glUniform3fv(glGetUniformLocation(shader.program, "spotLight.ambient"), 1, value_ptr(spotLight.ambient));
  353. glUniform3fv(glGetUniformLocation(shader.program, "spotLight.diffuse"), 1, value_ptr(spotLight.diffuse));
  354. glUniform3fv(glGetUniformLocation(shader.program, "spotLight.specular"), 1, value_ptr(spotLight.specular));
  355. glUniform3fv(glGetUniformLocation(shader.program, "spotLight.position"), 1, value_ptr(spotLight.position));
  356. glUniform1f(glGetUniformLocation(shader.program, "spotLight.attenuation.constant"), spotLight.attenuation.constant);
  357. glUniform1f(glGetUniformLocation(shader.program, "spotLight.attenuation.linear"), spotLight.attenuation.linear);
  358. glUniform1f(glGetUniformLocation(shader.program, "spotLight.attenuation.quadratic"), spotLight.attenuation.quadratic);
  359. glUniform3fv(glGetUniformLocation(shader.program, "spotLight.position"), 1, value_ptr(spotLight.position));
  360. glUniform3fv(glGetUniformLocation(shader.program, "spotLight.direction"), 1, value_ptr(spotLight.direction));
  361. glUniform1f(glGetUniformLocation(shader.program, "spotLight.innerCutoffAngle"), glm::cos(glm::radians(spotLight.innerCutoffAngle)));
  362. glUniform1f(glGetUniformLocation(shader.program, "spotLight.outerCutoffAngle"), glm::cos(glm::radians(spotLight.outerCutoffAngle)));
  363.  
  364. glActiveTexture(GL_TEXTURE0);
  365. glBindTexture(GL_TEXTURE_2D, material.diffuseMap);
  366. glActiveTexture(GL_TEXTURE1);
  367. glBindTexture(GL_TEXTURE_2D, material.specularMap);
  368.  
  369.  
  370. for (auto i = 0; i < 10; i++)
  371. {
  372. glm::mat4 model;
  373. model = translate(model, cubePositions[i]);
  374. model = rotate(model, 0.f, glm::vec3(1.0f, 0.3f, 0.5f));
  375. auto MVP = projectionMatrix * camera.viewMatrix * model;
  376. glUniformMatrix4fv(glGetUniformLocation(shader.program, "MVP"), 1, GL_FALSE, value_ptr(MVP));
  377. glUniformMatrix4fv(glGetUniformLocation(shader.program, "modelMatrix"), 1, GL_FALSE, value_ptr(model));
  378.  
  379. cube.render();
  380. }
  381.  
  382. glm::mat4 m;
  383. m = translate(m, glm::vec3(0.0f, -1.75f, -2.0f));
  384. m = scale(m, glm::vec3(0.05f, 0.05f, 0.05f));
  385. auto MVP = projectionMatrix * camera.viewMatrix * m;
  386. glUniformMatrix4fv(glGetUniformLocation(shader.program, "MVP"), 1, GL_FALSE, value_ptr(MVP));
  387. glUniformMatrix4fv(glGetUniformLocation(shader.program, "modelMatrix"), 1, GL_FALSE, value_ptr(m));
  388. model.draw(shader);
  389.  
  390. }
  391.  
  392. void renderPointLight()
  393. {
  394. lightShader.use();
  395.  
  396. for (auto i = 0; i < 3; i++) {
  397. glm::mat4 model;
  398. model = translate(model, pointLight[i].position);
  399. auto MVP = projectionMatrix * camera.viewMatrix * model;
  400. glUniformMatrix4fv(glGetUniformLocation(lightShader.program, "MVP"), 1, GL_FALSE, value_ptr(MVP));
  401. glUniform3fv(glGetUniformLocation(lightShader.program, "pointLight.ambient"), 1, value_ptr(pointLight[i].ambient));
  402. glUniform3fv(glGetUniformLocation(lightShader.program, "pointLight.diffuse"), 1, value_ptr(pointLight[i].diffuse));
  403. glUniform3fv(glGetUniformLocation(lightShader.program, "pointLight.specular"), 1, value_ptr(pointLight[i].specular));
  404. cubeLamp.render();
  405. }
  406. }
  407.  
  408. void updateSimulation()
  409. {
  410. frameTiming.updateDeltaTime();
  411. camera.viewMatrix = lookAt(camera.position, camera.position + camera.front, camera.up);
  412. moveCamera();
  413. }
  414.  
  415. void renderSimulation()
  416. {
  417. instancedRender();
  418. //renderObject();
  419. //renderPointLight();
  420. }
  421.  
  422. int main()
  423. {
  424. glfwInit();
  425. //glfwWindowHint(GLFW_SAMPLES, 4);
  426. glfwWindowHint(GLFW_SRGB_CAPABLE, true);
  427. window = glfwCreateWindow(static_cast<int>(WIDTH), static_cast<int>(HEIGHT), TITLE, nullptr, nullptr);
  428. glfwMakeContextCurrent(window);
  429. glfwSetKeyCallback(window, key_callback);
  430. glfwSetCursorPos(window, WIDTH / 2, HEIGHT / 2);
  431. glfwSetCursorPosCallback(window, mouse_callback);
  432.  
  433. glewExperimental = GL_TRUE;
  434. glewInit();
  435. glEnable(GL_FRAMEBUFFER_SRGB);
  436. //glEnable(GL_MULTISAMPLE);
  437. glEnable(GL_DEPTH_TEST);
  438. glDepthFunc(GL_LESS);
  439.  
  440. //initSimulation();
  441.  
  442. glClearColor(0.f, 0.f, 0.f, 1.f);
  443.  
  444. initInstancedRender();
  445.  
  446. while (!glfwWindowShouldClose(window))
  447. {
  448. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  449. updateSimulation();
  450. renderSimulation();
  451. glfwSwapBuffers(window);
  452. glfwPollEvents();
  453. }
  454.  
  455. glfwTerminate();
  456. return 0;
  457. }
  458.  
  459. void key_callback(GLFWwindow* window, int key, int /*scancode*/, int action, int /*mode*/)
  460. {
  461. if (action == GLFW_PRESS)
  462. {
  463. input.keyPressedStates[key] = true;
  464. }
  465. else if (action == GLFW_RELEASE)
  466. {
  467. input.keyPressedStates[key] = false;
  468. }
  469.  
  470. if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
  471. glfwSetWindowShouldClose(window, GL_TRUE);
  472. }
  473.  
  474. void mouse_callback(GLFWwindow* /*window*/, double xpos, double ypos)
  475. {
  476. if (input.mouseInitiallyMoved)
  477. {
  478. input.previousMousePosX = xpos;
  479. input.previousMousePosY = ypos;
  480. input.mouseInitiallyMoved = false;
  481. }
  482.  
  483. float xOffset = (xpos - input.previousMousePosX) * input.mouseSensitivity;
  484. float yOffset = (input.previousMousePosY - ypos) * input.mouseSensitivity;
  485. input.previousMousePosX = xpos;
  486. input.previousMousePosY = ypos;
  487.  
  488. orientation.yaw += xOffset;
  489. orientation.pitch += yOffset;
  490. if (orientation.pitch > 89.f)
  491. orientation.pitch = 89.f;
  492. else if (orientation.pitch < -89.f)
  493. {
  494. orientation.pitch = -89.f;
  495. }
  496.  
  497. glm::vec3 front;
  498. front.x = cos(glm::radians(orientation.yaw)) * cos(glm::radians(orientation.pitch));
  499. front.y = sin(glm::radians(orientation.pitch));
  500. front.z = sin(glm::radians(orientation.yaw)) * cos(glm::radians(orientation.pitch));
  501. camera.front = normalize(front);
  502. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement