2020-10-16 15:56:11 +02:00
# define CIMGUI_DEFINE_ENUMS_AND_STRUCTS
# include "cimgui.h"
# include "cimgui_impl.h"
# include <stdio.h>
# define SDL_MAIN_HANDLED
# include <SDL.h>
2020-10-18 13:51:37 +02:00
# ifdef _MSC_VER
# include <windows.h>
# endif
2020-10-16 17:33:05 +02:00
# include <GL/gl.h>
# include <GL/glu.h>
2020-10-16 15:56:11 +02:00
2025-06-27 09:58:32 +02:00
# ifdef _WIN32
# include <windows.h> // SetProcessDPIAware()
# endif
2021-01-30 19:31:14 +01:00
# ifdef IMGUI_HAS_IMSTR
2021-03-04 18:08:28 +01:00
# define igBegin igBegin_Str
# define igSliderFloat igSliderFloat_Str
# define igCheckbox igCheckbox_Str
# define igColorEdit3 igColorEdit3_Str
# define igButton igButton_Str
2021-01-30 19:31:14 +01:00
# endif
2020-10-16 15:56:11 +02:00
2025-03-15 17:51:30 +01:00
# define igGetIO igGetIO_Nil
2020-10-16 15:56:11 +02:00
SDL_Window * window = NULL ;
int main ( int argc , char * argv [ ] )
{
2025-06-27 09:58:32 +02:00
# ifdef _WIN32
SetProcessDPIAware ( ) ;
# endif
2020-10-18 19:32:26 +02:00
2020-10-16 15:56:11 +02:00
if ( SDL_Init ( SDL_INIT_VIDEO ) < 0 ) {
SDL_Log ( " failed to init: %s " , SDL_GetError ( ) ) ;
return - 1 ;
}
2020-10-18 13:51:37 +02:00
2020-10-16 15:56:11 +02:00
// 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 , & current ) ;
2025-06-27 09:58:32 +02:00
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 ) ;
2020-10-16 15:56:11 +02:00
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
2020-10-16 17:33:05 +02:00
2020-10-16 15:56:11 +02:00
// check opengl version sdl uses
2020-10-18 19:32:26 +02:00
SDL_Log ( " opengl version: %s " , ( char * ) glGetString ( GL_VERSION ) ) ;
2020-10-16 15:56:11 +02:00
// setup imgui
igCreateContext ( NULL ) ;
//set docking
ImGuiIO * ioptr = igGetIO ( ) ;
ioptr - > ConfigFlags | = ImGuiConfigFlags_NavEnableKeyboard ; // Enable Keyboard Controls
//ioptr->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
2020-12-15 11:33:30 +01:00
# ifdef IMGUI_HAS_DOCK
2020-10-16 15:56:11 +02:00
ioptr - > ConfigFlags | = ImGuiConfigFlags_DockingEnable ; // Enable Docking
ioptr - > ConfigFlags | = ImGuiConfigFlags_ViewportsEnable ; // Enable Multi-Viewport / Platform Windows
2020-10-16 16:29:47 +02:00
# endif
2020-10-16 15:56:11 +02:00
2025-06-27 09:58:32 +02:00
// 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.
2020-10-16 15:56:11 +02:00
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 ( ) ;
2022-06-21 19:23:41 +02:00
ImGui_ImplSDL2_NewFrame ( ) ;
2020-10-16 15:56:11 +02:00
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 ) ;
2020-10-18 13:51:37 +02:00
igSliderFloat ( " Float " , & f , 0.0f , 1.0f , " %.3f " , 0 ) ;
2020-10-16 15:56:11 +02:00
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 ( ) ) ;
2020-12-15 11:33:30 +01:00
# ifdef IMGUI_HAS_DOCK
2020-10-16 15:56:11 +02:00
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 ) ;
}
2020-10-16 16:29:47 +02:00
# endif
2020-10-16 15:56:11 +02:00
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 ;
}