summaryrefslogtreecommitdiff
path: root/src/ui.rs
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2026-08-11 00:46:56 -0700
committerKai Stevenson <kai@kaistevenson.com>2026-08-11 00:46:56 -0700
commit6f67586b8fc6efdb86d0c9a9744c546da97c4dab (patch)
tree2c0b328f7427efc5647cde810a361405d914a37c /src/ui.rs
parent167e31655b63aa4d4548532cf0410cea9fd145ca (diff)
physics for sand and water
Diffstat (limited to 'src/ui.rs')
-rw-r--r--src/ui.rs65
1 files changed, 48 insertions, 17 deletions
diff --git a/src/ui.rs b/src/ui.rs
index d55c5fb..dbdfa69 100644
--- a/src/ui.rs
+++ b/src/ui.rs
@@ -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,)));
}