// src/Window.cpp #include "Window.h" #include "glad.h" #include // Static storage for user callbacks static std::function g_resizeCallback; static std::function g_keyCallback; Window::Window(int width, int height, const std::string& title) : width_(width), height_(height), title_(title) { Initialize(); } Window::~Window() { Cleanup(); } // Move constructor Window::Window(Window&& other) noexcept : window_(other.window_), width_(other.width_), height_(other.height_), title_(std::move(other.title_)) { other.window_ = nullptr; } // Move assignment Window& Window::operator=(Window&& other) noexcept { if (this != &other) { Cleanup(); window_ = other.window_; width_ = other.width_; height_ = other.height_; title_ = std::move(other.title_); other.window_ = nullptr; } return *this; } void Window::Initialize() { if (!glfwInit()) { std::cerr << "Failed to initialize GLFW\n"; return; } // Create window with OpenGL context glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); window_ = glfwCreateWindow(width_, height_, title_.c_str(), nullptr, nullptr); if (!window_) { std::cerr << "Failed to create GLFW window\n"; glfwTerminate(); return; } glfwMakeContextCurrent(window_); glfwSetFramebufferSizeCallback(window_, FramebufferSizeCallback); glfwSetKeyCallback(window_, KeyCallback); } // Cleans up GLFW window and terminates GLFW if needed void Window::Cleanup() { if (window_) { glfwDestroyWindow(window_); window_ = nullptr; } glfwTerminate(); } void Window::PollEvents() const { glfwPollEvents(); } bool Window::ShouldClose() const { return glfwWindowShouldClose(window_); } void Window::SwapBuffers() const { glfwSwapBuffers(window_); } void Window::SetVSync(bool enable) const { glfwSwapInterval(enable ? 1 : 0); } void Window::SetResizeCallback(std::function callback) { g_resizeCallback = std::move(callback); } void Window::SetKeyCallback(std::function callback) { g_keyCallback = std::move(callback); } // Static GLFW callbacks void Window::FramebufferSizeCallback(GLFWwindow* window, int width, int height) { if (g_resizeCallback) { g_resizeCallback(width, height); } } void Window::KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) { if (g_keyCallback) { g_keyCallback(key, scancode, action, mods); } }