demo_glium/
demo_glium.rs

1use winit::{event::{Event, WindowEvent}, event_loop::{EventLoop, ControlFlow}};
2use thyme::{bench};
3
4mod demo;
5
6/// A basic RPG character sheet, using the glium backend.
7/// This file contains the application setup code and wgpu specifics.
8/// the `demo.rs` file contains the Thyme UI code and logic.
9/// A simple party creator and character sheet for an RPG.
10fn main() -> Result<(), Box<dyn std::error::Error>> {
11    use glium::glutin::{window::WindowBuilder};
12    use glium::{Display, Surface};
13
14    // initialize our very basic logger so error messages go to stdout
15    thyme::log::init(log::Level::Warn).unwrap();
16
17    let window_size = [1280.0, 720.0];
18    let events_loop = EventLoop::new();
19
20    // create glium display
21    let builder = WindowBuilder::new()
22        .with_title("Thyme Demo")
23        .with_inner_size(glium::glutin::dpi::LogicalSize::new(window_size[0], window_size[1]));
24    let context = glium::glutin::ContextBuilder::new();
25    let display = Display::new(builder, context, &events_loop)?;
26
27    // create thyme backend
28    let mut renderer = thyme::GliumRenderer::new(&display)?;
29    let mut io = thyme::WinitIo::new(&events_loop, window_size.into())?;
30    let mut context_builder = thyme::ContextBuilder::with_defaults();
31
32    demo::register_assets(&mut context_builder);
33
34    let mut context = context_builder.build(&mut renderer, &mut io)?;
35
36    let mut party = demo::Party::default();
37
38    let mut last_frame = std::time::Instant::now();
39    let frame_time = std::time::Duration::from_millis(16);
40    
41    // run main loop
42    events_loop.run(move |event, _, control_flow| match event {
43        Event::MainEventsCleared => {
44            if std::time::Instant::now() > last_frame + frame_time {
45                display.gl_window().window().request_redraw();
46            }
47            *control_flow = ControlFlow::WaitUntil(last_frame + frame_time);
48        },
49        Event::RedrawRequested(_) => {
50            last_frame = std::time::Instant::now();
51
52            party.check_context_changes(&mut context, &mut renderer);
53
54            let mut target = display.draw();
55            target.clear_color(0.21404, 0.21404, 0.21404, 1.0); // manual sRGB conversion for 0.5
56
57            bench::run("thyme", || {
58                display.gl_window().window().set_cursor_visible(!party.theme_has_mouse_cursor());
59
60                let mut ui = context.create_frame();
61
62                bench::run("frame", || {
63                    demo::build_ui(&mut ui, &mut party);
64                });
65
66                bench::run("draw", || {
67                    renderer.draw_frame(&mut target, ui).unwrap();
68                });
69            });
70
71            target.finish().unwrap();
72        },
73        Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => *control_flow = ControlFlow::Exit,
74        event => {
75            io.handle_event(&mut context, &event);
76        }
77    })
78}