use bevy::window::WindowResized; use crate::{ecs::{Me, StarguideCamera, StarguideOrbit, StarguideOrbitImage}, prelude::*}; use bevy::render::render_resource::Extent3d; pub fn starguide_orbit_plugin(app: &mut App) { app .add_systems(Update, (update_orbits, window_resize)); } fn update_orbits( orbit_image: Res, mut images: ResMut>, camera: Single<(&Camera, &GlobalTransform, &Projection), With>, me: Single<&Transform, (With, Without)>, orbit: Single<&Transform, (With, Without, Without)>, ) { let Some(image) = images.get_mut(&orbit_image.0) else { error!("Orbit prediction image not found"); return }; let Projection::Orthographic(ref projection) = camera.2.clone() else { return }; image.clear(&(Color::WHITE.to_srgba().to_u8_array())); let player_pos = me.translation - orbit.translation; let player_pos = Vec3::new(player_pos.x, -player_pos.y, player_pos.z); let player_pos = (player_pos / projection.scale).truncate(); let player_pos = player_pos + image.size_f32()/2.0; let player_pos = player_pos.as_uvec2(); for i in (player_pos.x)..(player_pos.x+100) { if !(i >= image.size().x || player_pos.y >= image.size().y) { image.set_color_at(i, player_pos.y, Color::linear_rgb(1.0, 0.0, 0.0)).unwrap(); } } } fn window_resize( orbit_image: Res, mut images: ResMut>, mut resize_ev: MessageReader, camera: Single<&Camera, With>, ) { let Some(image) = images.get_mut(&orbit_image.0) else { error!("Orbit prediction image not found"); return }; for _ in resize_ev.read() { let Some(Vec2 {x: width, y: height}) = camera.logical_viewport_size() else { continue }; image.resize(Extent3d { width: width as u32, height: height as u32, depth_or_array_layers: 1, }); } }