From dd4f8fb20265c317833b36e1b5e19d93833daeda Mon Sep 17 00:00:00 2001 From: xfy Date: Thu, 16 Jul 2026 18:27:09 +0800 Subject: [PATCH] feat(ui): Planets control panel + dirty-flag respawn on seed/count/k --- src/ui.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/ui.rs b/src/ui.rs index 542b3a1..d5ea050 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -6,6 +6,7 @@ pub fn ui_system( mut params: ResMut, mut camera: ResMut, mut wants: ResMut, + mut planet_dirty: ResMut, ) { if let Ok(ctx) = contexts.ctx_mut() { egui::Window::new("Controls") @@ -53,6 +54,36 @@ pub fn ui_system( egui::Slider::new(&mut params.disk_temp, 1000.0..=50000.0).text("Temperature (K)"), ); }); + egui::CollapsingHeader::new("Planets") + .default_open(false) + .show(ui, |ui| { + // Record state before edits; if seed/count/k/enabled change, + // flag dirty so spawn_planet_system regenerates next frame. + // (time_scale excluded: it only scales orbit_system's time, + // no respawn needed.) + let prev = ( + params.planets_enabled, + params.planet_count_target, + params.planet_radius_factor, + params.planet_seed, + ); + ui.checkbox(&mut params.planets_enabled, "Enable"); + ui.add(egui::Slider::new(&mut params.planet_count_target, 0..=8).text("Count")); + ui.add(egui::Slider::new(&mut params.planet_radius_factor, 1.5..=5.0).text("Radius factor k")); + let isco = crate::physics::kerr_isco(params.spin); + ui.label(format!("ISCO: {:.3} → r = {:.3}", isco, params.planet_radius_factor * isco)); + ui.add(egui::Slider::new(&mut params.planet_seed, 0..=1000).text("Seed")); + ui.add(egui::Slider::new(&mut params.planet_time_scale, 1.0..=200.0).text("Time scale")); + let curr = ( + params.planets_enabled, + params.planet_count_target, + params.planet_radius_factor, + params.planet_seed, + ); + if curr != prev { + planet_dirty.0 = true; + } + }); egui::CollapsingHeader::new("Disk Turbulence") .default_open(true) .show(ui, |ui| {