use glutin::dpi::{LogicalSize, PhysicalSize};
use glutin::platform::desktop::EventLoopExtDesktop;
use std::time::Instant;
fn main() -> grr::Result<()> {
let mut event_loop = glutin::event_loop::EventLoop::new();
let wb = glutin::window::WindowBuilder::new()
.with_title("Hello, world!")
.with_inner_size(LogicalSize {
width: 1024.0,
height: 768.0,
});
let window = unsafe {
glutin::ContextBuilder::new()
.with_vsync(true)
.with_srgb(true)
.with_gl_debug_flag(true)
.build_windowed(wb, &event_loop)
.unwrap()
.make_current()
.unwrap()
};
let PhysicalSize {
width: mut w,
height: mut h,
} = window.window().inner_size();
let grr = unsafe {
grr::Device::new(
|symbol| window.get_proc_address(symbol) as *const _,
grr::Debug::Enable {
callback: |_, _, _, _, msg| {
println!("{:?}", msg);
},
flags: grr::DebugReport::FULL,
},
)
};
let mut imgui = imgui::Context::create();
imgui.set_ini_filename(None);
let mut platform = imgui_winit_support::WinitPlatform::init(&mut imgui);
let hidpi_factor = window.window().scale_factor();
let font_size = (13.0 * hidpi_factor) as f32;
imgui
.fonts()
.add_font(&[imgui::FontSource::DefaultFontData {
config: Some(imgui::FontConfig {
size_pixels: font_size,
..imgui::FontConfig::default()
}),
}]);
imgui.io_mut().font_global_scale = (1.0 / hidpi_factor) as f32;
let imgui_renderer = unsafe { grr_imgui::Renderer::new(&mut imgui, &grr)? };
platform.attach_window(
imgui.io_mut(),
window.window(),
imgui_winit_support::HiDpiMode::Default,
);
let mut running = true;
let mut last_frame = Instant::now();
event_loop.run_return(|event, _, control_flow| {
unsafe {
platform.handle_event(imgui.io_mut(), window.window(), &event);
*control_flow = glutin::event_loop::ControlFlow::Poll;
match event {
glutin::event::Event::MainEventsCleared => {}
glutin::event::Event::WindowEvent { event, .. } => match event {
glutin::event::WindowEvent::CloseRequested => {
*control_flow = glutin::event_loop::ControlFlow::Exit;
return;
}
glutin::event::WindowEvent::Resized(size) => {
w = size.width;
h = size.height;
return;
}
_ => {
return;
}
},
_ => {
return;
}
}
let io = imgui.io_mut();
platform
.prepare_frame(io, window.window())
.expect("Failed to start frame");
last_frame = io.update_delta_time(last_frame);
let ui = imgui.frame();
ui.show_demo_window(&mut running);
grr.set_viewport(
0,
&[grr::Viewport {
x: 0.0,
y: 0.0,
w: w as _,
h: h as _,
n: 0.0,
f: 1.0,
}],
);
grr.set_scissor(
0,
&[grr::Region {
x: 0,
y: 0,
w: w as _,
h: h as _,
}],
);
grr.clear_attachment(
grr::Framebuffer::DEFAULT,
grr::ClearAttachment::ColorFloat(0, [0.5, 0.5, 0.5, 1.0]),
);
imgui_renderer.render(ui.render()).unwrap();
window.swap_buffers().unwrap();
}
});
Ok(())
}