MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
GlfwWindow.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#ifdef GLFW_BACKEND
7
8#include <GLFW/glfw3.h>
9
10namespace MayaFlux::Core {
11/**
12 * @class GlfwWindow
13 * @brief Platform-agnostic window wrapper
14 *
15 * Wraps a GLFW window and provides a unified interface
16 * for window management, event handling, and state tracking.
17 */
18class MAYAFLUX_API GlfwWindow : public Window {
19public:
20 /**
21 * @brief Creates a window with the given configuration
22 * @param create_info Window creation parameters
23 * @param surface_info Graphics surface parameters
24 * @param api Requested graphics API
25 * @param pre_init_config Optional pre-initialization configuration
26 */
27 GlfwWindow(const WindowCreateInfo& create_info,
28 const GraphicsSurfaceInfo& surface_info, GlobalGraphicsConfig::GraphicsApi api, GlfwPreInitConfig pre_init_config = {});
29
30 ~GlfwWindow() override;
31
32 GlfwWindow(const GlfwWindow&) = delete;
33 GlfwWindow& operator=(const GlfwWindow&) = delete;
34 GlfwWindow(GlfwWindow&&) noexcept;
35 GlfwWindow& operator=(GlfwWindow&&) noexcept;
36
37 void show() override;
38
39 void hide() override;
40
41 void destroy() override;
42
43 [[nodiscard]] bool should_close() const override;
44
45 [[nodiscard]] inline const WindowState& get_state() const override
46 {
47 return m_state;
48 }
49
50 [[nodiscard]] inline const WindowCreateInfo& get_create_info() const override
51 {
52 return m_create_info;
53 }
54
55 inline void set_input_config(const InputConfig& config) override
56 {
57 m_input_config = config;
58 }
59
60 [[nodiscard]] inline const InputConfig& get_input_config() const override
61 {
62 return m_input_config;
63 }
64
65 void set_event_callback(WindowEventCallback callback) override;
66
67 [[nodiscard]] void* get_native_handle() const override;
68
69 [[nodiscard]] void* get_native_display() const override { return nullptr; }
70
71 [[nodiscard]] inline GLFWwindow* get_glfw_handle() const { return m_window; }
72
73 void set_title(const std::string& title) override;
74
75 void set_size(uint32_t width, uint32_t height) override;
76
77 void set_position(uint32_t x, uint32_t y) override;
78
79 void set_color(const std::array<float, 4>& color) override;
80
81 Vruta::WindowEventSource& get_event_source() override { return m_event_source; }
82 [[nodiscard]] const Vruta::WindowEventSource& get_event_source() const override { return m_event_source; }
83
84 /**
85 * @brief Check if window is registered with graphics subsystem
86 */
87 [[nodiscard]] bool is_graphics_registered() const override { return m_graphics_registered.load(); }
88
89 /**
90 * @brief Mark window as registered/unregistered with graphics
91 * Called by GraphicsSubsystem during register/unregister
92 */
93 void set_graphics_registered(bool registered) override;
94
95 /**
96 * @brief Register a VKBuffer as rendering to this window
97 * @param buffer Buffer that will render to this window
98 *
99 * Used for tracking and queries. Does not affect rendering directly.
100 */
101 void register_rendering_buffer(std::shared_ptr<Buffers::VKBuffer> buffer) override;
102
103 /**
104 * @brief Unregister a VKBuffer from this window
105 * @param buffer Buffer to unregister
106 */
107 void unregister_rendering_buffer(std::shared_ptr<Buffers::VKBuffer> buffer) override;
108
109 /**
110 * @brief Track a secondary command buffer for this frame
111 * @param cmd_id Command buffer ID that contains draw commands for this window
112 *
113 * Called by RenderProcessor after recording. PresentProcessor queries these
114 * to know which secondary buffers to execute.
115 */
116 void track_frame_command(uint64_t cmd_id) override;
117
118 /**
119 * @brief Get all command buffers recorded for this frame
120 * @return Vector of command buffer IDs
121 *
122 * Called by PresentProcessor to collect secondary buffers for execution.
123 */
124 [[nodiscard]] const std::vector<uint64_t>& get_frame_commands() const override;
125
126 /**
127 * @brief Clear tracked commands for this frame
128 *
129 * Called after presenting to reset for next frame.
130 */
131 void clear_frame_commands() override;
132
133 /**
134 * @brief Get all VKBuffers currently rendering to this window
135 * @return Vector of buffers (weak_ptr to avoid ownership issues)
136 */
137 [[nodiscard]] std::vector<std::shared_ptr<Buffers::VKBuffer>> get_rendering_buffers() const override;
138
139 [[nodiscard]] bool is_capture_enabled() const override { return m_capture_enabled.load(std::memory_order_acquire); }
140 void set_capture_enabled(bool enabled) override { m_capture_enabled.store(enabled, std::memory_order_release); }
141
142private:
143 GLFWwindow* m_window = nullptr;
144 WindowCreateInfo m_create_info;
145 WindowState m_state;
146 InputConfig m_input_config;
147 WindowEventCallback m_event_callback;
148
149 std::atomic<bool> m_graphics_registered { false };
150 std::atomic<bool> m_capture_enabled { false };
151
152 Vruta::WindowEventSource m_event_source;
153
154 std::vector<std::weak_ptr<Buffers::VKBuffer>> m_rendering_buffers;
155 std::vector<uint64_t> m_frame_commands;
156 mutable std::mutex m_render_tracking_mutex;
157
158 void configure_window_hints(const GraphicsSurfaceInfo& surface_info, GlobalGraphicsConfig::GraphicsApi api) const;
159 void setup_callbacks();
160
161 static void glfw_window_size_callback(GLFWwindow* window, int width, int height);
162 static void glfw_window_close_callback(GLFWwindow* window);
163 static void glfw_window_focus_callback(GLFWwindow* window, int focused);
164 static void glfw_framebuffer_size_callback(GLFWwindow* window, int width, int height);
165 static void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods);
166 static void glfw_cursor_pos_callback(GLFWwindow* window, double xpos, double ypos);
167 static void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mods);
168 static void glfw_scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
169};
170}
171
172#endif // GLFW_BACKEND
uint32_t width
Definition Decoder.cpp:59
std::function< void(const WindowEvent &)> WindowEventCallback