Brenta Engine 1.2
Loading...
Searching...
No Matches
window.cpp
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#include <brenta/logger.hpp>
7#include <brenta/window.hpp>
8#include <brenta/renderer/opengl/framebuffer.hpp>
9
10#include <brenta/drivers/glfw.hpp>
11#include <glad/glad.h>
12
13#include <cstdio>
14
15using namespace brenta;
16
17//
18// Static variables
19//
20
21tenno::shared_ptr<Window::Driver> Window::backend = nullptr;
22tenno::shared_ptr<FrameBuffer> Window::framebuffer = nullptr;
23const std::string Window::subsystem_name = "window";
24Window::Config Window::init_config = {};
25bool Window::initialized = false;
26
27//
28// Subsystem interface
29//
30
31std::expected<void, Subsystem::Error> Window::initialize()
32{
33 if (this->is_initialized()) return {};
34
35 Window::backend = tenno::make_shared<GlfwDriver>();
36 auto ret = Window::backend->initialize(Window::init_config);
37 if (!ret)
38 {
39 ERROR("{}: Failed to initialize window", Window::subsystem_name);
40 return ret;
41 }
42
43 Window::framebuffer = tenno::make_shared<FrameBuffer>();
44 Window::get_driver()->set_dimensions(Window::init_config.width,
45 Window::init_config.height);
46
47 INFO("{}: initialized", Window::subsystem_name);
48 Window::initialized = true;
49 return {};
50}
51
52std::expected<void, Subsystem::Error> Window::terminate()
53{
54 if (!this->is_initialized()) return {};
55
56 if (Window::backend)
57 Window::backend->terminate();
58
59 Window::initialized = false;
60 INFO("{}: terminated", Window::subsystem_name);
61 return {};
62}
63
64std::string Window::name()
65{
66 return Window::subsystem_name;
67}
68
69bool Window::is_initialized()
70{
71 return Window::initialized;
72}
73
74//
75// Member functions
76//
77
78Window &Window::instance()
79{
80 static Window _instance;
81 return _instance;
82}
83
84bool Window::should_close()
85{
86 if (Window::backend)
87 return Window::backend->should_close();
88 return true;
89}
90
91bool Window::is_key_pressed(Key key)
92{
93 if (Window::backend)
94 return Window::backend->is_key_pressed(key);
95 return false;
96}
97
98Time Window::get_time()
99{
100 if (Window::backend)
101 return Window::backend->get_time();
102 return {};
103}
104
105Window::WindowHandle Window::get_window()
106{
107 if (Window::backend)
108 return Window::backend->get_window();
109 return nullptr;
110}
111
112Window::ProcHandle Window::get_proc_address()
113{
114 if (Window::backend)
115 return Window::backend->get_proc_address();
116 return nullptr;
117}
118
119int Window::get_width()
120{
121 if (Window::backend)
122 return Window::backend->get_width();
123 return 0;
124}
125
126int Window::get_height()
127{
128 if (Window::backend)
129 return Window::backend->get_height();
130 return 0;
131}
132
133tenno::shared_ptr<Window::Driver> Window::get_driver()
134{
135 return Window::backend;
136}
137
138void Window::update_dimensions()
139{
140 if (Window::backend)
141 Window::backend->update_dimensions();
142}
143
144void Window::set_dimensions(int width, int height)
145{
146 if (Window::backend)
147 Window::backend->set_dimensions(width, height);
148 return;
149}
150
151void Window::set_mouse_callback(Window::Callback callback)
152{
153 if (Window::backend)
154 Window::backend->set_mouse_callback(callback);
155 return;
156}
157
158void Window::set_size_callback(Window::Callback callback)
159{
160 if (Window::backend)
161 Window::backend->set_size_callback(callback);
162 return;
163}
164
165void Window::set_mouse_capture(bool is_captured)
166{
167 if (Window::backend)
168 Window::backend->set_mouse_capture(is_captured);
169 return;
170}
171
172void Window::close()
173{
174 if (Window::backend)
175 Window::backend->close();
176 return;
177}
178
179void Window::swap_buffers()
180{
181 if (Window::backend)
182 Window::backend->swap_buffers();
183 return;
184}
185
186void Window::poll_events()
187{
188 if (Window::backend)
189 Window::backend->poll_events();
190 return;
191}
192
193void Window::set_key_callback(Window::Callback callback)
194{
195 if (Window::backend)
196 Window::backend->set_key_callback(callback);
197}
198
199void Window::set_mouse_pos_callback(Window::Callback callback)
200{
201 if (Window::backend)
202 Window::backend->set_mouse_pos_callback(callback);
203}
204
205void Window::make_context_current()
206{
207 if (Window::backend)
208 Window::backend->make_context_current();
209 return;
210}
211
212//
213// Builder
214//
215
216Window::Builder &Window::Builder::width(int width)
217{
218 this->conf.width = width;
219 return *this;
220}
221
222Window::Builder &Window::Builder::height(int height)
223{
224 this->conf.height = height;
225 return *this;
226}
227
228Window::Builder &Window::Builder::title(const std::string &title)
229{
230 this->conf.title = title;
231 return *this;
232}
233
234Window::Builder &Window::Builder::capture_mouse()
235{
236 this->conf.capture_mouse = true;
237 return *this;
238}
239
240Window::Builder &Window::Builder::msaa()
241{
242 this->conf.msaa = true;
243 return *this;
244}
245
246Window::Builder &Window::Builder::debug()
247{
248 this->conf.debug = true;
249 return *this;
250}
251
252Window::Builder &Window::Builder::vsync()
253{
254 this->conf.vsync = true;
255 return *this;
256}
257
258Subsystem &Window::Builder::build()
259{
260 Window::init_config = this->conf;
261 return Window::instance();
262}