ui_image/
ui_image.rs

1use glam::dvec2;
2use vert::{
3    elements::{rect::Aabb, BindableTexture, Texture, Transform},
4    modules::{
5        arenas::OwnedKey,
6        batteries::{FlyCam, GraphicsSettingsController},
7        ui::{Align, Axis, Board, BoardInput, DivTexture, Len, MainAlign, Slider},
8        DefaultDependencies, DefaultModules, Schedule,
9    },
10    utils::Timing,
11    AppBuilder, Module,
12};
13
14fn main() {
15    let mut app = AppBuilder::new();
16    app.add_plugin(DefaultModules);
17    app.add::<FlyCam>();
18    app.add::<GraphicsSettingsController>();
19    app.add::<MyApp>();
20    app.run().unwrap();
21}
22
23struct MyApp {
24    deps: DefaultDependencies,
25    ui: Board,
26    value: f32,
27    image_key: OwnedKey<BindableTexture>,
28}
29
30impl Module for MyApp {
31    type Config = ();
32
33    type Dependencies = DefaultDependencies;
34
35    fn new(_config: Self::Config, mut deps: Self::Dependencies) -> anyhow::Result<Self> {
36        deps.bloom.settings_mut().activated = false;
37        deps.ui
38            .ui_renderer
39            .watch_shader_file("./src/modules/ui/ui.wgsl");
40
41        let img_bytes = std::fs::read("assets/test.png").unwrap();
42        let rgba = image::load_from_memory(&img_bytes).unwrap().to_rgba8();
43        let texture = Texture::from_image(&deps.ctx.device, &deps.ctx.queue, &rgba);
44
45        let bindable_texture = BindableTexture::new(&deps.ctx.device, texture);
46        let image_texture = deps.arenas.insert(bindable_texture);
47
48        Ok(MyApp {
49            deps,
50            ui: Board::new(dvec2(800.0, 800.0)),
51            image_key: image_texture,
52            value: 300.0,
53        })
54    }
55
56    fn intialize(handle: vert::Handle<Self>) -> anyhow::Result<()> {
57        let scheduler = handle.deps.scheduler.get_mut();
58        scheduler.register(handle, Schedule::Update, Timing::DEFAULT, Self::update);
59
60        Ok(())
61    }
62}
63
64impl MyApp {
65    fn update(&mut self) {
66        self.deps.gizmos.draw_xyz();
67        self.deps
68            .color_mesh
69            .draw_cubes(&[Transform::new(1.0, 1.0, 1.0)], None);
70
71        let size = self.deps.ctx.size;
72        self.ui.start_frame(
73            BoardInput::from_input_module(&self.deps.input),
74            dvec2(size.width as f64, size.height as f64),
75        );
76
77        let mut parent = self.ui.add_div("Parent", None);
78        parent.width(Len::PARENT);
79        parent.height(Len::PARENT);
80        parent.axis = Axis::X;
81        parent.main_align = MainAlign::Center;
82        parent.cross_align = Align::Center;
83        // parent.color = Color::RED.alpha(0.0);
84        let parent = Some(parent.id);
85
86        // show some image in the UI
87        let mut img = self.ui.add_div("img", parent);
88        img.width(Len::px(200.0));
89        img.height(Len::px(200.0));
90        img.texture = Some(DivTexture {
91            texture: self.image_key.key(),
92            uv: Aabb::UNIT,
93        });
94
95        // sow the slider
96        self.ui
97            .add(Slider::new(&mut self.value, 0.0, 400.0), "slider", parent);
98
99        self.ui.end_frame(&mut self.deps.ui.fonts);
100        self.deps.ui.ui_renderer.draw_ui_board(&self.ui);
101
102        // compare to Egui Widget (obviously a bit more polished)
103        let mut egui = self.deps.egui.context();
104        egui::Window::new("Value").show(&mut egui, |ui| {
105            ui.add(egui::Slider::new(&mut self.value, 0.0..=400.0));
106        });
107        // std::thread::sleep(Duration::from_millis(150));
108    }
109}