diff --git a/headers/camera.hpp b/headers/camera.hpp index e21f414..186a073 100644 --- a/headers/camera.hpp +++ b/headers/camera.hpp @@ -7,7 +7,10 @@ public: Camera(glm::vec3 pos, float yaw, float pitch, float fov, float aspect); ~Camera(); void setPos(glm::vec3 pos); + void addPos(glm::vec3 pos); + void addFPos(glm::vec3 pos); void setRotate(float yaw, float pitch); + void addRotate(float yaw, float pitch); glm::mat4 getView(); glm::mat4 getProjection(); float aspect; diff --git a/src/camera.cpp b/src/camera.cpp index c5863de..ed568e9 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -16,8 +16,28 @@ void Camera::setRotate(float yaw, float pitch) { update(); } +void Camera::addRotate(float yaw, float pitch) { + this->yaw += yaw; + this->pitch += pitch; + if (this->pitch > 89.0f) + this->pitch = 89.0f; + if (this->pitch < -89.0f) + this->pitch = -89.0f; + update(); +} + void Camera::setPos(glm::vec3 pos) { this->pos = pos; } +void Camera::addPos(glm::vec3 pos) { this->pos += pos; } + +void Camera::addFPos(glm::vec3 pos) { + glm::vec3 f = glm::normalize(glm::vec3(front.x, 0, front.z)); + glm::vec3 r = glm::normalize(glm::cross(f, up)); + this->pos += f * pos.x; + this->pos += up * pos.y; + this->pos += r * pos.z; +} + void Camera::update() { glm::vec3 direction; direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch)); diff --git a/src/main.cpp b/src/main.cpp index 3922b7e..efc0045 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,8 +10,12 @@ #define UNUSED(x) (void)(x) -void processInput(GLFWwindow *window); +glm::vec3 processInput(GLFWwindow *window); void framebuffer_size_callback(GLFWwindow *window, int width, int height); +void mouse_callback(GLFWwindow *window, double xpos, double ypos); + +float deltaTime = 0; + GLFWwindow *init() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); @@ -25,9 +29,11 @@ GLFWwindow *init() { int is_ok = 0; is_ok = gladLoadGLLoader((GLADloadproc)glfwGetProcAddress); assert(is_ok && "Failed to init glad"); + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); glViewport(0, 0, 800, 600); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + glfwSetCursorPosCallback(window, mouse_callback); return window; } @@ -50,11 +56,10 @@ unsigned int meshInit() { int main(void) { glm::vec3 lightPos = glm::vec3(1, 2.0f, 1); - glm::vec3 cameraPos = glm::vec3(2.3, 3, 5); glm::vec3 lightColor = glm::vec3(1); GLFWwindow *window = init(); - Camera *cam = new Camera(cameraPos, -115.0f, -25.0f, 45, 800.0 / 600); + Camera *cam = new Camera(glm::vec3(0), 0, 0, 45, 800.0 / 600); glfwSetWindowUserPointer(window, cam); Shader *cubeShader = new Shader("./shaders/lighting/Vert.glsl", @@ -72,7 +77,12 @@ int main(void) { light->setScale(glm::vec3(.3)); glEnable(GL_DEPTH_TEST); + float lastFrame = 0; while (!glfwWindowShouldClose(window)) { + float currentFrame = static_cast(glfwGetTime()); + deltaTime = currentFrame - lastFrame; + lastFrame = currentFrame; + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -101,7 +111,9 @@ int main(void) { glfwSwapBuffers(window); glfwPollEvents(); - processInput(window); + glm::vec3 mov = processInput(window); + mov *= deltaTime; + cam->addFPos(mov); } delete cam; @@ -111,9 +123,26 @@ int main(void) { return 0; } -void processInput(GLFWwindow *window) { +glm::vec3 processInput(GLFWwindow *window) { + glm::vec3 mov = glm::vec3(0); if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); + + if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) + mov += glm::vec3(1, 0, 0); + if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) + mov -= glm::vec3(1, 0, 0); + if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) + mov += glm::vec3(0, 0, 1); + if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) + mov -= glm::vec3(0, 0, 1); + if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) + mov += glm::vec3(0, 1, 0); + if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS) + mov -= glm::vec3(0, 1, 0); + + mov *= 5; + return mov; } void framebuffer_size_callback(GLFWwindow *window, int width, int height) { @@ -123,3 +152,20 @@ void framebuffer_size_callback(GLFWwindow *window, int width, int height) { if (cam) cam->aspect = (float)width / height; } + +void mouse_callback(GLFWwindow *window, double xpos, double ypos) { + static float xprev = 0.0, yprev = 0.0; + + float xchange = xpos - xprev; + float ychange = yprev - ypos; + xprev = xpos; + yprev = ypos; + + float sensitivity = 0.1f; + xchange *= sensitivity; + ychange *= sensitivity; + + Camera *cam = (Camera *)glfwGetWindowUserPointer(window); + if (cam) + cam->addRotate(xchange, ychange); +}