10#include <entt/signal/dispatcher.hpp>
12#include <SDL_stbimage.h>
32#ifdef GALAXY_WIN_PLATFORM
46 if (SDL_ScreenSaverEnabled())
48 SDL_DisableScreenSaver();
51 SDL_WindowFlags flags = SDL_WINDOW_OPENGL | SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS | SDL_WINDOW_HIDDEN | SDL_WINDOW_HIGH_PIXEL_DENSITY;
54 flags |= SDL_WINDOW_FULLSCREEN;
60 flags |= SDL_WINDOW_MAXIMIZED;
66 flags |= SDL_WINDOW_MOUSE_GRABBED;
71 flags |= SDL_WINDOW_RESIZABLE;
74 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
75 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
76 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
77 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
79 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
80 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
81 SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
86 SDL_GL_SetAttribute(SDL_GL_STEREO, 0);
87 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);
88 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0);
89 SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
90 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
91 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 6);
92 SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG | SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);
93 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
94 SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 0);
95 SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1);
107 if (gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress))
110 SDL_SetWindowAlwaysOnTop(
m_window,
false);
112 SDL_SetWindowFocusable(
m_window,
true);
113 SDL_SetWindowFullscreenMode(
m_window,
nullptr);
114 SDL_SetWindowKeyboardGrab(
m_window,
false);
115 SDL_SetWindowMinimumSize(
m_window, 640, 360);
116 SDL_SetWindowPosition(
m_window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
131 glEnable(GL_DEBUG_OUTPUT);
132 glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
134 glDebugMessageCallback(
135 [](GLenum source, GLenum type, GLuint
id, GLenum severity, GLsizei length,
const GLchar* message,
const void* userParam) {
144 case GL_DEBUG_SEVERITY_HIGH:
147 case GL_DEBUG_SEVERITY_MEDIUM:
150 case GL_DEBUG_SEVERITY_LOW:
161 glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0,
nullptr, GL_FALSE);
164 glDisable(GL_FRAMEBUFFER_SRGB);
165 glDisable(GL_CULL_FACE);
166 glDisable(GL_SCISSOR_TEST);
167 glDisable(GL_MULTISAMPLE);
169 glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
170 glEnable(GL_PROGRAM_POINT_SIZE);
171 glEnable(GL_DEPTH_TEST);
172 glEnable(GL_STENCIL_TEST);
177 glDepthFunc(GL_LEQUAL);
178 glBlendEquation(GL_FUNC_ADD);
179 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
219 case SDL_EVENT_WINDOW_CLOSE_REQUESTED:
220 case SDL_EVENT_WINDOW_DESTROYED:
225 case SDL_EVENT_LOCALE_CHANGED:
229 case SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED:
230 case SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED:
236 case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED:
240 case SDL_EVENT_WINDOW_RESIZED:
241 case SDL_EVENT_WINDOW_MAXIMIZED:
242 case SDL_EVENT_WINDOW_RESTORED:
243 case SDL_EVENT_WINDOW_ENTER_FULLSCREEN:
244 case SDL_EVENT_WINDOW_LEAVE_FULLSCREEN:
256 dispatcher.trigger(wr);
260 case SDL_EVENT_WINDOW_DISPLAY_CHANGED:
265 case SDL_EVENT_WINDOW_MOUSE_ENTER:
266 case SDL_EVENT_WINDOW_FOCUS_GAINED:
270 case SDL_EVENT_WINDOW_MOUSE_LEAVE:
271 case SDL_EVENT_WINDOW_FOCUS_LOST:
275 case SDL_EVENT_KEY_DOWN:
280 .m_scancode =
m_events.key.scancode,
288 dispatcher.trigger(kp);
292 case SDL_EVENT_KEY_UP:
297 .m_scancode =
m_events.key.scancode,
305 dispatcher.trigger(kr);
309 case SDL_EVENT_TEXT_INPUT:
320 dispatcher.trigger(ki);
324 case SDL_EVENT_MOUSE_MOTION:
336 dispatcher.trigger(mm);
340 case SDL_EVENT_MOUSE_BUTTON_DOWN:
352 dispatcher.trigger(mp);
356 case SDL_EVENT_MOUSE_BUTTON_UP:
368 dispatcher.trigger(mr);
372 case SDL_EVENT_MOUSE_WHEEL:
379 .m_direction =
m_events.wheel.direction,
380 .m_mouse_x =
m_events.wheel.mouse_x,
381 .m_mouse_y =
m_events.wheel.mouse_y,
382 .m_total_x =
m_events.wheel.integer_x,
383 .m_total_y =
m_events.wheel.integer_y
387 dispatcher.trigger(mw);
391 case SDL_EVENT_DROP_BEGIN:
402 case SDL_EVENT_JOYSTICK_AXIS_MOTION:
403 case SDL_EVENT_JOYSTICK_BALL_MOTION:
404 case SDL_EVENT_JOYSTICK_HAT_MOTION:
405 case SDL_EVENT_JOYSTICK_BUTTON_DOWN:
406 case SDL_EVENT_JOYSTICK_BUTTON_UP:
407 case SDL_EVENT_JOYSTICK_REMOVED:
408 case SDL_EVENT_JOYSTICK_BATTERY_UPDATED:
409 case SDL_EVENT_JOYSTICK_UPDATE_COMPLETE:
414 case SDL_EVENT_GAMEPAD_AXIS_MOTION:
415 case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
416 case SDL_EVENT_GAMEPAD_BUTTON_UP:
417 case SDL_EVENT_GAMEPAD_REMOVED:
418 case SDL_EVENT_GAMEPAD_REMAPPED:
419 case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN:
420 case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION:
421 case SDL_EVENT_GAMEPAD_TOUCHPAD_UP:
422 case SDL_EVENT_GAMEPAD_SENSOR_UPDATE:
423 case SDL_EVENT_GAMEPAD_UPDATE_COMPLETE:
424 case SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED:
429 case SDL_EVENT_FINGER_DOWN:
430 case SDL_EVENT_FINGER_UP:
431 case SDL_EVENT_FINGER_MOTION:
432 case SDL_EVENT_FINGER_CANCELED:
437 case SDL_EVENT_PEN_PROXIMITY_IN:
438 case SDL_EVENT_PEN_PROXIMITY_OUT:
439 case SDL_EVENT_PEN_DOWN:
440 case SDL_EVENT_PEN_UP:
441 case SDL_EVENT_PEN_BUTTON_DOWN:
442 case SDL_EVENT_PEN_BUTTON_UP:
443 case SDL_EVENT_PEN_MOTION:
444 case SDL_EVENT_PEN_AXIS:
499 SDL_FlashWindow(
m_window, SDL_FlashOperation::SDL_FLASH_UNTIL_FOCUSED);
504 SDL_SetWindowSize(m_window, width, height);
510 SDL_SetWindowFullscreen(m_window, fullscreen);
516 SDL_SetWindowProgressValue(m_window, std::clamp(progress, 0.0f, 1.0f));
522 SDL_SetWindowTitle(
m_window, title.c_str());
529 auto& fs = entt::locator<VirtualFileSystem>::value();
531 auto data = fs.read_binary(icon);
534 auto surface = STBIMG_LoadFromMemory(data.data(),
static_cast<int>(data.size()));
537 SDL_SetWindowIcon(m_window, surface);
544 SDL_DestroySurface(surface);
570 auto vec2 = glm::ivec2();
571 SDL_GetWindowSizeInPixels(
m_window, &vec2.x, &vec2.y);
587#ifdef GALAXY_WIN_PLATFORM
#define GALAXY_INFO
Log.hpp galaxy.
#define GALAXY_LOG(level, msg,...)
#define GALAXY_DISABLE_WARNING_POP
#define GALAXY_DISABLE_WARNING(x)
#define GALAXY_UNUSED(var)
Pragma.hpp galaxy.
#define GALAXY_DISABLE_WARNING_PUSH
Macro for windows platform detection.
Physical keyboard device and state management.
Physical mouse device and state management.
void hide_cursor() const noexcept
Hide cursor.
void show_cursor() const noexcept
Show cursor.
void set_cursor_custom(const std::string &cursor, const glm::ivec2 &hotspot) noexcept
Set custom cursor texture.
void bind_window(SDL_Window *window) noexcept
Bind SDL3 window to this object.
SDL_Window * m_window
SDL window handle.
void set_fullscreen(const bool fullscreen) const noexcept
Toggle fullscreen.
SDL_Window * handle() const noexcept
Get SDL window pointer.
SDL_GLContext context() const noexcept
Get SDL GL context.
void swap() const noexcept
Swap backbuffer with window framebuffer.
bool is_open() const noexcept
Is the window open or closed.
void raise() const noexcept
Raise the window to be on top of other windows.
void resize(const int width, const int height) const noexcept
Resizes window.
Window()
Window creation constructor.
void maximize() const noexcept
Maximize window.
Keyboard & get_keyboard() noexcept
Get keyboard.
void append_title(const std::string &append)
Append to window title.
Mouse m_mouse
Mouse assigned to window.
Keyboard m_keyboard
Keyboard assigned to window.
void close() noexcept
Close window.
void set_taskbar_progress(const float progress) noexcept
Sets the taskbar icon progress overlay.
bool m_open
Window state flag.
glm::ivec2 get_pixel_size() noexcept
Get window size in pixels.
void hide() const noexcept
Hide window.
void process_events(entt::dispatcher &dispatcher)
Handles all events for the window in this frame and sends to the dispatcher.
SDL_GLContext m_context
SDL OpenGL context.
void show() const noexcept
Show window.
void minimize() const noexcept
Minimize window.
SDL_Event m_events
Core event data.
Mouse & get_mouse() noexcept
Get mouse cursor.
void set_icon(const std::string &icon) noexcept
Set window icon.
void request_attention() const noexcept
Flash window on taskbar for user attention.
void restore() const noexcept
Restore window to previous *mize state.
Keys
Enum class representing keys.
KeyMods
Enum class for key modifiers.
MouseButton
Enum class representing mouse buttons.
POD tag to allow a function to accept a dispatched focus gained event.
Contains data on key that was pressed.
Contains data on key that was released.
POD tag to allow a function to accept a dispatched focus lost event.
Contains data relating to a mouse moved event.
Contains data relating to a mouse pressed event.
Contains data relating to a mouse released event.
Contains mouse wheel movement data.
static auto window_height() noexcept -> int
Window creation height.
static auto fullscreen() noexcept -> bool
Is window started fullscreen.
static auto vsync() noexcept -> bool
Vsync control.
static auto window_width() noexcept -> int
Window creation width.
static auto window_border() noexcept -> bool
Controls if a window has a border around it (including titlebar).
static auto window_resizable() noexcept -> bool
Is the window resizable.
static auto maximized() noexcept -> bool
Is window started maximized?
static auto title() noexcept -> const std::string &
Game title.
static auto cursor_show() noexcept -> bool
Is the mouse cursor visible or not.
static auto cursor_hotspot() noexcept -> const glm::ivec2 &
Cursor selector point (hotspot).
static auto mouse_grabbed() noexcept -> bool
Is the cursor grabbed.
static auto cursor_icon() noexcept -> const std::string &
Cursor texture file in vfs.
Blank "Tag" class/type to signal the window is being closed.
New width and height of window being resized.