RavEngine
Loading...
Searching...
No Matches
GUI.hpp
1#pragma once
2#if !RVE_SERVER
3#include <RmlUi/Core.h>
4#include "SpinLock.hpp"
5#include "Queue.hpp"
6#include "Map.hpp"
7#include "Queryable.hpp"
8#include "IInputListener.hpp"
9#include "Function.hpp"
10#include "Ref.hpp"
11#include <RmlUi/Core/ElementDocument.h>
12#include "Types.hpp"
13
14namespace Rml {
15 class Context;
16 class ElementDocument;
17}
18
19namespace RavEngine{
23class GUIComponent : public AutoCTTI{
24protected:
25 friend class RenderEngine;
26 struct GUIData;
27
29 Rml::Context* context = nullptr;
31 ~GUIData();
32
33 ConcurrentQueue<Function<void(void)>> q_a, q_b;
34 std::atomic<decltype(q_a)*> current = &q_a, inactive = &q_b;
35
36 SpinLock mtx;
37
38 uint32_t modifier_state = 0;
39
40 void AnyActionDown(const int charcode) override;
41
42 void AnyActionUp(const int charcode) override;
43
44 struct {
45 float x = 0, y = 0;
46 } MousePos;
47
48 template<typename T>
49 inline void ExclusiveAccess(const T& func){
50 mtx.lock();
51 func();
52 mtx.unlock();
53 }
54
55 template<typename T>
56 constexpr inline void EnqueueUIUpdate(const T& func){
57 current.load()->enqueue(func);
58 }
59
60 void ScrollY(float amt);
61 void MouseMove();
62 void SetDimensions(uint32_t width, uint32_t height);
63 };
64 Ref<GUIData> data = std::make_shared<GUIData>();
65
66
67public:
68
69 inline decltype(data) GetData() const{
70 return data;
71 }
72
73 void MouseMove(){
74 data->MouseMove();
75 }
76
77 enum class RenderMode{
78 Screenspace,
79 Worldspace
80 } Mode = RenderMode::Screenspace;
81
86
87 MOVE_NO_COPY(GUIComponent);
88
94 GUIComponent(int width, int height, float DPI = 1);
95
96 void SetDPIScale(float scale);
97
103 Rml::ElementDocument* AddDocument(const std::string& name);
104
110 void RemoveDocument(const std::string& name);
111
116 bool IsDocumentLoaded(const std::string& name) const;
117
124 Rml::ElementDocument* GetDocument(const std::string& name) const;
125
131 void SetDimensions(uint32_t width, uint32_t height){
132 data->SetDimensions(width, height);
133 }
134
138 void MouseX(float normalized_pos);
139
143 void MouseY(float normalized_pos);
144
148 void ScrollY(float amt){
149 data->ScrollY(amt);
150 }
151
156 template<typename T>
157 constexpr inline void ExclusiveAccess(const T& func) {
158 data->ExclusiveAccess(func);
159 }
160
165 template<typename T>
166 constexpr inline void EnqueueUIUpdate(const T& func){
167 data->EnqueueUIUpdate(func);
168 }
169
173 static bool LoadFont(const std::string& filename);
174
178 void Debug();
179
183 bool Update();
184
188 bool Render();
189};
190}
191#endif
Definition GUI.hpp:23
Rml::ElementDocument * AddDocument(const std::string &name)
Definition GUI.cpp:73
bool IsDocumentLoaded(const std::string &name) const
Definition GUI.cpp:106
void RemoveDocument(const std::string &name)
Definition GUI.cpp:94
Rml::ElementDocument * GetDocument(const std::string &name) const
Definition GUI.cpp:160
void SetDimensions(uint32_t width, uint32_t height)
Definition GUI.hpp:131
bool Update()
Definition GUI.cpp:116
void MouseY(float normalized_pos)
Definition GUI.cpp:269
constexpr void EnqueueUIUpdate(const T &func)
Definition GUI.hpp:166
GUIComponent()
Definition GUI.cpp:147
void ScrollY(float amt)
Definition GUI.hpp:148
void MouseX(float normalized_pos)
Definition GUI.cpp:265
void Debug()
Definition GUI.cpp:295
bool Render()
Definition GUI.cpp:139
static bool LoadFont(const std::string &filename)
Definition GUI.cpp:110
constexpr void ExclusiveAccess(const T &func)
Definition GUI.hpp:157
Definition RenderEngine.hpp:64
Definition SpinLock.hpp:9
Definition base.h:1940
Definition concurrentqueue.h:747
Definition Animation.hpp:6
Definition CTTI.hpp:14
void AnyActionUp(const int charcode) override
Definition GUI.cpp:223
void AnyActionDown(const int charcode) override
Definition GUI.cpp:175
Definition IInputListener.hpp:7