#include #include "../Common/Sizes.hpp" #include "../Common/Assert.hpp" #include "../ThreadRole.hpp" #include "Window.hpp" namespace MC::GFX { Window::Window(const Char* title, U32 width, U32 height) { ASSERT_MAIN_THREAD(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_DOUBLEBUFFER, GL_TRUE); m_window = glfwCreateWindow(width, height, title, nullptr, nullptr); if (m_window == nullptr) { throw std::runtime_error("Failed to create window."); } glfwMakeContextCurrent(m_window); glfwSetInputMode(m_window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); } Window::~Window() { ASSERT_MAIN_THREAD(); glfwDestroyWindow(m_window); } Bool Window::should_close() const { return glfwWindowShouldClose(m_window); } GLFWwindow* Window::get() const { return m_window; } void Window::close() { glfwSetWindowShouldClose(m_window, true); } Vector<2> Window::mouse_delta() { return m_mouse.update(m_window); } Bool Window::key(I32 key, I32 type) const { return glfwGetKey(m_window, key) == type; } Bool Window::mouse(I32 key, I32 type) const { return glfwGetMouseButton(m_window, key) == type; } void Window::start_render() { glfwSwapBuffers(m_window); } void Window::poll_events() { ASSERT_MAIN_THREAD(); glfwPollEvents(); } void Window::on_size_change(void (callback)(GLFWwindow*, I32, I32)) { glfwSetFramebufferSizeCallback(m_window, callback); } void Window::attach() const { glfwMakeContextCurrent(m_window); } void Window::detach() const { ASSERT(glfwGetCurrentContext() == m_window, "Cannot detach window that is not current"); glfwMakeContextCurrent(nullptr); } }