#define CIMGUI_DEFINE_ENUMS_AND_STRUCTS #include "cimgui.h" #include "cimgui_impl.h" #include #define SDL_MAIN_HANDLED #include #ifdef _MSC_VER #include #endif #include #include #ifdef _WIN32 #include // SetProcessDPIAware() #endif #ifdef IMGUI_HAS_IMSTR #define igBegin igBegin_Str #define igSliderFloat igSliderFloat_Str #define igCheckbox igCheckbox_Str #define igColorEdit3 igColorEdit3_Str #define igButton igButton_Str #endif #define igGetIO igGetIO_Nil SDL_Window *window = NULL; int main(int argc, char* argv[]) { #ifdef _WIN32 SetProcessDPIAware(); #endif if (SDL_Init(SDL_INIT_VIDEO) < 0) { SDL_Log("failed to init: %s", SDL_GetError()); return -1; } // Decide GL+GLSL versions #if __APPLE__ // GL 3.2 Core + GLSL 150 const char* glsl_version = "#version 150"; SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); #else // GL 3.0 + GLSL 130 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); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); #endif // and prepare OpenGL stuff SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_DisplayMode current; SDL_GetCurrentDisplayMode(0, ¤t); float main_scale = ImGui_ImplSDL2_GetContentScaleForDisplay(0); SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); window = SDL_CreateWindow("Dear ImGui SDL2+OpenGL3 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, (int)(1280 * main_scale), (int)(720 * main_scale), window_flags); if (window == NULL) { SDL_Log("Failed to create window: %s", SDL_GetError()); return -1; } SDL_GLContext gl_context = SDL_GL_CreateContext(window); SDL_GL_SetSwapInterval(1); // enable vsync // check opengl version sdl uses SDL_Log("opengl version: %s", (char*)glGetString(GL_VERSION)); // setup imgui igCreateContext(NULL); //set docking ImGuiIO* ioptr = igGetIO(); ioptr->ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls //ioptr->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls #ifdef IMGUI_HAS_DOCK ioptr->ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking ioptr->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // Enable Multi-Viewport / Platform Windows #endif // Setup scaling ImGuiStyle* style = igGetStyle(); ImGuiStyle_ScaleAllSizes(style, main_scale); // Bake a fixed style scale. (until we have a solution for dynamic style scaling, changing this requires resetting Style + calling this again) style->FontScaleDpi = main_scale; // Set initial font scale. (using io.ConfigDpiScaleFonts=true makes this unnecessary. We leave both here for documentation purpose) ioptr->ConfigDpiScaleFonts = true; // [Experimental] Automatically overwrite style.FontScaleDpi in Begin() when Monitor DPI changes. This will scale fonts but _NOT_ scale sizes/padding for now. ioptr->ConfigDpiScaleViewports = true; // [Experimental] Scale Dear ImGui and Platform Windows when Monitor DPI changes. ImGui_ImplSDL2_InitForOpenGL(window, gl_context); ImGui_ImplOpenGL3_Init(glsl_version); igStyleColorsDark(NULL); //ImFontAtlas_AddFontDefault(io.Fonts, NULL); bool showDemoWindow = true; bool showAnotherWindow = false; ImVec4 clearColor; clearColor.x = 0.45f; clearColor.y = 0.55f; clearColor.z = 0.60f; clearColor.w = 1.00f; bool quit = false; while (!quit) { SDL_Event e; // we need to call SDL_PollEvent to let window rendered, otherwise // no window will be shown while (SDL_PollEvent(&e) != 0) { ImGui_ImplSDL2_ProcessEvent(&e); if (e.type == SDL_QUIT) quit = true; if (e.type == SDL_WINDOWEVENT && e.window.event == SDL_WINDOWEVENT_CLOSE && e.window.windowID == SDL_GetWindowID(window)) quit = true; } // start imgui frame ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplSDL2_NewFrame(); igNewFrame(); if (showDemoWindow) igShowDemoWindow(&showDemoWindow); // show a simple window that we created ourselves. { static float f = 0.0f; static int counter = 0; igBegin("Hello, world!", NULL, 0); igText("This is some useful text"); igCheckbox("Demo window", &showDemoWindow); igCheckbox("Another window", &showAnotherWindow); igSliderFloat("Float", &f, 0.0f, 1.0f, "%.3f", 0); igColorEdit3("clear color", (float*)&clearColor, 0); ImVec2 buttonSize; buttonSize.x = 0; buttonSize.y = 0; if (igButton("Button", buttonSize)) counter++; igSameLine(0.0f, -1.0f); igText("counter = %d", counter); igText("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / igGetIO()->Framerate, igGetIO()->Framerate); igEnd(); } if (showAnotherWindow) { igBegin("imgui Another Window", &showAnotherWindow, 0); igText("Hello from imgui"); ImVec2 buttonSize; buttonSize.x = 0; buttonSize.y = 0; if (igButton("Close me", buttonSize)) { showAnotherWindow = false; } igEnd(); } // render igRender(); SDL_GL_MakeCurrent(window, gl_context); glViewport(0, 0, (int)ioptr->DisplaySize.x, (int)ioptr->DisplaySize.y); glClearColor(clearColor.x, clearColor.y, clearColor.z, clearColor.w); glClear(GL_COLOR_BUFFER_BIT); ImGui_ImplOpenGL3_RenderDrawData(igGetDrawData()); #ifdef IMGUI_HAS_DOCK if (ioptr->ConfigFlags & ImGuiConfigFlags_ViewportsEnable) { SDL_Window* backup_current_window = SDL_GL_GetCurrentWindow(); SDL_GLContext backup_current_context = SDL_GL_GetCurrentContext(); igUpdatePlatformWindows(); igRenderPlatformWindowsDefault(NULL,NULL); SDL_GL_MakeCurrent(backup_current_window, backup_current_context); } #endif SDL_GL_SwapWindow(window); } // clean up ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplSDL2_Shutdown(); igDestroyContext(NULL); SDL_GL_DeleteContext(gl_context); if (window != NULL) { SDL_DestroyWindow(window); window = NULL; } SDL_Quit(); return 0; }