diff --git a/CMakeLists.txt b/CMakeLists.txt index 38741c4..9713e6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ project(vksdlproj VERSION 0.2.0 LANGUAGES C CXX) SET(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) set(EXE_NAME project) -set(PROGRAM_SOURCES )#${CMAKE_CURRENT_SOURCE_DIR}/src/vulkanapp.cc) +set(PROGRAM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/vulkanapp.cc) option(SDL3_NONSYSTEM "Use SDL3 from folder in source tree" ON) diff --git a/include/vulkanapp.hh b/include/vulkanapp.hh index c8b962f..0d3b6b9 100644 --- a/include/vulkanapp.hh +++ b/include/vulkanapp.hh @@ -53,6 +53,9 @@ public: void init(); void loop(); void cleanup(); + inline bool minimized() { return mMinimized; } + inline void minimized(bool v) { mMinimized = v; } + inline void resized(bool v) { mResized = v; } private: // SDL2 SDL_Window *mWin; @@ -61,7 +64,7 @@ private: // Not tied to library uint32_t mWidth; uint32_t mHeight; - bool mActive = false; + // bool mActive = false; bool mResized = false; bool mMinimized = false; diff --git a/src/main.cc b/src/main.cc index 3f31460..1b8e8e3 100644 --- a/src/main.cc +++ b/src/main.cc @@ -3,11 +3,15 @@ #include #include +#include "vulkanapp.hh" + +#include + constexpr uint32_t winInitWidth = 512; constexpr uint32_t winInitHeight = 512; struct AppContext { - SDL_Window *window; + VulkanApp vkapp; SDL_AppResult appQuit = SDL_APP_CONTINUE; }; @@ -17,18 +21,21 @@ SDL_AppResult SDL_Fail() { } SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) { + (void)argc; + (void)argv; + if(!SDL_Init(SDL_INIT_VIDEO)) return SDL_Fail(); - SDL_Window *win = SDL_CreateWindow("SDL3 Vulkan", winInitWidth, winInitHeight, SDL_WINDOW_RESIZABLE | SDL_WINDOW_VULKAN); - - if(!win) - return SDL_Fail(); - - *appstate = new AppContext { - .window = win, - }; + try { + *appstate = new AppContext { .vkapp = VulkanApp(1024, 1024)}; + AppContext* app = static_cast(*appstate); + app->vkapp.init(); + } catch(const std::exception& except) { + fprintf(stderr, "Error! %s\n", except.what()); + return SDL_APP_FAILURE; + } return SDL_APP_CONTINUE; } @@ -36,8 +43,20 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) { AppContext* app = static_cast(appstate); switch(event->type) { - case SDL_EVENT_QUIT: - app->appQuit = SDL_APP_SUCCESS; + case SDL_EVENT_QUIT: + app->appQuit = SDL_APP_SUCCESS; + break; + case SDL_EVENT_WINDOW_RESIZED: + app->vkapp.resized(true); + break; + case SDL_EVENT_WINDOW_MINIMIZED: + app->vkapp.minimized(true); + break; + case SDL_EVENT_WINDOW_RESTORED: + app->vkapp.minimized(false); + break; + default: + break; } return SDL_APP_CONTINUE; @@ -46,14 +65,28 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) { SDL_AppResult SDL_AppIterate(void *appstate) { AppContext* app = static_cast(appstate); + try { + app->vkapp.loop(); + } catch(const std::exception& except) { + fprintf(stderr, "Error! %s\n", except.what()); + + return SDL_APP_FAILURE; + } + return app->appQuit; } void SDL_AppQuit(void *appstate, SDL_AppResult result) { AppContext* app = static_cast(appstate); + if(result == SDL_APP_FAILURE) { + fputs("Program failure, shutting down\n", stderr); + } else { + puts("Program shutting down, no errors."); + } + if(app) { - SDL_DestroyWindow(app->window); + app->vkapp.cleanup(); delete app; } diff --git a/src/vulkanapp.cc b/src/vulkanapp.cc index e5977de..6494486 100644 --- a/src/vulkanapp.cc +++ b/src/vulkanapp.cc @@ -862,31 +862,7 @@ void VulkanApp::loop() { throw std::runtime_error(err); } - mActive = true; - - // Main loop - while(mActive) { - while(SDL_PollEvent(&mEvent)) { - switch (mEvent.type) { - case SDL_EVENT_QUIT: - mActive = false; - break; - case SDL_EVENT_WINDOW_RESIZED: - mResized = true; - break; - case SDL_EVENT_WINDOW_MINIMIZED: - mMinimized = true; - break; - case SDL_EVENT_WINDOW_RESTORED: - mMinimized = false; - break; - default: - break; - } - } - - if(!mMinimized) drawFrame(); - } + if(!mMinimized) drawFrame(); vkDeviceWaitIdle(mLogicalDevice); } @@ -921,7 +897,4 @@ void VulkanApp::cleanup() { SDL_DestroyWindow(mWin); mWin = nullptr; } - - //SDL_Vulkan_UnloadLibrary(); - SDL_Quit(); -} \ No newline at end of file +}