#include #include #include #include #include #include #include #include namespace Light { Scope Window::Create(std::function callback) { return CreateScope(callback); } lWindow::lWindow(std::function callback) : m_handle(nullptr) , m_event_callback(callback) { // init glfw ASSERT(glfwInit(), "lWindow::lWindow: failed to initialize 'glfw'"); // create window glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); m_handle = glfwCreateWindow(1u, 1u, "", nullptr, nullptr); ASSERT(m_handle, "lWindow::lWindow: failed to create 'GLFWwindow'"); // bind event stuff glfwSetWindowUserPointer(m_handle, &m_event_callback); BindGlfwEvents(); // create graphics context m_graphics_context = GraphicsContext::Create(GraphicsAPI::OpenGL, m_handle); ASSERT(m_graphics_context, "lWindow::lWindow: failed to create 'GraphicsContext'"); } lWindow::~lWindow() { glfwDestroyWindow(m_handle); } void lWindow::PollEvents() { glfwPollEvents(); } void lWindow::OnEvent(const Event &event) { switch (event.GetEventType()) { /* closed */ case EventType::WindowClosed: b_Closed = true; break; /* resized */ case EventType::WindowResized: OnWindowResize((const WindowResizedEvent &)event); break; } } void lWindow::OnWindowResize(const WindowResizedEvent &event) { m_properties.size = event.GetSize(); } void lWindow:: SetProperties(const WindowProperties &properties, bool overrideVisibility /* = false */) { // save the visibility status and re-assign if 'overrideVisibility' is false bool visible = overrideVisibility ? properties.visible : m_properties.visible; m_properties = properties; m_properties.visible = visible; // set properties SetTitle(properties.title); SetSize(properties.size); SetVSync(properties.vsync); SetVisibility(visible); } void lWindow::SetTitle(const std::string &title) { m_properties.title = title; glfwSetWindowTitle(m_handle, title.c_str()); } void lWindow::SetSize(const glm::uvec2 &size, bool additive /* = false */) { m_properties.size.x = size.x == 0u ? m_properties.size.x : additive ? m_properties.size.x + size.x : size.x; m_properties.size.y = size.y == 0u ? m_properties.size.y : additive ? m_properties.size.y + size.y : size.y; glfwSetWindowSize(m_handle, size.x, size.y); } void lWindow::SetVSync(bool vsync, bool toggle /* = false */) { m_properties.vsync = toggle ? !m_properties.vsync : vsync; glfwSwapInterval(m_properties.vsync); } void lWindow::SetVisibility(bool visible, bool toggle) { m_properties.visible = toggle ? !m_properties.visible : visible; if (m_properties.visible) glfwShowWindow(m_handle); else glfwHideWindow(m_handle); } void lWindow::BindGlfwEvents() { //============================== MOUSE_EVENTS ==============================// /* cursor position */ glfwSetCursorPosCallback(m_handle, [](GLFWwindow *window, double xpos, double ypos) { std::function callback = *(std::function *) glfwGetWindowUserPointer(window); MouseMovedEvent event(xpos, ypos); callback(event); }); /* mouse button */ glfwSetMouseButtonCallback(m_handle, [](GLFWwindow *window, int button, int action, int mods) { std::function callback = *(std::function *) glfwGetWindowUserPointer(window); if (action == GLFW_PRESS) { ButtonPressedEvent event(button); callback(event); } else if (action == GLFW_RELEASE) { ButtonReleasedEvent event(button); callback(event); } }); /* scroll */ glfwSetScrollCallback(m_handle, [](GLFWwindow *window, double xoffset, double yoffset) { std::function callback = *(std::function *) glfwGetWindowUserPointer(window); WheelScrolledEvent event(yoffset); callback(event); }); //============================== MOUSE_EVENTS ==============================// //============================== KEYBOARD_EVENTS ==============================// /* key */ glfwSetKeyCallback( m_handle, [](GLFWwindow *window, int key, int scancode, int action, int mods) { std::function callback = *(std::function *) glfwGetWindowUserPointer(window); if (action == GLFW_PRESS) { KeyPressedEvent event(key); callback(event); } else if (action == GLFW_RELEASE) { KeyReleasedEvent event(key); callback(event); } } ); /* char */ glfwSetCharCallback(m_handle, [](GLFWwindow *window, unsigned int character) { std::function callback = *(std::function *) glfwGetWindowUserPointer(window); SetCharEvent event(character); callback(event); }); //============================== KEYBOARD_EVENTS ==============================// //============================== WINDOW_EVENTS ==============================// /* window position */ glfwSetWindowPosCallback(m_handle, [](GLFWwindow *window, int xpos, int ypos) { std::function callback = *(std::function *) glfwGetWindowUserPointer(window); WindowMovedEvent event(xpos, ypos); callback(event); }); /* window size */ glfwSetWindowSizeCallback(m_handle, [](GLFWwindow *window, int width, int height) { std::function callback = *(std::function *) glfwGetWindowUserPointer(window); WindowResizedEvent event(width, height); callback(event); }); /* window close */ glfwSetWindowCloseCallback(m_handle, [](GLFWwindow *window) { std::function callback = *(std::function *) glfwGetWindowUserPointer(window); WindowClosedEvent event; callback(event); }); /* window focus */ glfwSetWindowFocusCallback(m_handle, [](GLFWwindow *window, int focus) { std::function callback = *(std::function *) glfwGetWindowUserPointer(window); if (focus == GLFW_TRUE) { WindowGainFocusEvent event; callback(event); } else { WindowLostFocusEvent event; callback(event); } }); //============================== WINDOW_EVENTS ==============================// } } // namespace Light