LkEngine 0.1.2
 
Loading...
Searching...
No Matches
Window.h
Go to the documentation of this file.
1
5#pragma once
6
7#include <glad/glad.h>
8#include <GLFW/glfw3.h>
9
10#include "LkEngine/Core/Core.h"
12#include "LkEngine/Core/Delegate/Delegate.h"
13#include "LkEngine/Core/Input/Keyboard.h"
14#include "LkEngine/Core/Input/Mouse.h"
15#include "LkEngine/Core/ApplicationConfig.h"
16
17#include "LkEngine/Renderer/RenderContext.h"
18#include "LkEngine/Renderer/SwapChain.h"
19#include "LkEngine/Renderer/RenderPass.h"
20
21namespace LkEngine {
22
23 class LViewport;
24
35 {
36 std::string Title = "LkEngine";
37 uint32_t Width = 1600;
38 uint32_t Height = 1080;
39 bool bDecorated = true;
40 bool bFullscreen = false;
41 bool bVSync = true;
42 bool bStartMaximized = false;
43 std::filesystem::path IconPath{};
44
45 FWindowSpecification() = default;
47 : Title(ApplicationSpec.Title)
48 , Width(ApplicationSpec.Width)
49 , Height(ApplicationSpec.Height)
50 , bFullscreen(ApplicationSpec.Fullscreen)
51 , bDecorated(true)
52 , bVSync(ApplicationSpec.VSync)
53 , bStartMaximized(ApplicationSpec.StartMaximized)
54 {
55 }
56 };
57
62 LK_DECLARE_MULTICAST_DELEGATE(FOnWindowMaximized, const bool);
63
70 {
71 std::string Title{};
72 uint32_t Width = 0;
73 uint32_t Height = 0;
74
75 bool bVSync = true;
76 bool bMaximized = false;
77 bool bFullscreen = false;
78
79 FOnWindowMaximized OnWindowMaximized;
80 };
81
87 class LWindow : public LObject
88 {
89 LK_DECLARE_MULTICAST_DELEGATE(FOnWindowSizeUpdated, const uint16_t, const uint16_t);
90 LK_DECLARE_MULTICAST_DELEGATE(FOnWindowScalersUpdated, const float, const float);
91 LK_DECLARE_MULTICAST_DELEGATE(FOnViewportSizeUpdated, const uint16_t, const uint16_t);
92 LK_DECLARE_MULTICAST_DELEGATE(FOnViewportScalersUpdated, const float, const float);
93 public:
94 LWindow(const FWindowSpecification& WindowSpecification);
95 LWindow() = delete;
96 ~LWindow();
97
98 virtual void Initialize() override;
99 virtual void Destroy() override;
100
101 void SwapBuffers();
102 void ProcessEvents();
103
108 FORCEINLINE GLFWwindow* GetGlfwWindow() const { return GlfwWindow; }
109
110 void Maximize();
111 bool IsMaximized() const;
112 void Minimize();
113 bool IsMinimized() const;
114 bool IsFullscreen() const;
115 void SetFullscreen(const bool Fullscreen);
116 void SetTitle(const std::string& NewTitle);
117
118 FORCEINLINE std::string GetTitle() const { return Title; }
119 FORCEINLINE LVector2 GetSize() const { return Size; }
120 FORCEINLINE uint16_t GetWidth() const { return static_cast<uint16_t>(Size.X); }
121 FORCEINLINE uint16_t GetHeight() const { return static_cast<uint16_t>(Size.Y); }
122 FORCEINLINE uint16_t GetViewportWidth() const { return static_cast<uint16_t>(ViewportSize.X); }
123 FORCEINLINE uint16_t GetViewportHeight() const { return static_cast<uint16_t>(ViewportSize.Y); }
124
125 FORCEINLINE LVector2 GetPosition() const { return Pos; }
126 FORCEINLINE LVector2 GetViewportSize() const { return ViewportSize; }
127
128 FORCEINLINE bool IsVSyncEnabled() const { return Data.bVSync; }
129
130 FORCEINLINE TObjectPtr<LRenderContext> GetRenderContext()
131 {
132 LK_CORE_ASSERT(RenderContext);
133 return RenderContext;
134 }
135
136 void SetDepthEnabled(const bool InEnabled)
137 {
138 if (RenderContext)
139 {
140 RenderContext->SetDepthEnabled(InEnabled);
141 }
142 }
143
144 void SetBlendingEnabled(const bool InEnabled)
145 {
146 if (RenderContext)
147 {
148 RenderContext->SetBlendingEnabled(InEnabled);
149 }
150 }
151
152 FORCEINLINE void SetSize(const LVector2& InSize)
153 {
154 if ((Size.X != InSize.X) || (Size.Y != InSize.X))
155 {
156 Size.X = static_cast<uint16_t>(InSize.X);
157 Size.Y = static_cast<uint16_t>(InSize.Y);
158
159 OnWindowSizeUpdated.Broadcast((uint16_t)Size.X, (uint16_t)Size.Y);
160 }
161 }
162
163 FORCEINLINE void SetViewportWidth(const uint16_t NewWidth)
164 {
165 if (ViewportSize.X != NewWidth)
166 {
167 ViewportSize.X = static_cast<float>(NewWidth);
168 OnViewportSizeUpdated.Broadcast(static_cast<uint16_t>(ViewportSize.X), static_cast<uint16_t>(ViewportSize.Y));
169 }
170 }
171
172 FORCEINLINE void SetViewportHeight(const uint16_t NewHeight)
173 {
174 if (ViewportSize.Y != NewHeight)
175 {
176 ViewportSize.Y = static_cast<float>(NewHeight);
177 OnViewportSizeUpdated.Broadcast(static_cast<uint16_t>(ViewportSize.X), static_cast<uint16_t>(ViewportSize.Y));
178 }
179 }
180
181 void SetVSync(const bool InEnabled);
182
183 FORCEINLINE LSwapChain& GetSwapChain()
184 {
185 LK_CORE_ASSERT(m_SwapChain);
186 return *m_SwapChain;
187 }
188
189 TObjectPtr<LRenderPass> GetRenderPass();
190
191 FORCEINLINE void SetWidth(const uint16_t NewWidth)
192 {
193 if (Size.X != NewWidth)
194 {
195 Size.X = static_cast<decltype(Size.X)>(NewWidth);
196 OnWindowSizeUpdated.Broadcast(static_cast<uint16_t>(Size.X), static_cast<uint16_t>(Size.Y));
197 }
198 }
199
200 FORCEINLINE void SetHeight(const uint16_t NewHeight)
201 {
202 if (Size.Y != NewHeight)
203 {
204 Size.Y = static_cast<decltype(Size.Y)>(NewHeight);
205 OnWindowSizeUpdated.Broadcast(static_cast<uint16_t>(Size.X), static_cast<uint16_t>(Size.Y));
206 }
207 }
208
212 FORCEINLINE float GetScalerX() const { return ViewportScalers.X; }
213 FORCEINLINE float GetScalerY() const { return ViewportScalers.Y; }
214 FORCEINLINE LVector2 GetScalers() const { return ViewportScalers; }
215
216 FORCEINLINE void SetScalerX(const float InX) { ViewportScalers.X = InX; }
217 FORCEINLINE void SetScalerY(const float InY) { ViewportScalers.Y = InY; }
218 FORCEINLINE void SetScalers(const float InX, const float InY)
219 {
220 ViewportScalers.X = InX;
221 ViewportScalers.Y = InY;
222 }
223
224 FORCEINLINE FWindowData& GetData() { return Data; }
225 FORCEINLINE const FWindowData& GetData() const { return Data; }
226
227 std::string GetShaderVersion() const { return GlslVersion; } /* REMOVE */
228 FORCEINLINE const FWindowSpecification& GetSpecification() const { return Specification; }
229
230 FORCEINLINE static LWindow& Get() { return *Instance; }
231
232 public:
233 FOnWindowSizeUpdated OnWindowSizeUpdated{};
234 FOnViewportSizeUpdated OnViewportSizeUpdated{};
235
236 static constexpr uint16_t DEFAULT_WIDTH = 1600;
237 static constexpr uint16_t DEFAULT_HEIGHT = 1080;
238 private:
239 FWindowData Data{};
240 FWindowSpecification Specification{}; /* TODO: Replace entirely with FWindowData? */
241 std::string Title{};
242
243 bool bGlfwInitialized = false;
244 GLFWwindow* GlfwWindow{};
245
246 LVector2 Size{};
247 LVector2 ViewportSize{};
248
249 LVector2 Pos = { 0.0f, 0.0f };
250 LVector2 ViewportScalers = { 1.0f, 1.0f };
251
252 std::string GlslVersion{};
253
254 TObjectPtr<LPipeline> m_Pipeline = nullptr;
255 TObjectPtr<LSwapChain> m_SwapChain = nullptr;
256 TObjectPtr<LRenderContext> RenderContext = nullptr;
257
258 inline static LWindow* Instance = nullptr;
259
260 friend class LEditorLayer;
261
262 private:
263 LCLASS(LWindow);
264 };
265
268}
Core header.
LObject implementation.
Definition Object.h:46
Definition Window.h:88
FORCEINLINE float GetScalerX() const
Definition Window.h:212
virtual void Destroy() override
Destroy object, releasing all resources.
Definition Window.cpp:243
virtual void Initialize() override
Initialize object.
Definition Window.cpp:42
FORCEINLINE GLFWwindow * GetGlfwWindow() const
Get reference to the GLFW window.
Definition Window.h:108
#define LCLASS(Class)
Definition CoreMacros.h:226
TVector2< float > LVector2
Definition Vector.h:48
Definition Asset.h:11
Definition ApplicationConfig.h:10
Definition Window.h:70
Definition Window.h:35