Dairy-Drift/imgui_sdl2_support/examples/sdl2_01_basic.rs

93 lines
2.6 KiB
Rust
Raw Permalink Normal View History

2023-03-15 15:51:30 +01:00
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();
}
}