diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2026-08-11 00:46:56 -0700 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2026-08-11 00:46:56 -0700 |
| commit | 6f67586b8fc6efdb86d0c9a9744c546da97c4dab (patch) | |
| tree | 2c0b328f7427efc5647cde810a361405d914a37c /src/ui.rs | |
| parent | 167e31655b63aa4d4548532cf0410cea9fd145ca (diff) | |
physics for sand and water
Diffstat (limited to 'src/ui.rs')
| -rw-r--r-- | src/ui.rs | 65 |
1 files changed, 48 insertions, 17 deletions
@@ -1,33 +1,64 @@ -use egui::Ui; +use egui::{Color32, Stroke, Ui, accesskit::ListStyle::Circle, epaint::CircleShape}; -use crate::{Config, Diagnostics, Input, State, camera::CameraState}; +use crate::{ + Config, Diagnostics, Input, + camera::Camera, + sim::materials::{MATERIALS, MaterialId}, +}; -pub fn draw_egui( +pub fn draw_egui<'a>( ui: &mut Ui, config: &mut Config, - state: &mut State, - camera: &mut CameraState, + camera: &mut Camera, diagnostics: &Diagnostics, input: &Input, ) { ui.heading("Config"); - ui.add(egui::Slider::new(&mut config.brush_size, 1..=100).text("Brush size")); + 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"); - ui.label(format!( - "Mouse: x,y=({x}, {y}), lmb_pressed={lmb}", - x = input.last_mouse_pos_on_screen.0, - y = input.last_mouse_pos_on_screen.1, - lmb = input.is_lmb_down - )); - ui.label(format!( - "Mouse (board): x,y=({x}, {y})", - x = input.last_mouse_pos_on_board.0, - y = input.last_mouse_pos_on_board.1, - )); + + 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,))); } |
