+#include <assimp/scene.h>\r
+\r
+struct model {\r
+ std::vector<float> vertices;\r
+ std::vector<GLuint> indices;\r
+\r
+ void draw() {\r
+ if (VAO == 0) initVAO();\r
+ glBindVertexArray(VAO);\r
+ glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);\r
+ glBindVertexArray(0);\r
+ }\r
+\r
+private:\r
+ void initVAO() {\r
+ GLuint VBO;\r
+ glGenBuffers(1, &VBO);\r
+\r
+ GLuint EBO;\r
+ glGenBuffers(1, &EBO);\r
+\r
+ glGenVertexArrays(1, &VAO);\r
+\r
+ glBindVertexArray(VAO);\r
+\r
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);\r
+ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(),\r
+ vertices.data(), GL_STATIC_DRAW);\r
+\r
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);\r
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(),\r
+ indices.data(), GL_STATIC_DRAW);\r
+\r
+ glEnableVertexAttribArray(0);\r
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(0));\r
+ glEnableVertexAttribArray(1);\r
+ glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3));\r
+\r
+ glBindVertexArray(0);\r
+ }\r
+ GLuint VAO = 0;\r
+};\r
+\r
+\r
+struct freecam {\r
+ glm::vec3 pos = glm::vec3(0, 0, -1);\r
+ glm::vec2 rot = glm::vec2(0, 0);\r
+\r
+ void update(sf::Window &window) {\r
+ int mouseDeltaX = sf::Mouse::getPosition(window).x - window.getSize().x / 2;\r
+ int mouseDeltaY = sf::Mouse::getPosition(window).y - window.getSize().y / 2;\r
+\r
+ rot.x += mouseDeltaX;\r
+ rot.y += mouseDeltaY;\r
+\r
+ forward = glm::rotate(glm::vec3(0, 0, 1), rot.y / angleFactor, glm::vec3(1, 0, 0));\r
+ forward = glm::rotate(forward, -rot.x / angleFactor, glm::vec3(0, 1, 0));\r
+\r
+ glm::vec3 left = glm::rotate(glm::vec3(0, 0, 1), -rot.x / angleFactor + glm::radians(90.0f), glm::vec3(0, 1, 0));\r
+\r
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::LShift))\r
+ moveFactor = 200;\r
+ else\r
+ moveFactor = 20;\r
+\r
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))\r
+ pos += forward / moveFactor;\r
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))\r
+ pos -= forward / moveFactor;\r
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))\r
+ pos += left / moveFactor;\r
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))\r
+ pos -= left / moveFactor;\r
+\r
+ limit();\r
+ }\r
+\r
+ void limit() {\r
+ rot.x = fmod(rot.x, glm::radians(360.0f) * angleFactor);\r
+ rot.y = fmod(rot.y, glm::radians(360.0f) * angleFactor);\r
+ }\r