use egui::{Color32, Stroke, Ui, accesskit::ListStyle::Circle, epaint::CircleShape}; use crate::{ Config, Diagnostics, Input, camera::Camera, sim::materials::{MATERIALS, MaterialId}, }; pub fn draw_egui<'a>( ui: &mut Ui, config: &mut Config, camera: &mut Camera, diagnostics: &Diagnostics, input: &Input, ) { ui.heading("Config"); ui.add(egui::Slider::new(&mut config.brush_radius, 1..=100).text("Brush radius")); let material = MATERIALS[config.brush_material as usize]; // material combobox egui::ComboBox::from_label("Select a material") .selected_text(format!( "Material: [{}, d={}]", material.name, material.density, )) .icon(move |ui, rect, _, _| { ui.painter().add(egui::Shape::Circle( (CircleShape { center: rect.center(), radius: rect.width() / 2.5, stroke: Stroke::NONE, fill: Color32::from_rgb(material.r, material.g, material.b), }), )); }) .show_ui(ui, |ui| { ui.selectable_value(&mut config.brush_material, MaterialId::Void, "Void"); ui.selectable_value(&mut config.brush_material, MaterialId::Sand, "Sand"); ui.selectable_value(&mut config.brush_material, MaterialId::Water, "Water"); }); ui.add(egui::Slider::new(&mut config.fps, 1..=1000).text("Max FPS")); ui.checkbox(&mut config.show_ticks, "Visualize ticks"); ui.label(format!("Real FPS: {}", diagnostics.fps)); ui.heading("Camera"); ui.add(egui::Slider::new(&mut camera.zoom, 0.0..=10.0).text("Zoom")); ui.add(egui::Slider::new(&mut camera.x, -1000.0..=1000.0).text("X")); ui.add(egui::Slider::new(&mut camera.y, -1000.0..=1000.0).text("Y")); ui.heading("Input"); input.last_mouse_pos_on_screen.map(|p| { ui.label(format!( "Mouse: x,y=({x}, {y}), lmb_pressed={lmb}", x = p.0, y = p.1, lmb = input.is_lmb_pressed )) }); input .last_mouse_pos_on_board .map(|p| ui.label(format!("Mouse (board): x,y=({x}, {y})", x = p.0, y = p.1,))); }