diff --git a/CMakeLists.txt b/CMakeLists.txt index 82186ad0..907251c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4) else() - target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra + target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -lstdc++fs # additional warnings -Wformat-nonliteral -Wcast-align -Wpointer-arith -Winline -Wundef diff --git a/src/window/Events.cpp b/src/window/Events.cpp index 4295d184..b89c5a4f 100644 --- a/src/window/Events.cpp +++ b/src/window/Events.cpp @@ -12,8 +12,8 @@ float Events::x = 0.0f; float Events::y = 0.0f; bool Events::_cursor_locked = false; bool Events::_cursor_started = false; - - +std::vector Events::codepoints; +std::vector Events::pressedKeys; int Events::initialize(){ _keys = new bool[1032]; @@ -61,5 +61,7 @@ void Events::pullEvents(){ _current++; deltaX = 0.0f; deltaY = 0.0f; + codepoints.clear(); + pressedKeys.clear(); glfwPollEvents(); } diff --git a/src/window/Events.h b/src/window/Events.h index 671bd63d..1627ffb1 100644 --- a/src/window/Events.h +++ b/src/window/Events.h @@ -16,6 +16,8 @@ public: static float y; static bool _cursor_locked; static bool _cursor_started; + static std::vector codepoints; + static std::vector pressedKeys; static int initialize(); static void finalize(); diff --git a/src/window/Window.cpp b/src/window/Window.cpp index 61651077..846287cf 100644 --- a/src/window/Window.cpp +++ b/src/window/Window.cpp @@ -4,7 +4,11 @@ #include #include +using glm::vec4; + GLFWwindow* Window::window = nullptr; +std::stack Window::scissorStack; +vec4 Window::scissorArea; uint Window::width = 0; uint Window::height = 0; @@ -31,23 +35,33 @@ void mouse_button_callback(GLFWwindow*, int button, int action, int) { } } -void key_callback(GLFWwindow*, int key, int /*scancode*/, int action, int /*mode*/) { +void key_callback(GLFWwindow*, int key, int scancode, int action, int /*mode*/) { if (action == GLFW_PRESS) { Events::_keys[key] = true; Events::_frames[key] = Events::_current; + Events::pressedKeys.push_back(key); } else if (action == GLFW_RELEASE) { Events::_keys[key] = false; Events::_frames[key] = Events::_current; } + else if (action == GLFW_REPEAT) { + Events::pressedKeys.push_back(key); + } } void window_size_callback(GLFWwindow*, int width, int height) { glViewport(0, 0, width, height); Window::width = width; Window::height = height; + Window::resetScissor(); } +void character_callback(GLFWwindow* window, unsigned int codepoint){ + Events::codepoints.push_back(codepoint); +} + + int Window::initialize(uint width, uint height, const char* title, int samples){ glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); @@ -71,11 +85,10 @@ int Window::initialize(uint width, uint height, const char* title, int samples){ } glViewport(0,0, width, height); - glClearColor(0.0f,0.0f,0.0f,1); + glClearColor(0.0f,0.0f,0.0f, 1); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glEnable(GL_BLEND); - glEnable(GL_MULTISAMPLE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Window::width = width; @@ -86,6 +99,7 @@ int Window::initialize(uint width, uint height, const char* title, int samples){ glfwSetMouseButtonCallback(window, mouse_button_callback); glfwSetCursorPosCallback(window, cursor_position_callback); glfwSetWindowSizeCallback(window, window_size_callback); + glfwSetCharCallback(window, character_callback); return 0; } @@ -97,6 +111,42 @@ void Window::setCursorMode(int mode){ glfwSetInputMode(window, GLFW_CURSOR, mode); } +void Window::resetScissor() { + scissorArea = vec4(0.0f, 0.0f, width, height); + scissorStack = std::stack(); + glDisable(GL_SCISSOR_TEST); +} + +void Window::pushScissor(vec4 area) { + if (scissorStack.empty()) { + glEnable(GL_SCISSOR_TEST); + } + scissorStack.push(scissorArea); + + area.x = fmax(area.x, scissorArea.x); + area.y = fmax(area.y, scissorArea.y); + + area.z = fmin(area.z, scissorArea.z); + area.w = fmin(area.w, scissorArea.w); + + glScissor(area.x, Window::height-area.y-area.w, area.z, area.w); + scissorArea = area; +} + +void Window::popScissor() { + if (scissorStack.empty()) { + std::cerr << "warning: extra Window::popScissor call" << std::endl; + return; + } + vec4 area = scissorStack.top(); + scissorStack.pop(); + glScissor(area.x, Window::height-area.y-area.w, area.z, area.w); + if (scissorStack.empty()) { + glDisable(GL_SCISSOR_TEST); + } + scissorArea = area; +} + void Window::terminate(){ Events::finalize(); glfwTerminate(); @@ -116,4 +166,5 @@ void Window::swapInterval(int interval){ void Window::swapBuffers(){ glfwSwapBuffers(window); + Window::resetScissor(); } diff --git a/src/window/Window.h b/src/window/Window.h index 0f02294a..bd5a6545 100644 --- a/src/window/Window.h +++ b/src/window/Window.h @@ -2,11 +2,17 @@ #define WINDOW_WINDOW_H_ #include "../typedefs.h" +#include +#include + +#include class GLFWwindow; class Window { static GLFWwindow* window; + static std::stack scissorStack; + static glm::vec4 scissorArea; public: static uint width; static uint height; @@ -19,6 +25,10 @@ public: static void setShouldClose(bool flag); static void swapBuffers(); static void swapInterval(int interval); + + static void pushScissor(glm::vec4 area); + static void popScissor(); + static void resetScissor(); }; #endif /* WINDOW_WINDOW_H_ */