feat(ui): Planets control panel + dirty-flag respawn on seed/count/k

This commit is contained in:
xfy 2026-07-16 18:27:09 +08:00
parent ec69698530
commit dd4f8fb202

View File

@ -6,6 +6,7 @@ pub fn ui_system(
mut params: ResMut<crate::params::BlackHoleParams>, mut params: ResMut<crate::params::BlackHoleParams>,
mut camera: ResMut<crate::camera::OrbitCamera>, mut camera: ResMut<crate::camera::OrbitCamera>,
mut wants: ResMut<crate::camera::WantsPointer>, mut wants: ResMut<crate::camera::WantsPointer>,
mut planet_dirty: ResMut<crate::scene::planets::PlanetSystemDirty>,
) { ) {
if let Ok(ctx) = contexts.ctx_mut() { if let Ok(ctx) = contexts.ctx_mut() {
egui::Window::new("Controls") 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::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") egui::CollapsingHeader::new("Disk Turbulence")
.default_open(true) .default_open(true)
.show(ui, |ui| { .show(ui, |ui| {