/* * Copyright (C) 2023 Christopher J. Howard * * This file is part of Antkeeper source code. * * Antkeeper source code is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Antkeeper source code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Antkeeper source code. If not, see . */ #ifndef ANTKEEPER_APPLICATION_HPP #define ANTKEEPER_APPLICATION_HPP #include "event/publisher.hpp" #include "gl/rasterizer.hpp" #include "input/device-manager.hpp" #include "input/event.hpp" #include "input/gamepad.hpp" #include "input/keyboard.hpp" #include "input/mouse.hpp" #include "utility/fundamental-types.hpp" #include #include #include // Forward declarations typedef struct SDL_Window SDL_Window; typedef void* SDL_GLContext; /** * */ class application { public: /** * Constructs and initializes an application. */ application ( const std::string& window_title, int window_x, int window_y, int window_w, int window_h, bool maximized, bool fullscreen, bool v_sync ); /** * Destructs an application. */ ~application(); /** * Requests the application to close. */ void close(); /** * Sets the application window's title. * * @param title Window title. */ void set_title(const std::string& title); /** * Sets the cursor visibility. * * @param visible `true` if the cursor should be visible, `false` otherwise. */ void set_cursor_visible(bool visible); /** * Enables or disables relative mouse mode, in which only relative mouse movement events are generated. * * @param enabled `true` if relative mouse mode should be enabled, `false` otherwise. */ void set_relative_mouse_mode(bool enabled); /** * Resizes the application window. * * @param width Width of the window, in pixels. * @param height Height of the window, in pixels. */ void resize_window(int width, int height); /** * Puts the application window into either fullscreen or window mode. * * @param fullscreen `true` if the window should be fullscreen, `false` if it should be window. */ void set_fullscreen(bool fullscreen); /** * Enables or disables v-sync mode. * * @param v_sync `true` if v-sync should be enabled, `false` otherwise. */ void set_v_sync(bool v_sync); void set_window_opacity(float opacity); void swap_buffers(); void show_window(); void hide_window(); void add_game_controller_mappings(const void* mappings, std::size_t size); /// Returns the dimensions of the current display. [[nodiscard]] const int2& get_display_size() const; /// Returns the DPI of the display. [[nodiscard]] float get_display_dpi() const; /// Returns the position of the window when not maximized or fullscreen. [[nodiscard]] const int2& get_windowed_position() const; /// Returns the dimensions of the window when not maximized or fullscreen. [[nodiscard]] const int2& get_windowed_size() const; /// Returns the dimensions of the window's drawable viewport. [[nodiscard]] const int2& get_viewport_size() const; /// Returns `true` if the window is maximized, `false` otherwise. [[nodiscard]] bool is_maximized() const; /// Returns `true` if the window is in fullscreen mode, `false` otherwise. [[nodiscard]] bool is_fullscreen() const; /// Returns `true` if the v-sync is enabled, `false` otherwise. [[nodiscard]] bool get_v_sync() const; /// Returns the rasterizer for the window. [[nodiscard]] gl::rasterizer* get_rasterizer(); void process_events(); [[nodiscard]] bool was_closed() const; /** * Returns the input device manager. */ /// @{ [[nodiscard]] inline const input::device_manager& get_device_manager() const noexcept { return device_manager; } [[nodiscard]] inline input::device_manager& get_device_manager() noexcept { return device_manager; } /// @} /// Returns the channel through which window closed events are published. [[nodiscard]] inline event::channel& get_window_closed_channel() noexcept { return window_closed_publisher.channel(); } /// Returns the channel through which window focus changed events are published. [[nodiscard]] inline event::channel& get_window_focus_changed_channel() noexcept { return window_focus_changed_publisher.channel(); } /// Returns the channel through which window moved events are published. [[nodiscard]] inline event::channel& get_window_moved_channel() noexcept { return window_moved_publisher.channel(); } /// Returns the channel through which window resized events are published. [[nodiscard]] inline event::channel& get_window_resized_channel() noexcept { return window_resized_publisher.channel(); } /// Returns the channel through which window maximized events are published. [[nodiscard]] inline event::channel& get_window_maximized_channel() noexcept { return window_maximized_publisher.channel(); } /// Returns the channel through which window restored events are published. [[nodiscard]] inline event::channel& get_window_restored_channel() noexcept { return window_restored_publisher.channel(); } /// Returns the channel through which window minimized events are published. [[nodiscard]] inline event::channel& get_window_minimized_channel() noexcept { return window_minimized_publisher.channel(); } private: void window_moved(); void window_resized(); bool closed; bool maximized; bool fullscreen; bool v_sync; bool cursor_visible; int2 display_size; float display_dpi; int2 windowed_position; int2 windowed_size; int2 viewport_size; int2 mouse_position; SDL_Window* sdl_window; SDL_GLContext sdl_gl_context; gl::rasterizer* rasterizer; // Input devices input::device_manager device_manager; input::keyboard keyboard; input::mouse mouse; std::unordered_map gamepad_map; event::publisher window_closed_publisher; event::publisher window_focus_changed_publisher; event::publisher window_moved_publisher; event::publisher window_resized_publisher; event::publisher window_maximized_publisher; event::publisher window_restored_publisher; event::publisher window_minimized_publisher; }; inline const int2& application::get_display_size() const { return display_size; } inline float application::get_display_dpi() const { return display_dpi; } inline const int2& application::get_windowed_position() const { return windowed_position; } inline const int2& application::get_windowed_size() const { return windowed_size; } inline const int2& application::get_viewport_size() const { return viewport_size; } inline bool application::is_maximized() const { return maximized; } inline bool application::is_fullscreen() const { return fullscreen; } inline bool application::get_v_sync() const { return v_sync; } inline gl::rasterizer* application::get_rasterizer() { return rasterizer; } inline bool application::was_closed() const { return closed; } #endif // ANTKEEPER_APPLICATION_HPP