mirror of
https://github.com/eliasstepanik/imgui-rs.git
synced 2026-01-14 06:58:35 +00:00
Fix sRGB support, now when initialising a Renderer you can explicitly choose whether to output colors in linear or sRGB color spaces. Fix examples to show how to render these properly. Fix comments in examples
117 lines
4.0 KiB
Rust
117 lines
4.0 KiB
Rust
//! A basic self-contained example to get you from zero-to-demo-window as fast
|
|
//! as possible.
|
|
|
|
use std::time::Instant;
|
|
|
|
use glow::HasContext;
|
|
use glutin::{event_loop::EventLoop, WindowedContext};
|
|
use imgui_winit_support::WinitPlatform;
|
|
|
|
const TITLE: &str = "Hello, imgui-rs!";
|
|
|
|
type Window = WindowedContext<glutin::PossiblyCurrent>;
|
|
|
|
fn main() {
|
|
// Common setup for creating a winit window and imgui context, not specifc
|
|
// to this renderer at all except that glutin is used to create the window
|
|
// since it will give us access to a GL context
|
|
let (event_loop, window) = create_window();
|
|
let (mut winit_platform, mut imgui_context) = imgui_init(&window);
|
|
|
|
// OpenGL context from glow
|
|
let gl = glow_context(&window);
|
|
|
|
// OpenGL renderer from this crate
|
|
let mut ig_renderer = imgui_glow_renderer::AutoRenderer::initialize(gl, &mut imgui_context)
|
|
.expect("failed to create renderer");
|
|
|
|
let mut last_frame = Instant::now();
|
|
|
|
// Standard winit event loop
|
|
event_loop.run(move |event, _, control_flow| {
|
|
*control_flow = glutin::event_loop::ControlFlow::Wait;
|
|
match event {
|
|
glutin::event::Event::NewEvents(_) => {
|
|
let now = Instant::now();
|
|
imgui_context
|
|
.io_mut()
|
|
.update_delta_time(now.duration_since(last_frame));
|
|
last_frame = now;
|
|
}
|
|
glutin::event::Event::MainEventsCleared => {
|
|
winit_platform
|
|
.prepare_frame(imgui_context.io_mut(), window.window())
|
|
.unwrap();
|
|
window.window().request_redraw();
|
|
}
|
|
glutin::event::Event::RedrawRequested(_) => {
|
|
// The renderer assumes you'll be clearing the buffer yourself
|
|
unsafe { ig_renderer.gl_context().clear(glow::COLOR_BUFFER_BIT) };
|
|
|
|
let ui = imgui_context.frame();
|
|
ui.show_demo_window(&mut true);
|
|
|
|
winit_platform.prepare_render(&ui, window.window());
|
|
let draw_data = ui.render();
|
|
|
|
// This is the only extra render step to add
|
|
ig_renderer
|
|
.render(&draw_data)
|
|
.expect("error rendering imgui");
|
|
|
|
window.swap_buffers().unwrap();
|
|
}
|
|
glutin::event::Event::WindowEvent {
|
|
event: glutin::event::WindowEvent::CloseRequested,
|
|
..
|
|
} => {
|
|
*control_flow = glutin::event_loop::ControlFlow::Exit;
|
|
}
|
|
event => {
|
|
winit_platform.handle_event(imgui_context.io_mut(), window.window(), &event);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
fn create_window() -> (EventLoop<()>, Window) {
|
|
let event_loop = glutin::event_loop::EventLoop::new();
|
|
let window = glutin::window::WindowBuilder::new()
|
|
.with_title(TITLE)
|
|
.with_inner_size(glutin::dpi::LogicalSize::new(1024, 768));
|
|
let window = glutin::ContextBuilder::new()
|
|
.with_vsync(true)
|
|
.build_windowed(window, &event_loop)
|
|
.expect("could not create window");
|
|
let window = unsafe {
|
|
window
|
|
.make_current()
|
|
.expect("could not make window context current")
|
|
};
|
|
(event_loop, window)
|
|
}
|
|
|
|
fn glow_context(window: &Window) -> glow::Context {
|
|
unsafe { glow::Context::from_loader_function(|s| window.get_proc_address(s).cast()) }
|
|
}
|
|
|
|
fn imgui_init(window: &Window) -> (WinitPlatform, imgui::Context) {
|
|
let mut imgui_context = imgui::Context::create();
|
|
imgui_context.set_ini_filename(None);
|
|
|
|
let mut winit_platform = WinitPlatform::init(&mut imgui_context);
|
|
winit_platform.attach_window(
|
|
imgui_context.io_mut(),
|
|
window.window(),
|
|
imgui_winit_support::HiDpiMode::Rounded,
|
|
);
|
|
|
|
imgui_context
|
|
.fonts()
|
|
.add_font(&[imgui::FontSource::DefaultFontData { config: None }]);
|
|
|
|
imgui_context.io_mut().font_global_scale = (1.0 / winit_platform.hidpi_factor()) as f32;
|
|
|
|
(winit_platform, imgui_context)
|
|
}
|