//! Example how to use pure `egui_glow`. #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release #![allow(unsafe_code)] fn main() { let mut clear_color = [0.1, 0.1, 0.1]; let event_loop = glutin::event_loop::EventLoopBuilder::with_user_event().build(); let (gl_window, gl) = create_display(&event_loop); let gl = std::sync::Arc::new(gl); let mut egui_glow = egui_glow::EguiGlow::new(&event_loop, gl.clone(), None); event_loop.run(move |event, _, control_flow| { let mut redraw = || { let mut quit = false; let repaint_after = egui_glow.run(gl_window.window(), |egui_ctx| { egui::SidePanel::left("my_side_panel").show(egui_ctx, |ui| { ui.heading("Hello World!"); if ui.button("Quit").clicked() { quit = true; } ui.color_edit_button_rgb(&mut clear_color); }); }); *control_flow = if quit { glutin::event_loop::ControlFlow::Exit } else if repaint_after.is_zero() { gl_window.window().request_redraw(); glutin::event_loop::ControlFlow::Poll } else if let Some(repaint_after_instant) = std::time::Instant::now().checked_add(repaint_after) { glutin::event_loop::ControlFlow::WaitUntil(repaint_after_instant) } else { glutin::event_loop::ControlFlow::Wait }; { unsafe { use glow::HasContext as _; gl.clear_color(clear_color[0], clear_color[1], clear_color[2], 1.0); gl.clear(glow::COLOR_BUFFER_BIT); } // draw things behind egui here egui_glow.paint(gl_window.window()); // draw things on top of egui here gl_window.swap_buffers().unwrap(); } }; match event { // Platform-dependent event handlers to workaround a winit bug // See: https://github.com/rust-windowing/winit/issues/987 // See: https://github.com/rust-windowing/winit/issues/1619 glutin::event::Event::RedrawEventsCleared if cfg!(windows) => redraw(), glutin::event::Event::RedrawRequested(_) if !cfg!(windows) => redraw(), glutin::event::Event::WindowEvent { event, .. } => { use glutin::event::WindowEvent; if matches!(event, WindowEvent::CloseRequested | WindowEvent::Destroyed) { *control_flow = glutin::event_loop::ControlFlow::Exit; } if let glutin::event::WindowEvent::Resized(physical_size) = &event { gl_window.resize(*physical_size); } else if let glutin::event::WindowEvent::ScaleFactorChanged { new_inner_size, .. } = &event { gl_window.resize(**new_inner_size); } let event_response = egui_glow.on_event(&event); if event_response.repaint { gl_window.window().request_redraw(); } } glutin::event::Event::LoopDestroyed => { egui_glow.destroy(); } glutin::event::Event::NewEvents(glutin::event::StartCause::ResumeTimeReached { .. }) => { gl_window.window().request_redraw(); } _ => (), } }); } fn create_display( event_loop: &glutin::event_loop::EventLoop<()>, ) -> ( glutin::WindowedContext, glow::Context, ) { let window_builder = glutin::window::WindowBuilder::new() .with_resizable(true) .with_inner_size(glutin::dpi::LogicalSize { width: 800.0, height: 600.0, }) .with_title("egui_glow example"); let gl_window = unsafe { glutin::ContextBuilder::new() .with_depth_buffer(0) .with_stencil_buffer(0) .with_vsync(true) .build_windowed(window_builder, event_loop) .unwrap() .make_current() .unwrap() }; let gl = unsafe { glow::Context::from_loader_function(|s| gl_window.get_proc_address(s)) }; (gl_window, gl) }