| #define SDL_MAIN_USE_CALLBACKS 1 |
| |
| #include <SDL3/SDL.h> |
| #include <SDL3/SDL_main.h> |
| #include <glad/glad.h> |
| |
| #include <iostream> |
| #include <vector> |
| |
| #include <imgui_impl_opengl3.h> |
| #include <imgui_impl_sdl3.h> |
| |
| struct AppContext |
| { |
| SDL_Window* window; |
| SDL_GLContext glContext; |
| SDL_AppResult appQuit = SDL_APP_CONTINUE; |
| }; |
| |
| SDL_AppResult SDL_Fail() |
| { |
| SDL_LogError(SDL_LOG_CATEGORY_CUSTOM, "Error %s", SDL_GetError()); |
| return SDL_APP_FAILURE; |
| } |
| |
| SDL_AppResult SDL_AppInit(void** appstate, int argc, char* argv[]) |
| { |
| |
| if (!SDL_Init(SDL_INIT_VIDEO)) |
| { |
| return SDL_Fail(); |
| } |
| |
| SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); |
| SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2); |
| |
| |
| SDL_Window* window = SDL_CreateWindow("SDL3, OpenGL 2.1, C++", 500, 500, |
| SDL_WINDOW_OPENGL); |
| if (!window) |
| { |
| return SDL_Fail(); |
| } |
| |
| SDL_GLContext glContext = SDL_GL_CreateContext(window); |
| if (!glContext) |
| { |
| return SDL_Fail(); |
| } |
| |
| SDL_GL_SetSwapInterval(1); |
| |
| if (!gladLoadGL()) |
| { |
| std::cout << "Failed to load OpenGL functions" << std::endl; |
| return SDL_APP_FAILURE; |
| } |
| |
| glClearColor(0.188f, 0.22f, 0.255f, 1.f); |
| |
| |
| IMGUI_CHECKVERSION(); |
| ImGui::CreateContext(); |
| ImGuiIO& io = ImGui::GetIO(); |
| (void)io; |
| |
| |
| ImGui::StyleColorsDark(); |
| |
| |
| |
| ImGui_ImplSDL3_InitForOpenGL(window, glContext); |
| ImGui_ImplOpenGL3_Init(); |
| SDL_ShowWindow(window); |
| |
| |
| *appstate = new AppContext{ |
| window, |
| glContext, |
| }; |
| |
| return SDL_APP_CONTINUE; |
| } |
| |
| SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event) |
| { |
| auto* app = (AppContext*)appstate; |
| |
| ImGui_ImplSDL3_ProcessEvent(event); |
| |
| switch (event->type) |
| { |
| case SDL_EVENT_QUIT: |
| { |
| app->appQuit = SDL_APP_SUCCESS; |
| break; |
| } |
| default: |
| { |
| break; |
| } |
| } |
| |
| return SDL_APP_CONTINUE; |
| } |
| |
| SDL_AppResult SDL_AppIterate(void* appstate) |
| { |
| auto* app = (AppContext*)appstate; |
| |
| |
| ImGui_ImplOpenGL3_NewFrame(); |
| ImGui_ImplSDL3_NewFrame(); |
| |
| ImGui::NewFrame(); |
| |
| ImGui::Begin("Another Window"); |
| ImGui::Text("Hello from another window!"); |
| if (ImGui::Button("Click Me")) |
| std::cout << "clicked" << std::endl; |
| ImGui::End(); |
| |
| ImGui::Render(); |
| ImGuiIO& io = ImGui::GetIO(); |
| glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); |
| |
| |
| glClear(GL_COLOR_BUFFER_BIT); |
| |
| |
| |
| |
| ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); |
| |
| SDL_GL_SwapWindow(app->window); |
| return app->appQuit; |
| } |
| |
| void SDL_AppQuit(void* appstate, SDL_AppResult result) |
| { |
| auto* app = (AppContext*)appstate; |
| if (app) |
| { |
| SDL_GL_DestroyContext(app->glContext); |
| SDL_DestroyWindow(app->window); |
| delete app; |
| } |
| |
| |
| ImGui_ImplOpenGL3_Shutdown(); |
| ImGui_ImplSDL3_Shutdown(); |
| ImGui::DestroyContext(); |
| |
| SDL_Quit(); |
| } |