PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
window_internal.h
1#pragma once
2
3#include "pixelbullet/assets/bitmap.h"
4#include "pixelbullet/input/key_codes.h"
5#include "pixelbullet/window/window_chrome.h"
6
7#include <glm/glm.hpp>
8#include <volk.h>
9
10#include <cstdint>
11#include <functional>
12#include <optional>
13#include <string>
14#include <utility>
15
16struct GLFWimage;
17struct GLFWwindow;
18
19namespace pixelbullet
20{
21class Filesystem;
22class Event;
23class VirtualPath;
24class Window;
26namespace input
27{
28class InputState;
29}
30} // namespace pixelbullet
31
32namespace pixelbullet::window_internal
33{
35{
36 glm::ivec2 framebuffer_size{ 0, 0 };
37 glm::ivec2 position{ 0, 0 };
38 bool focused = false;
39 glm::vec2 content_scale{ 1.0f, 1.0f };
40};
41
43{
44public:
45 virtual ~GlfwApi() = default;
46
47 virtual void AcquireRuntime() = 0;
48 virtual void ReleaseRuntime() noexcept = 0;
49 [[nodiscard]] virtual unsigned int NextWindowId() noexcept = 0;
50 virtual void WindowHint(int hint, int value) = 0;
51 [[nodiscard]] virtual GLFWwindow* CreateWindow(int width, int height, const char* title) = 0;
52 virtual void DestroyWindow(GLFWwindow* window) = 0;
53 virtual void SetWindowUserPointer(GLFWwindow* window, void* pointer) = 0;
54 [[nodiscard]] virtual WindowSnapshot CaptureWindowSnapshot(GLFWwindow* window) = 0;
55 virtual void RegisterCallbacks(GLFWwindow* window) = 0;
56 virtual void PollEvents() noexcept = 0;
57 virtual void SetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images) = 0;
58 [[nodiscard]] virtual const char** GetRequiredInstanceExtensions(uint32_t* count) = 0;
59 [[nodiscard]] virtual VkResult CreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator,
60 VkSurfaceKHR* surface) = 0;
61 virtual void IconifyWindow(GLFWwindow* window) noexcept = 0;
62 virtual void MaximizeWindow(GLFWwindow* window) noexcept = 0;
63 virtual void RestoreWindow(GLFWwindow* window) noexcept = 0;
64 virtual void SetInputMode(GLFWwindow* window, int mode, int value) noexcept = 0;
65 [[nodiscard]] virtual int GetWindowAttrib(GLFWwindow* window, int attrib) const noexcept = 0;
66 [[nodiscard]] virtual int GetKey(GLFWwindow* window, int key) const noexcept = 0;
67};
68
70{
71public:
72 virtual ~WindowChromeApi() = default;
73
74 [[nodiscard]] virtual bool PlatformSupportsCustomChrome() const noexcept = 0;
75 [[nodiscard]] virtual bool AttachCustomChrome(Window& window) = 0;
76 virtual void DetachCustomChrome(Window& window) noexcept = 0;
77 virtual void OnLayoutChanged(Window& window) noexcept = 0;
78 virtual void ShowSystemMenuAt(Window& window, WindowPoint client_point) noexcept = 0;
79};
80
82{
83 [[nodiscard]] static GLFWwindow*& NativeWindow(Window& window) noexcept;
84 [[nodiscard]] static const GLFWwindow* NativeWindow(const Window& window) noexcept;
85 [[nodiscard]] static std::string& Title(Window& window) noexcept;
86 [[nodiscard]] static unsigned int& Width(Window& window) noexcept;
87 [[nodiscard]] static unsigned int& Height(Window& window) noexcept;
88 [[nodiscard]] static bool& Focused(Window& window) noexcept;
89 [[nodiscard]] static bool& Fullscreen(Window& window) noexcept;
90 [[nodiscard]] static glm::ivec2& Size(Window& window) noexcept;
91 [[nodiscard]] static glm::ivec2& FullscreenSize(Window& window) noexcept;
92 [[nodiscard]] static glm::ivec2& Position(Window& window) noexcept;
93 [[nodiscard]] static glm::vec2& ContentScale(Window& window) noexcept;
94 [[nodiscard]] static input::InputState& InputState(Window& window) noexcept;
95 [[nodiscard]] static std::function<void(Event&)>& EventCallback(Window& window) noexcept;
96 [[nodiscard]] static std::function<void(uint32_t)>& FramebufferResizeCallback(Window& window) noexcept;
97 [[nodiscard]] static uint32_t& Id(Window& window) noexcept;
98 [[nodiscard]] static bool& CursorCaptured(Window& window) noexcept;
99 [[nodiscard]] static WindowFrameMode& FrameMode(Window& window) noexcept;
100 [[nodiscard]] static bool& CustomChromeSupported(Window& window) noexcept;
101 [[nodiscard]] static bool& CustomChromeAttached(Window& window) noexcept;
102 [[nodiscard]] static WindowChromeLayout& CustomChromeLayout(Window& window) noexcept;
103};
104
105class ScopedGlfwApiOverride
106{
107public:
108 explicit ScopedGlfwApiOverride(GlfwApi& api) noexcept;
109 ~ScopedGlfwApiOverride();
110
111 ScopedGlfwApiOverride(const ScopedGlfwApiOverride&) = delete;
112 ScopedGlfwApiOverride& operator=(const ScopedGlfwApiOverride&) = delete;
113
114private:
115 GlfwApi* previous_api_ = nullptr;
116};
117
118class ScopedWindowChromeApiOverride
119{
120public:
121 explicit ScopedWindowChromeApiOverride(WindowChromeApi& api) noexcept;
122 ~ScopedWindowChromeApiOverride();
123
124 ScopedWindowChromeApiOverride(const ScopedWindowChromeApiOverride&) = delete;
125 ScopedWindowChromeApiOverride& operator=(const ScopedWindowChromeApiOverride&) = delete;
126
127private:
128 WindowChromeApi* previous_api_ = nullptr;
129};
130
131using IconBitmapLoader = std::function<Bitmap(const Filesystem&, const VirtualPath&)>;
132
133class ScopedIconBitmapLoaderOverride
134{
135public:
136 explicit ScopedIconBitmapLoaderOverride(IconBitmapLoader loader);
137 ~ScopedIconBitmapLoaderOverride();
138
139 ScopedIconBitmapLoaderOverride(const ScopedIconBitmapLoaderOverride&) = delete;
140 ScopedIconBitmapLoaderOverride& operator=(const ScopedIconBitmapLoaderOverride&) = delete;
141
142private:
143 IconBitmapLoader previous_loader_;
144};
145
146[[nodiscard]] GlfwApi& GetGlfwApi();
147[[nodiscard]] WindowChromeApi& GetWindowChromeApi();
148[[nodiscard]] Bitmap LoadIconBitmap(const Filesystem& filesystem, const VirtualPath& icon_path);
149
150void InitializeWindow(Window& window, const ApplicationSpecification& props, bool start_hidden);
151void ShutdownWindow(Window& window) noexcept;
152void PollEvents() noexcept;
153void SetIcon(Window& window, const Filesystem& filesystem, const VirtualPath& icon_path);
154[[nodiscard]] std::pair<const char**, uint32_t> GetInstanceExtensions();
155[[nodiscard]] VkResult CreateSurface(const Window& window, VkInstance instance, const VkAllocationCallbacks* allocator,
156 VkSurfaceKHR* surface);
157void Minimize(Window& window) noexcept;
158void Maximize(Window& window) noexcept;
159void Restore(Window& window) noexcept;
160void RequestClose(Window& window) noexcept;
161void ShowSystemMenuAt(Window& window, WindowPoint client_point) noexcept;
162[[nodiscard]] bool SupportsCustomChrome(const Window& window) noexcept;
163void SetCustomChromeLayout(Window& window, const WindowChromeLayout& layout);
164void ClearCustomChromeLayout(Window& window);
165void SetCursorCaptured(Window& window, bool captured) noexcept;
166[[nodiscard]] bool IsKeyDown(const Window& window, input::KeyCode key) noexcept;
167[[nodiscard]] bool IsMinimized(const Window& window) noexcept;
168[[nodiscard]] bool IsMaximized(const Window& window) noexcept;
169} // namespace pixelbullet::window_internal
A simple Bitmap class that loads and writes images using lodepng.
Definition bitmap.h:17
Definition event.h:72
Definition filesystem.h:16
Definition virtual_path.h:10
Definition window.h:34
Definition input.h:25
Definition window_internal.h:43
Definition window_internal.h:70
Contains configuration options for both the game and the engine.
Definition specification.h:162
Definition window_chrome.h:34
Definition window_chrome.h:28
Definition window_internal.h:82
Definition window_internal.h:35