Dairy-Drift/imgui_glow_renderer/examples/glow_03_triangle_gles.rs

85 lines
3.2 KiB
Rust

//! A basic example showing imgui rendering on top of a simple custom scene
//! using OpenGL ES, rather than full-fat OpenGL.
//!
//! Note this example uses `Renderer` rather than `AutoRenderer` and
//! therefore requries more lifetime-management of the OpenGL context.
use std::time::Instant;
mod utils;
use utils::Triangler;
fn main() {
let (event_loop, window) = utils::create_window(
"Hello, triangle! (GLES 3.0)",
glutin::GlRequest::Specific(glutin::Api::OpenGlEs, (3, 0)),
);
let (mut winit_platform, mut imgui_context) = utils::imgui_init(&window);
let gl = utils::glow_context(&window);
// When using `Renderer`, we need to create a texture map
let mut texture_map = imgui_glow_renderer::SimpleTextureMap::default();
// When using `Renderer`, we specify whether or not to output sRGB colors.
// Since we're drawing to screen and using OpenGL ES (which doesn't support
// `GL_FRAMEBUFFER_SRGB`) then we do need to convert to sRGB in the shader.
let mut ig_renderer =
imgui_glow_renderer::Renderer::initialize(&gl, &mut imgui_context, &mut texture_map, true)
.expect("failed to create renderer");
// Note the shader header now needs a precision specifier
let tri_renderer = Triangler::new(&gl, "#version 300 es\nprecision mediump float;");
let mut last_frame = Instant::now();
event_loop.run(move |event, _, control_flow| {
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(_) => {
// Draw custom scene
tri_renderer.render(&gl);
let ui = imgui_context.frame();
ui.show_demo_window(&mut true);
winit_platform.prepare_render(ui, window.window());
let draw_data = imgui_context.render();
// Render imgui on top
ig_renderer
.render(&gl, &texture_map, 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;
}
glutin::event::Event::LoopDestroyed => {
tri_renderer.destroy(&gl);
// Note, to be good citizens we should manually call destroy
// when the renderer does not own the GL context
ig_renderer.destroy(&gl);
}
event => {
winit_platform.handle_event(imgui_context.io_mut(), window.window(), &event);
}
}
});
}