Toast Engine
Loading...
Searching...
No Matches
ui_system.hpp
Go to the documentation of this file.
1
8
9#pragma once
10#include "assets.hpp"
11
12#include <cstdint>
13#include <functional>
14#include <glm/glm.hpp>
15#include <memory>
16#include <mutex>
17#include <optional>
18#include <string>
19#include <string_view>
20#include <toast/events/listener.hpp>
21#include <toast/renderer/vulkan_renderer.hpp>
22#include <unordered_map>
23#include <unordered_set>
24#include <vector>
25
26// NOLINTNEXTLINE(readability-identifier-naming)
27namespace Rml {
28class Context;
29}
30
31namespace renderer {
32class VulkanCore;
33}
34
35namespace toast {
36class Node;
37class Panel;
38class Panel3D;
39}
40
41// NOLINTNEXTLINE(readability-identifier-naming)
43
44namespace ui {
45
46class UIFileInterface;
47class UIInputRouter;
49
50class UISystem {
51public:
52 UISystem() noexcept;
53 ~UISystem() noexcept;
54
55 [[nodiscard]]
56 static auto get() noexcept -> UISystem&;
57 [[nodiscard]]
58 static auto exists() noexcept -> bool;
59
60 void tick() noexcept;
61
64 void buildDrawFrame(renderer::VulkanRenderer::RenderFrame& frame);
65
66 [[nodiscard]]
67 auto createContext(std::string_view name, glm::ivec2 dimensions, std::optional<float> fixed_dp_ratio = std::nullopt)
68 -> Rml::Context*;
69 void destroyContext(Rml::Context* context);
70
71 auto loadFontFace(std::string_view uri, bool fallback = false) -> bool;
72 auto loadFontFace(const assets::Handle<assets::Font>& font, bool fallback = false) -> bool;
73
74 void registerGlobalStyle(const assets::Handle<assets::UIStyle>& style);
75 void unregisterGlobalStyle(const assets::Handle<assets::UIStyle>& style);
76
77 [[nodiscard]]
78 auto globalStyleUris() const -> std::vector<std::string>;
79 void registerGlobalScheme(const assets::Handle<assets::ColorScheme>& scheme);
80 void unregisterGlobalScheme(const assets::Handle<assets::ColorScheme>& scheme);
81
82 [[nodiscard]]
83 auto colorFromSchemes(std::string_view name) const -> std::optional<glm::vec4>;
84 [[nodiscard]]
85 auto colorHex(std::string_view name) const -> std::optional<std::string>;
86
88 std::vector<const assets::Localization*> texts;
89 std::vector<const assets::ImageLocalization*> images;
90 const assets::ColorScheme* color_scheme = nullptr;
91 };
92
93 void pushLocalizationScope(LocalizationScope scope);
94 void popLocalizationScope();
95
96 void registerGlobalLocalization(const assets::Handle<assets::Localization>& loc);
97 void unregisterGlobalLocalization(const assets::Handle<assets::Localization>& loc);
98 void registerGlobalImageLocalization(const assets::Handle<assets::ImageLocalization>& loc);
99 void unregisterGlobalImageLocalization(const assets::Handle<assets::ImageLocalization>& loc);
100
101 [[nodiscard]]
102 auto language() const -> const std::string& {
103 return m_language;
104 }
105
106 void setLanguage(std::string language);
107 void reloadAllDocuments();
108
109 [[nodiscard]]
110 auto translate(std::string_view input) const -> std::optional<std::string>;
111 [[nodiscard]]
112 auto lookupLocalizationRaw(std::string_view id) const -> std::optional<std::string>;
113
114 [[nodiscard]]
115 auto localizedImage(std::string_view id) const -> std::string;
116
118 void deferSetup(toast::Node* owner, std::function<void()> setup);
120 void runDeferredSetup(toast::Node* owner);
121 void cancelDeferredSetup(toast::Node* owner);
122
124 [[nodiscard]]
125 static auto onUIThread() -> bool;
126
127 // Panels register themselves on init
128 void registerPanel(toast::Panel* panel);
129 void unregisterPanel(toast::Panel* panel);
130 void registerWorldPanel(toast::Panel3D* panel);
131 void unregisterWorldPanel(toast::Panel3D* panel);
132 void registerContextOwner(Rml::Context* context, toast::Node* owner);
133 void unregisterContextOwner(Rml::Context* context);
134
135 [[nodiscard]]
136 auto ownerForContext(Rml::Context* context) const -> toast::Node*;
137
138 [[nodiscard]]
139 auto panels() -> const std::vector<toast::Panel*>& {
140 return m_panels;
141 }
142
143 [[nodiscard]]
144 auto worldPanels() -> const std::vector<toast::Panel3D*>& {
145 return m_world_panels;
146 }
147
148 void applyDpRatio(float ratio);
149 void setSDLWindow(void* window);
150
151 [[nodiscard]]
152 auto renderInterface() -> RenderInterface_VK* {
153 return m_render_interface.get();
154 }
155
156private:
157 [[nodiscard]]
158 auto currentLanguage() const -> std::string;
159
160 static inline UISystem* instance = nullptr;
161
162 std::unique_ptr<UIFileInterface> m_file_interface;
163 std::unique_ptr<UISystemInterface> m_system_interface;
164 std::unique_ptr<RenderInterface_VK> m_render_interface;
165 std::unique_ptr<UIInputRouter> m_input_router;
166 event::Listener m_asset_listener;
167
168 float m_dp_ratio = 1.0f;
169
170 uint64_t m_next_context_id = 1;
171 uint64_t m_frame_counter = 0;
172
173 std::vector<toast::Panel*> m_panels;
174 std::vector<toast::Panel3D*> m_world_panels;
176 std::vector<Rml::Context*> m_screen_contexts;
177 std::unordered_map<Rml::Context*, toast::Node*> m_context_owners;
178 std::unordered_set<Rml::Context*> m_display_density_contexts;
179
180 std::vector<assets::Handle<assets::UIStyle>> m_global_styles;
181 std::vector<assets::Handle<assets::ColorScheme>> m_global_schemes;
182 std::unordered_map<uint64_t, size_t> m_global_style_refs;
183 std::unordered_map<uint64_t, size_t> m_global_scheme_refs;
184 std::unordered_set<std::string> m_loaded_fonts;
185
186 std::string m_language;
187 std::vector<assets::Handle<assets::Localization>> m_global_localizations;
188 std::vector<assets::Handle<assets::ImageLocalization>> m_global_image_localizations;
189 std::unordered_map<uint64_t, size_t> m_global_localization_refs;
190 std::unordered_map<uint64_t, size_t> m_global_image_localization_refs;
191 std::vector<LocalizationScope> m_localization_stack;
192
193 bool m_documents_reload_pending = false;
194 bool m_stylesheet_cache_dirty = false;
195
197 std::mutex m_deferred_mutex;
198 std::vector<std::pair<toast::Node*, std::function<void()>>> m_deferred_setups;
199};
200
201}
Definition rmlui_renderer_vk.h:100
Definition color_scheme.hpp:19
Type-safe smart pointer for assets.
Definition core_types.hpp:149
Definition vulkan_core.hpp:48
Definition node.hpp:81
Definition panel_3d.hpp:27
Definition panel.hpp:27
RmlUi file interface backed by the engine VFS.
Definition ui_file_interface.hpp:27
Definition ui_input.hpp:15
Definition ui_system_interface.hpp:20
void runDeferredSetup(toast::Node *owner)
Runs the setup deferred for owner when called on the tick thread.
Definition ui_system.cpp:625
void initializeRenderer(const renderer::VulkanCore &core)
Definition ui_system.cpp:69
void deferSetup(toast::Node *owner, std::function< void()> setup)
For panels initialized on a World::loadNode or World::spawn worker since RmlUi is not thread safe.
Definition ui_system.cpp:620
static auto onUIThread() -> bool
The engine tick thread where RmlUi may be used.
Definition ui_system.cpp:644
Definition vulkan_renderer.hpp:377
Definition ui_system.hpp:87
Aggregate header for the UI asset types.