From aba3d387e6c1bf002d418aaead0df2910dc17bef Mon Sep 17 00:00:00 2001 From: MrLetsplay2003 Date: Wed, 2 Nov 2022 13:37:35 +0100 Subject: [PATCH] Move mouse code to defaults --- src/kekengine/cpp/defaults.cpp | 34 +++++++++++++++++++++++++++++++- src/kekengine/cpp/engine.cpp | 30 ++++++---------------------- src/kekengine/cpp/input.cpp | 11 +++++++++++ src/kekengine/include/input.h | 16 ++++++++++++++- src/kekengine/include/internal.h | 1 + 5 files changed, 66 insertions(+), 26 deletions(-) diff --git a/src/kekengine/cpp/defaults.cpp b/src/kekengine/cpp/defaults.cpp index 57a4a28..df24649 100644 --- a/src/kekengine/cpp/defaults.cpp +++ b/src/kekengine/cpp/defaults.cpp @@ -12,7 +12,8 @@ static KeyBinding keyRight, keyUp, keyDown, - keyOptions; + keyOptions, + keyToggleCursorMode; static ButtonElement *options; @@ -48,6 +49,35 @@ static void defaultKey(GLFWwindow *window, int key, int scancode, int action, in if(key == Input::getKeyBinding(keyOptions).key && action == GLFW_PRESS) { options->visible = !options->visible; } + + if(key == Input::getKeyBinding(keyToggleCursorMode).key && action == GLFW_PRESS) { + if(Input::getCursorMode() == GLFWCursorMode::CAPTURE) { + Input::setCursorMode(GLFWCursorMode::FREE); + }else { + Input::setCursorMode(GLFWCursorMode::CAPTURE); + } + } +} + +static void defaultMouseCallback(GLFWwindow *window, double x, double y, void *data) { + static bool firstMouse = true; + static double lastX = 0, lastY = 0; + if(firstMouse) { + lastX = x; + lastY = y; + firstMouse = false; + } + + float xoff = lastX - x; + float yoff = lastY - y; + lastX = x; + lastY = y; + + xoff *= 0.1f; + yoff *= 0.1f; + + kekData.activeCamera->rotateYaw(xoff); + kekData.activeCamera->rotatePitch(yoff); } void init() { @@ -58,9 +88,11 @@ void init() { keyUp = Input::createKeyBinding("Up", GLFW_KEY_SPACE); keyDown = Input::createKeyBinding("Down", GLFW_KEY_LEFT_CONTROL); keyOptions = Input::createKeyBinding("Options", GLFW_KEY_Q); + keyToggleCursorMode = Input::createKeyBinding("Toggle Cursor Mode", GLFW_KEY_TAB); Input::addPeriodicCallback(PeriodicCallback(defaultInput, nullptr)); Input::addKeyListener(KeyCallback(defaultKey, nullptr)); + Input::addMouseListener(MouseCallback(defaultMouseCallback, nullptr)); options = new ButtonElement(px(0), px(100), px(100), px(50)); UI::addElement(options); diff --git a/src/kekengine/cpp/engine.cpp b/src/kekengine/cpp/engine.cpp index 200920e..9637f45 100644 --- a/src/kekengine/cpp/engine.cpp +++ b/src/kekengine/cpp/engine.cpp @@ -44,25 +44,6 @@ static void glDebugOutput(GLenum source, GLenum type, unsigned int id, GLenum se } static void onCursorPosCallback(GLFWwindow *window, double x, double y) { - static bool firstMouse = true; - static double lastX = 0, lastY = 0; - if(firstMouse) { - lastX = x; - lastY = y; - firstMouse = false; - } - - float xoff = lastX - x; - float yoff = lastY - y; - lastX = x; - lastY = y; - - xoff *= 0.1f; - yoff *= 0.1f; - - kekData.activeCamera->rotateYaw(xoff); - kekData.activeCamera->rotatePitch(yoff); - for(auto cb : kekData.mouseCallbacks) { cb.second(window, x, y); } @@ -159,8 +140,13 @@ int init() { return KEK_ERROR; } + kekData.activeCamera = new Camera(); + std::cout << "Poop cam is " << kekData.activeCamera << std::endl; + kekData.shader = new Shader("shader/mesh/vertex.glsl", "shader/mesh/fragment.glsl"); + kekData.shader->initLighting(); + glfwSetCursorPosCallback(kekData.window, onCursorPosCallback); - glfwSetInputMode(kekData.window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + Input::setCursorMode(GLFWCursorMode::CAPTURE); glfwSetKeyCallback(kekData.window, onKeyCallback); glfwSetMouseButtonCallback(kekData.window, onMouseButtonCallback); @@ -169,10 +155,6 @@ int init() { stbi_set_flip_vertically_on_load(true); - kekData.activeCamera = new Camera(); - kekData.shader = new Shader("shader/mesh/vertex.glsl", "shader/mesh/fragment.glsl"); - kekData.shader->initLighting(); - FT_Error error = FT_Init_FreeType(&kekData.freetype); if(error) { ErrorDialog::showError("Failed to initialize FreeType: " + std::string(FT_Error_String(error))); diff --git a/src/kekengine/cpp/input.cpp b/src/kekengine/cpp/input.cpp index 161643b..9114881 100644 --- a/src/kekengine/cpp/input.cpp +++ b/src/kekengine/cpp/input.cpp @@ -1,6 +1,7 @@ #include "input.h" #include +#include #include "internal.h" @@ -79,4 +80,14 @@ GLFWKeyState getKeyState(KeyBinding binding) { return glfwGetKey(kekData.window, it->second.key); } +void setCursorMode(GLFWCursorMode mode) { + //std::cout << "POOP is " << mode << std::endl; + glfwSetInputMode(kekData.window, GLFW_CURSOR, (int) mode); + kekData.uiCursorMode = mode; +} + +GLFWCursorMode getCursorMode() { + return kekData.uiCursorMode; +} + } diff --git a/src/kekengine/include/input.h b/src/kekengine/include/input.h index def5b69..02e5c4f 100644 --- a/src/kekengine/include/input.h +++ b/src/kekengine/include/input.h @@ -16,13 +16,24 @@ typedef unsigned int InputListener; typedef int GLFWKey; typedef int GLFWKeyState; typedef unsigned int KeyBinding; -typedef int GLFWMouseButton; struct KeyBindingData { std::string name; GLFWKey key; }; +enum class GLFWCursorMode { + CAPTURE = GLFW_CURSOR_DISABLED, + FREE = GLFW_CURSOR_NORMAL, + HIDDEN = GLFW_CURSOR_HIDDEN +}; + +enum class GLFWMouseButton { + LEFT = GLFW_MOUSE_BUTTON_LEFT, + RIGHT = GLFW_MOUSE_BUTTON_RIGHT, + MIDDLE = GLFW_MOUSE_BUTTON_MIDDLE +}; + } namespace kek::Input { @@ -44,4 +55,7 @@ void reassignKeyBinding(KeyBinding mapping, GLFWKey key); KeyBindingData getKeyBinding(KeyBinding mapping); GLFWKeyState getKeyState(KeyBinding mapping); +void setCursorMode(GLFWCursorMode mode); +GLFWCursorMode getCursorMode(); + } diff --git a/src/kekengine/include/internal.h b/src/kekengine/include/internal.h index 6e8bf50..37e782a 100644 --- a/src/kekengine/include/internal.h +++ b/src/kekengine/include/internal.h @@ -38,6 +38,7 @@ struct KekData { std::vector uiElements; Font *uiDefaultFont; Shader *uiRectangleShader; + GLFWCursorMode uiCursorMode; }; extern KekData kekData;