diff options
| -rw-r--r-- | src/basic/defs.hpp | 2 | ||||
| -rw-r--r-- | src/basic/math.hpp | 5 | ||||
| -rw-r--r-- | src/main.cpp | 73 | 
3 files changed, 49 insertions, 31 deletions
diff --git a/src/basic/defs.hpp b/src/basic/defs.hpp index bfd302e..858bdd7 100644 --- a/src/basic/defs.hpp +++ b/src/basic/defs.hpp @@ -1,8 +1,6 @@  #pragma once  #include <cassert> -#include <cstdint> -#include <cstddef>  #define ARRAY_COUNT(x) (sizeof(x) / sizeof(x[0])) diff --git a/src/basic/math.hpp b/src/basic/math.hpp index c5b5940..a3e4b64 100644 --- a/src/basic/math.hpp +++ b/src/basic/math.hpp @@ -1,7 +1,12 @@  #pragma once +  #include <basic/defs.hpp> +#include <cstddef> +#include <cstdint> + +  struct V2ST {      size_t x;      size_t y; 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;  }  | 
