+ 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
+\r
+ glm::mat4 getViewMatrix() {\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
+ glm::mat4 result = glm::lookAt(pos, pos + forward, up);\r
+ return result;\r
+ }\r
+\r
+private:\r
+ glm::vec3 forward = glm::vec3(0, 0, 1);\r
+ glm::vec3 up = glm::vec3(0, 1, 0);\r
+\r
+ const float angleFactor = 200;\r
+ float moveFactor = 20;\r
+};\r
+\r
+\r
+struct arccam {\r
+ glm::vec2 rot = glm::vec2(0, 0);\r
+ float radius = 1;\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
+ limit(-89, 89);\r
+ }\r
+\r
+ void limit(float minY, float maxY) {\r
+ float angleX = rot.x / angleFactor;\r
+ float angleY = rot.y / angleFactor;\r
+\r
+ rot.x = fmod(rot.x, glm::radians(360.0f) * angleFactor);\r
+\r
+ if (angleY > glm::radians(maxY))\r
+ rot.y = glm::radians(maxY) * angleFactor;\r
+ if (angleY < glm::radians(minY))\r
+ rot.y = glm::radians(minY) * angleFactor;\r
+ }\r
+\r
+ glm::vec3 getPos() {\r
+ float angle = rot.y / angleFactor;\r
+ \r
+ float camY = sin(angle) * exp(radius);\r
+ float camZ = cos(angle) * exp(radius);\r
+\r
+ glm::vec3 result(0.0, camY, camZ);\r
+ return glm::rotate(result, -rot.x / angleFactor, glm::vec3(0, 1, 0));\r
+ }\r
+\r
+ glm::mat4 getViewMatrix() {\r
+ float angle = rot.y / angleFactor;\r
+ \r
+ float camY = sin(angle) * exp(radius);\r
+ float camZ = cos(angle) * exp(radius);\r
+ glm::mat4 result = glm::lookAt(glm::vec3(0.0, camY, camZ), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));\r
+ result = glm::rotate(result, rot.x / angleFactor, glm::vec3(0, 1, 0));\r
+\r
+ return result;\r
+ }\r
+\r
+private:\r
+ const float angleFactor = 200;\r
+};\r