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 let parent = Some(parent.id);
85
86 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 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 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 }
109}