use glow::HasContext; use imgui::Context; use imgui_glow_renderer::AutoRenderer; use imgui_sdl2_support::SdlPlatform; use sdl2::{ event::Event, video::{GLProfile, Window}, }; // Create a new glow context. fn glow_context(window: &Window) -> glow::Context { unsafe { glow::Context::from_loader_function(|s| window.subsystem().gl_get_proc_address(s) as _) } } fn main() { /* initialize SDL and its video subsystem */ let sdl = sdl2::init().unwrap(); let video_subsystem = sdl.video().unwrap(); /* hint SDL to initialize an OpenGL 3.3 core profile context */ let gl_attr = video_subsystem.gl_attr(); gl_attr.set_context_version(3, 3); gl_attr.set_context_profile(GLProfile::Core); /* create a new window, be sure to call opengl method on the builder when using glow! */ let window = video_subsystem .window("Hello imgui-rs!", 1280, 720) .allow_highdpi() .opengl() .position_centered() .resizable() .build() .unwrap(); /* create a new OpenGL context and make it current */ let gl_context = window.gl_create_context().unwrap(); window.gl_make_current(&gl_context).unwrap(); /* enable vsync to cap framerate */ window.subsystem().gl_set_swap_interval(1).unwrap(); /* create new glow and imgui contexts */ let gl = glow_context(&window); /* create context */ let mut imgui = Context::create(); /* disable creation of files on disc */ imgui.set_ini_filename(None); imgui.set_log_filename(None); /* setup platform and renderer, and fonts to imgui */ imgui .fonts() .add_font(&[imgui::FontSource::DefaultFontData { config: None }]); /* create platform and renderer */ let mut platform = SdlPlatform::init(&mut imgui); let mut renderer = AutoRenderer::initialize(gl, &mut imgui).unwrap(); /* start main loop */ let mut event_pump = sdl.event_pump().unwrap(); 'main: loop { for event in event_pump.poll_iter() { /* pass all events to imgui platfrom */ platform.handle_event(&mut imgui, &event); if let Event::Quit { .. } = event { break 'main; } } /* call prepare_frame before calling imgui.new_frame() */ platform.prepare_frame(&mut imgui, &window, &event_pump); let ui = imgui.new_frame(); /* create imgui UI here */ ui.show_demo_window(&mut true); /* render */ let draw_data = imgui.render(); unsafe { renderer.gl_context().clear(glow::COLOR_BUFFER_BIT) }; renderer.render(draw_data).unwrap(); window.gl_swap_window(); } }