feat: Add window class

This commit is contained in:
2026-10-17 16:25:09 +02:00
parent 67c685a158
commit 89a168f76d
9 changed files with 513 additions and 36 deletions
+21 -33
View File
@@ -1,7 +1,6 @@
#include <algorithm>
#include <chrono>
#include <exception>
#include <SDL_vulkan.h>
#include <thread>
#include <stdexcept>
#include <destrum/App.h>
@@ -52,23 +51,15 @@ void App::init(const AppParams& params)
TracySetProgramName(params.appName.c_str());
AssetFS::GetInstance().Init(params.exeDir);
window = SDL_CreateWindow(
params.windowTitle.c_str(),
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
params.windowSize.x,
params.windowSize.y,
SDL_WINDOW_VULKAN);
window.Create({
.title = params.windowTitle,
.size = params.windowSize,
.mode = params.windowMode,
.maximized = params.startMaximized,
});
if (!window) {
spdlog::error("Failed to create window. SDL Error: {}", SDL_GetError());
throw std::runtime_error(
"Failed to create window: " + std::string{SDL_GetError()});
}
SDL_SetWindowResizable(window, SDL_TRUE);
gfxDevice.init(window, params.appName, false);
imguiPass.init(window, gfxDevice);
gfxDevice.init(window.GetHandle(), params.appName, false);
imguiPass.init(window.GetHandle(), gfxDevice);
InputManager::GetInstance().Init();
Time::GetInstance().Update();
@@ -144,16 +135,16 @@ void App::run()
break;
}
if (event.type == SDL_WINDOWEVENT)
window.ProcessEvent(event);
if (window.ConsumeResized())
{
switch (event.window.event)
{
case SDL_WINDOWEVENT_SIZE_CHANGED:
case SDL_WINDOWEVENT_RESIZED:
resizePending = true;
lastResizeTime = std::chrono::steady_clock::now();
break;
}
resizePending = true;
lastResizeTime = std::chrono::steady_clock::now();
}
if (window.ConsumeCloseRequested())
{
isRunning = false;
break;
}
const bool keyboardEvent =
@@ -290,9 +281,9 @@ if (!isRunning) break;
continue;
}
int w = 0;
int h = 0;
SDL_Vulkan_GetDrawableSize(window, &w, &h);
const glm::ivec2 drawableSize = window.GetDrawableSize();
const int w = drawableSize.x;
const int h = drawableSize.y;
if (w == 0 || h == 0)
{
@@ -362,10 +353,7 @@ void App::cleanup()
attempt([this] { resources.cleanup(gfxDevice); });
attempt([this] { gfxDevice.cleanup(); });
if (window) {
SDL_DestroyWindow(window);
window = nullptr;
}
window.Destroy();
AssetFS::GetInstance().Reset();
customInitStarted = false;