diff options
| author | fschildt <florian.schildt@protonmail.com> | 2025-09-29 16:12:03 +0200 | 
|---|---|---|
| committer | fschildt <florian.schildt@protonmail.com> | 2025-09-29 16:12:03 +0200 | 
| commit | 41c2e2ecfcccf62b3c646980dd283848e33a8134 (patch) | |
| tree | bb5764261560445f6348c5806a6f77b7aa19b740 /src/main.cpp | |
| parent | 9d72ed2d5801b1506158082f08bd0b47e58db17f (diff) | |
main: minor refactor
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 73 | 
1 files changed, 44 insertions, 29 deletions
diff --git a/src/main.cpp b/src/main.cpp index bdd5a18..16dce53 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,7 +18,7 @@  Game::GameType -do_menu() +DrawGameMenu()  {      Game::GameType type = Game::NO_GAME; @@ -47,14 +47,28 @@ do_menu()  } -int -main(int argc, char **argv) +void +DrawPerformanceInfo() +{ +    ImGuiIO& io = ImGui::GetIO(); +    ImGuiWindowFlags flags = ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove; + +    ImGui::SetNextWindowPos(ImVec2(io.DisplaySize.x - 200, 0)); +    ImGui::Begin("Performance", nullptr, flags); +    ImGui::Text("%.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +    ImGui::End(); +} + + +SDL_Window* +CreateWindow()  {      if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD)) {          std::cerr << "Failed to init SDL3: " << SDL_GetError() << '\n'; -        return EXIT_FAILURE; +        return nullptr;      } +      const char* glsl_version = "#version 130";      SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);      SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); @@ -65,25 +79,31 @@ main(int argc, char **argv)      SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);      SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); +      SDL_Window *window = SDL_CreateWindow("fsarcade", 1024, 768, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN | SDL_WINDOW_HIGH_PIXEL_DENSITY);      if (!window) {          std::cerr << "Failed to create SDL_window: " << SDL_GetError() << '\n'; -        return EXIT_FAILURE; +        return nullptr;      }      SDL_GLContext sdl_gl_context = SDL_GL_CreateContext(window);      if (!sdl_gl_context) {          std::cerr << "Failed to create SDL_GLContext: " << SDL_GetError() << '\n';          SDL_DestroyWindow(window); -        return EXIT_FAILURE; +        return nullptr;      } +      GLenum glew_error = glewInit();      if (glew_error != GLEW_OK)      { -        fprintf(stderr, "Error: %s\n", glewGetErrorString(glew_error)); +        SDL_GL_DestroyContext(sdl_gl_context); +        SDL_DestroyWindow(window); +        std::cerr << "Failed to init glew: " << glewGetErrorString(glew_error) << '\n'; +        return nullptr;      } +      SDL_GL_MakeCurrent(window, sdl_gl_context);      SDL_GL_SetSwapInterval(1); // enable vsync      SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); @@ -102,16 +122,27 @@ main(int argc, char **argv)      ImGui_ImplSDL3_InitForOpenGL(window, sdl_gl_context);      ImGui_ImplOpenGL3_Init(glsl_version); +    return window; +} + -    g_renderer.Init(window); +int +main(int argc, char **argv) +{ +    SDL_Window* window = CreateWindow(); +    if (!window) { +        return 0; +    } +    g_renderer.Init(window);      std::unique_ptr<Game> game = nullptr;      std::vector<SDL_Event> game_events;      game_events.reserve(32); +      for (;;) {          ImGui_ImplOpenGL3_NewFrame();          ImGui_ImplSDL3_NewFrame(); @@ -132,11 +163,11 @@ main(int argc, char **argv)              ImGui_ImplSDL3_ProcessEvent(&event);              if (event.type == SDL_EVENT_QUIT) -                goto QUIT; +                return 0;              if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window)) -                goto QUIT; +                return 0;              if (event.type == SDL_EVENT_WINDOW_DESTROYED && event.window.windowID == SDL_GetWindowID(window)) { -                goto QUIT; +                return 0;              }          } @@ -153,7 +184,7 @@ main(int argc, char **argv)              }          }          else { -            Game::GameType type = do_menu(); +            Game::GameType type = DrawGameMenu();              if (type != Game::NO_GAME) {                  game = Game::Select(type);              } @@ -161,30 +192,14 @@ main(int argc, char **argv)          game_events.clear(); - -        ImGuiWindowFlags flags = ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove; - -        ImGui::SetNextWindowPos(ImVec2(io.DisplaySize.x - 200, 0)); -        ImGui::Begin("Performance", nullptr, flags); -        ImGui::Text("%.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); -        ImGui::End(); - -          g_renderer.Draw();          ImGui::Render();          ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); +          SDL_GL_SwapWindow(window);          g_renderer.Reset();      } -QUIT: -    ImGui_ImplOpenGL3_Shutdown(); -    ImGui_ImplSDL3_Shutdown(); -    ImGui::DestroyContext(); - -    SDL_GL_DestroyContext(sdl_gl_context); -    SDL_DestroyWindow(window); -    SDL_Quit();      return 0;  }  | 
