From 6d86f6fdef3ca74c77d8432553c7dd0d6a5cdfe2 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Wed, 1 May 2024 23:23:44 +0200 Subject: [PATCH] toggle individual rules --- petri/src/lib.rs | 18 ++++++++++++++++-- uscope/src/main.rs | 14 +++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/petri/src/lib.rs b/petri/src/lib.rs index 39d25ee..a1ddf42 100644 --- a/petri/src/lib.rs +++ b/petri/src/lib.rs @@ -20,7 +20,7 @@ pub struct Chunk { pub struct Rule { pub from: RulePattern, pub to: RulePattern, - // enabled: bool + pub enabled: bool, // probability: u8 // flip: // rotate: @@ -29,6 +29,7 @@ pub struct Rule { impl Rule { pub fn new() -> Self { Self { + enabled: false, from: RulePattern::new(), to: RulePattern::new(), } @@ -72,6 +73,7 @@ impl Dish { rules: vec![ Rule { + enabled: true, from: RulePattern { width: 1, height: 2, @@ -84,6 +86,7 @@ impl Dish { }, }, Rule { + enabled: true, from: RulePattern { width: 2, height: 2, @@ -96,6 +99,7 @@ impl Dish { }, }, Rule { + enabled: true, from: RulePattern { width: 2, height: 2, @@ -117,7 +121,17 @@ impl Dish { } let x = random::() % CHUNK_SIZE; let y = random::() % CHUNK_SIZE; - let rule = random::() % self.rules.len(); + let enabled_rules = self + .rules + .iter() + .enumerate() + .filter_map(|(i, r)| r.enabled.then_some(i)) + .collect::>(); + if enabled_rules.is_empty() { + return; + } + let rule = random::() % enabled_rules.len(); + let rule = enabled_rules[rule]; self.fire_rule(rule, x, y); } diff --git a/uscope/src/main.rs b/uscope/src/main.rs index 39312ca..48e462f 100644 --- a/uscope/src/main.rs +++ b/uscope/src/main.rs @@ -33,7 +33,7 @@ impl UScope { fn new(_cc: &eframe::CreationContext<'_>) -> Self { Self { dish: Dish::new(), - speed: 100, + speed: 250, brush: Cell(1), celltypes: vec![ CellData::new("air", 0, 0, 0), @@ -51,7 +51,10 @@ impl eframe::App for UScope { } SidePanel::left("left_panel").show(ctx, |ui| { ui.heading("Simulation"); + ui.label("speed"); ui.add(Slider::new(&mut self.speed, 0..=5000)); + ui.separator(); + ui.heading("Cells"); for (i, cell) in self.celltypes.iter_mut().enumerate() { ui.horizontal(|ui| { @@ -70,13 +73,16 @@ impl eframe::App for UScope { let name = format!("cell #{}", self.celltypes.len()); self.celltypes.push(CellData { name, color }) } + ui.separator(); + ui.heading("Rules"); let mut to_remove = None; for (i, rule) in self.dish.rules.iter_mut().enumerate() { - if ui.button("x").clicked() { + rule_editor(ui, rule, &self.celltypes); + if ui.button("delete").clicked() { to_remove = Some(i); } - rule_editor(ui, rule, &self.celltypes); + ui.separator(); } if let Some(i) = to_remove { self.dish.rules.remove(i); @@ -118,6 +124,8 @@ fn paint_chunk(painter: Painter, chunk: &Chunk, cells: &[CellData]) { const CSIZE: f32 = 24.; const OUTLINE: (f32, Color32) = (3., Color32::GRAY); fn rule_editor(ui: &mut Ui, rule: &mut Rule, cells: &[CellData]) { + ui.checkbox(&mut rule.enabled, "enable rule"); + let cells_y = rule.from.height(); let cells_x = rule.from.width(); let margin = 8.;