Compare commits
No commits in common. "6d86f6fdef3ca74c77d8432553c7dd0d6a5cdfe2" and "79cd0a8fe42d16c68733d2d26b470e7bd338f8ab" have entirely different histories.
6d86f6fdef
...
79cd0a8fe4
2 changed files with 6 additions and 38 deletions
|
@ -20,7 +20,7 @@ pub struct Chunk {
|
||||||
pub struct Rule {
|
pub struct Rule {
|
||||||
pub from: RulePattern,
|
pub from: RulePattern,
|
||||||
pub to: RulePattern,
|
pub to: RulePattern,
|
||||||
pub enabled: bool,
|
// enabled: bool
|
||||||
// probability: u8
|
// probability: u8
|
||||||
// flip:
|
// flip:
|
||||||
// rotate:
|
// rotate:
|
||||||
|
@ -29,7 +29,6 @@ pub struct Rule {
|
||||||
impl Rule {
|
impl Rule {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
enabled: false,
|
|
||||||
from: RulePattern::new(),
|
from: RulePattern::new(),
|
||||||
to: RulePattern::new(),
|
to: RulePattern::new(),
|
||||||
}
|
}
|
||||||
|
@ -73,7 +72,6 @@ impl Dish {
|
||||||
|
|
||||||
rules: vec![
|
rules: vec![
|
||||||
Rule {
|
Rule {
|
||||||
enabled: true,
|
|
||||||
from: RulePattern {
|
from: RulePattern {
|
||||||
width: 1,
|
width: 1,
|
||||||
height: 2,
|
height: 2,
|
||||||
|
@ -86,7 +84,6 @@ impl Dish {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Rule {
|
Rule {
|
||||||
enabled: true,
|
|
||||||
from: RulePattern {
|
from: RulePattern {
|
||||||
width: 2,
|
width: 2,
|
||||||
height: 2,
|
height: 2,
|
||||||
|
@ -99,7 +96,6 @@ impl Dish {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Rule {
|
Rule {
|
||||||
enabled: true,
|
|
||||||
from: RulePattern {
|
from: RulePattern {
|
||||||
width: 2,
|
width: 2,
|
||||||
height: 2,
|
height: 2,
|
||||||
|
@ -116,22 +112,10 @@ impl Dish {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fire_blindly(&mut self) {
|
pub fn fire_blindly(&mut self) {
|
||||||
if self.rules.is_empty() {
|
assert!(!self.rules.is_empty());
|
||||||
return;
|
|
||||||
}
|
|
||||||
let x = random::<usize>() % CHUNK_SIZE;
|
let x = random::<usize>() % CHUNK_SIZE;
|
||||||
let y = random::<usize>() % CHUNK_SIZE;
|
let y = random::<usize>() % CHUNK_SIZE;
|
||||||
let enabled_rules = self
|
let rule = random::<usize>() % self.rules.len();
|
||||||
.rules
|
|
||||||
.iter()
|
|
||||||
.enumerate()
|
|
||||||
.filter_map(|(i, r)| r.enabled.then_some(i))
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
if enabled_rules.is_empty() {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let rule = random::<usize>() % enabled_rules.len();
|
|
||||||
let rule = enabled_rules[rule];
|
|
||||||
self.fire_rule(rule, x, y);
|
self.fire_rule(rule, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ impl UScope {
|
||||||
fn new(_cc: &eframe::CreationContext<'_>) -> Self {
|
fn new(_cc: &eframe::CreationContext<'_>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
dish: Dish::new(),
|
dish: Dish::new(),
|
||||||
speed: 250,
|
speed: 100,
|
||||||
brush: Cell(1),
|
brush: Cell(1),
|
||||||
celltypes: vec![
|
celltypes: vec![
|
||||||
CellData::new("air", 0, 0, 0),
|
CellData::new("air", 0, 0, 0),
|
||||||
|
@ -51,10 +51,7 @@ impl eframe::App for UScope {
|
||||||
}
|
}
|
||||||
SidePanel::left("left_panel").show(ctx, |ui| {
|
SidePanel::left("left_panel").show(ctx, |ui| {
|
||||||
ui.heading("Simulation");
|
ui.heading("Simulation");
|
||||||
ui.label("speed");
|
|
||||||
ui.add(Slider::new(&mut self.speed, 0..=5000));
|
ui.add(Slider::new(&mut self.speed, 0..=5000));
|
||||||
ui.separator();
|
|
||||||
|
|
||||||
ui.heading("Cells");
|
ui.heading("Cells");
|
||||||
for (i, cell) in self.celltypes.iter_mut().enumerate() {
|
for (i, cell) in self.celltypes.iter_mut().enumerate() {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
|
@ -64,7 +61,6 @@ impl eframe::App for UScope {
|
||||||
ui.color_edit_button_srgba(&mut cell.color);
|
ui.color_edit_button_srgba(&mut cell.color);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if ui.button("add cell").clicked() {
|
if ui.button("add cell").clicked() {
|
||||||
let h = random::<f32>();
|
let h = random::<f32>();
|
||||||
let s = random::<f32>() * 0.5 + 0.5;
|
let s = random::<f32>() * 0.5 + 0.5;
|
||||||
|
@ -73,19 +69,9 @@ impl eframe::App for UScope {
|
||||||
let name = format!("cell #{}", self.celltypes.len());
|
let name = format!("cell #{}", self.celltypes.len());
|
||||||
self.celltypes.push(CellData { name, color })
|
self.celltypes.push(CellData { name, color })
|
||||||
}
|
}
|
||||||
ui.separator();
|
|
||||||
|
|
||||||
ui.heading("Rules");
|
ui.heading("Rules");
|
||||||
let mut to_remove = None;
|
for rule in &mut self.dish.rules {
|
||||||
for (i, rule) in self.dish.rules.iter_mut().enumerate() {
|
|
||||||
rule_editor(ui, rule, &self.celltypes);
|
rule_editor(ui, rule, &self.celltypes);
|
||||||
if ui.button("delete").clicked() {
|
|
||||||
to_remove = Some(i);
|
|
||||||
}
|
|
||||||
ui.separator();
|
|
||||||
}
|
|
||||||
if let Some(i) = to_remove {
|
|
||||||
self.dish.rules.remove(i);
|
|
||||||
}
|
}
|
||||||
if ui.button("add rule").clicked() {
|
if ui.button("add rule").clicked() {
|
||||||
self.dish.rules.push(Rule::new());
|
self.dish.rules.push(Rule::new());
|
||||||
|
@ -122,10 +108,8 @@ fn paint_chunk(painter: Painter, chunk: &Chunk, cells: &[CellData]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const CSIZE: f32 = 24.;
|
const CSIZE: f32 = 24.;
|
||||||
const OUTLINE: (f32, Color32) = (3., Color32::GRAY);
|
const OUTLINE: (f32, Color32) = (1., Color32::GRAY);
|
||||||
fn rule_editor(ui: &mut Ui, rule: &mut Rule, cells: &[CellData]) {
|
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_y = rule.from.height();
|
||||||
let cells_x = rule.from.width();
|
let cells_x = rule.from.width();
|
||||||
let margin = 8.;
|
let margin = 8.;
|
||||||
|
|
Loading…
Reference in a new issue