use bevy::prelude::*; use bevy_egui::egui; pub fn ui_system( mut contexts: bevy_egui::EguiContexts, mut params: ResMut, mut camera: ResMut, mut wants: ResMut, ) { if let Ok(ctx) = contexts.ctx_mut() { egui::Window::new("Controls") .collapsible(true) .default_pos([16.0, 16.0]) .show(ctx, |ui| { egui::CollapsingHeader::new("Camera") .default_open(true) .show(ui, |ui| { ui.add(egui::Slider::new(&mut camera.distance, 3.0..=200.0).text("Distance")); ui.add(egui::Slider::new(&mut camera.yaw, -std::f32::consts::PI..=std::f32::consts::PI).text("Yaw")); ui.add(egui::Slider::new(&mut camera.pitch, (-std::f32::consts::PI + 0.05)..=(std::f32::consts::PI - 0.05)).text("Pitch")); ui.add(egui::Slider::new(&mut camera.fov, 0.3..=2.0).text("FOV")); }); egui::CollapsingHeader::new("Black Hole") .default_open(true) .show(ui, |ui| { ui.add(egui::Slider::new(&mut params.spin, 0.0..=1.0).text("Spin (χ)")); ui.label(format!("ISCO (disk inner): {:.3}", crate::physics::kerr_isco(params.spin))); ui.label(format!("Horizon r+: {:.3}", crate::physics::kerr_horizon(params.spin))); }); egui::CollapsingHeader::new("Accretion Disk") .default_open(true) .show(ui, |ui| { // disk_inner removed — now spin-derived (see Black Hole section). ui.add(egui::Slider::new(&mut params.disk_outer, 6.0..=40.0).text("Outer radius")); ui.add(egui::Slider::new(&mut params.disk_tilt, 0.0..=std::f32::consts::PI).text("Tilt")); ui.add(egui::Slider::new(&mut params.disk_brightness, 0.0..=3.0).text("Brightness")); ui.add(egui::Slider::new(&mut params.disk_rotation_speed, 0.0..=3.0).text("Rotation speed")); }); egui::CollapsingHeader::new("Doppler").show(ui, |ui| { ui.checkbox(&mut params.doppler_enabled, "Enabled"); ui.add_enabled(params.doppler_enabled, egui::Slider::new(&mut params.doppler_strength, 0.0..=3.0).text("Strength")); }); egui::CollapsingHeader::new("Renderer").show(ui, |ui| { ui.add(egui::Slider::new(&mut params.steps, 50..=600).text("Steps")); ui.add(egui::Slider::new(&mut params.render_scale, 0.25..=1.0).text("Render scale")); }); egui::CollapsingHeader::new("Background").show(ui, |ui| { ui.add(egui::Slider::new(&mut params.star_intensity, 0.0..=3.0).text("Star intensity")); ui.add(egui::Slider::new(&mut params.skybox_intensity, 0.0..=3.0).text("Skybox intensity")); }); egui::CollapsingHeader::new("Grid").show(ui, |ui| { ui.checkbox(&mut params.grid_enabled, "Enabled"); ui.add_enabled(params.grid_enabled, egui::Slider::new(&mut params.grid_density, 0.1..=4.0).text("Density")); }); }); // egui captures pointer when the cursor is over a window or being interacted with. wants.0 = ctx.egui_wants_pointer_input(); } else { wants.0 = false; } }