From ea69ba5aab7133cd404706ac280f061b89ed7fb2 Mon Sep 17 00:00:00 2001 From: core Date: Sat, 5 Jul 2025 01:00:38 -0400 Subject: [PATCH] feat: indicators --- Cargo.lock | 1 + crates/unified/Cargo.toml | 2 + crates/unified/assets/config/planets.pc.toml | 3 + crates/unified/src/client/mod.rs | 7 +- .../client/{ => planet}/incoming_planets.rs | 0 .../unified/src/client/planet/indicators.rs | 65 +++++++++++++++++++ crates/unified/src/client/planet/mod.rs | 2 + crates/unified/src/config/planet.rs | 1 + crates/unified/src/server/player.rs | 8 +-- 9 files changed, 82 insertions(+), 7 deletions(-) rename crates/unified/src/client/{ => planet}/incoming_planets.rs (100%) create mode 100644 crates/unified/src/client/planet/indicators.rs create mode 100644 crates/unified/src/client/planet/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 9b627f8ef7d8eadf2662f49975c8e7923997046d..5e961084abc1c9b76935aa7fad0f57cd9604de42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7658,6 +7658,7 @@ dependencies = [ "console_error_panic_hook", "getrandom 0.3.3", "log", + "ordered-float 5.0.0", "rand 0.9.1", "serde", "tracing-subscriber", diff --git a/crates/unified/Cargo.toml b/crates/unified/Cargo.toml index 72027883a1da8861cc24e87880d7c3f99595f13e..ee7c021908de20351b213fabf882d88b1e6cf2b4 100644 --- a/crates/unified/Cargo.toml +++ b/crates/unified/Cargo.toml @@ -51,6 +51,8 @@ aeronet_websocket = { version = "0.14", features = ["client"] } bevy_enoki = "0.4" +ordered-float = "5" + [target.'cfg(not(target_arch = "wasm32"))'.dependencies] [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/crates/unified/assets/config/planets.pc.toml b/crates/unified/assets/config/planets.pc.toml index 1d21a0c62abafcb0efe4c26afc2921f90c08cdb4..bff67bb7ffc300171a04da458ce90e9a1cf97ded 100644 --- a/crates/unified/assets/config/planets.pc.toml +++ b/crates/unified/assets/config/planets.pc.toml @@ -22,6 +22,7 @@ default_transform = [216_999.6, 0.0, 0.0] [[planets]] name = "Earth" sprite = "textures/earth.png" +indicator_sprite = "textures/earth_icon.png" radius = 1000.0 # m mass = 10_000.0 # kg default_transform = [300_000.0, 0.0, 0.0] @@ -29,6 +30,7 @@ default_transform = [300_000.0, 0.0, 0.0] [[planets]] name = "Moon" sprite = "textures/moon.png" +indicator_sprite = "textures/moon_icon.png" radius = 272.7 # m mass = 123.082_143_245 # kg default_transform = [301_541.4, 0.0, 0.0] @@ -36,6 +38,7 @@ default_transform = [301_541.4, 0.0, 0.0] [[planets]] name = "Mars" sprite = "textures/mars.png" +indicator_sprite = "textures/mars_icon.png" radius = 531.0 # m mass = 1_070.519_602 # kg default_transform = [457_100.0, 0.0, 0.0] diff --git a/crates/unified/src/client/mod.rs b/crates/unified/src/client/mod.rs index e151370c6e0b684d8b2cff004bf880a56a657054..3a1e353e9701c204f418518646186c0a52f4d993 100644 --- a/crates/unified/src/client/mod.rs +++ b/crates/unified/src/client/mod.rs @@ -1,15 +1,15 @@ mod colors; mod incoming_particles; mod incoming_parts; -mod incoming_planets; mod key_input; mod net; mod starfield; mod ui; +mod planet; use crate::client::incoming_particles::replicated_particles_plugin; use crate::client::incoming_parts::incoming_parts_plugin; -use crate::client::incoming_planets::incoming_planets_plugin; +use planet::incoming_planets::incoming_planets_plugin; use crate::client::key_input::key_input_plugin; use crate::client::starfield::starfield_plugin; use crate::client::ui::ui_plugin; @@ -19,6 +19,7 @@ use bevy::core_pipeline::fxaa::Fxaa; use bevy::prelude::*; use bevy::window::PrimaryWindow; use bevy_replicon::shared::server_entity_map::ServerEntityMap; +use crate::client::planet::indicators::indicators_plugin; pub struct ClientPlugin { pub server: String, @@ -41,7 +42,7 @@ impl Plugin for ClientPlugin { .add_systems(Update, update_cursor_position) .add_systems(Update, follow_camera) .add_systems(Update, find_me) - .add_plugins(incoming_planets_plugin) + .add_plugins((incoming_planets_plugin, indicators_plugin)) .add_plugins(incoming_parts_plugin) .add_plugins(key_input_plugin) .add_plugins(starfield_plugin) diff --git a/crates/unified/src/client/incoming_planets.rs b/crates/unified/src/client/planet/incoming_planets.rs similarity index 100% rename from crates/unified/src/client/incoming_planets.rs rename to crates/unified/src/client/planet/incoming_planets.rs diff --git a/crates/unified/src/client/planet/indicators.rs b/crates/unified/src/client/planet/indicators.rs new file mode 100644 index 0000000000000000000000000000000000000000..b8a6fd310fef97f7e8dfd039db39ce1db142440d --- /dev/null +++ b/crates/unified/src/client/planet/indicators.rs @@ -0,0 +1,65 @@ +use bevy::prelude::*; +use bevy::window::PrimaryWindow; +use ordered_float::OrderedFloat; +use crate::client::Me; +use crate::config::planet::Planet; + +pub fn indicators_plugin(app: &mut App) { + app.add_systems(PreUpdate, (add_indicators, update_indicators)) + .add_systems(Update, update_indicators_position); +} + +#[derive(Component)] +struct PlanetIndicator(String); +#[derive(Component)] +struct HasIndicator(Entity); + +fn add_indicators(planets_wo_indicators: Query<(Entity, &Planet), Without>, player: Query>, asset_server: Res, mut commands: Commands) { + let Ok(me) = player.single() else { return; }; + for (planet, planet_data) in &planets_wo_indicators { + let Some(indicator_url) = &planet_data.indicator_sprite else { continue }; + let mut sprite = Sprite::from_image(asset_server.load(indicator_url)); + sprite.custom_size = Some(Vec2::new(50.0, 50.0)); + let indicator = commands.spawn(( + ChildOf(me), + PlanetIndicator(planet_data.name.clone()), + sprite, + Transform::from_xyz(0.0, 0.0, 0.0) + )).id(); + commands.entity(planet).insert(HasIndicator(indicator)); + } +} +fn update_indicators(changed_planets_w_indicators: Query<(&Planet, &HasIndicator), Changed>, asset_server: Res, mut commands: Commands) { + for (planet_data, indicator) in changed_planets_w_indicators.iter() { + let Some(indicator_sprite) = &planet_data.indicator_sprite else { continue; }; + let mut sprite = Sprite::from_image(asset_server.load(indicator_sprite)); + sprite.custom_size = Some(Vec2::new(50.0, 50.0)); + commands.entity(indicator.0) + .remove::() + .insert(sprite); + } +} +fn update_indicators_position( + planets_w_indicator: Query<(&Transform, &HasIndicator), Without>, + player: Query<&Transform, (With, Without)>, + mut indicators: Query<(&mut Transform), (With, Without, Without)>, + window: Query<&Window, With>, +) +{ + let Ok(player_position) = player.single() else { return; }; + let window = window.single().unwrap(); + + for (planet_position, indicator_id) in &planets_w_indicator { + let mut offset = planet_position.translation - player_position.translation; + let half_window_height = window.height() / 2.0 - 25.0; + let half_window_width = window.width() / 2.0 - 25.0; + offset.x = offset.x.clamp(-half_window_width, half_window_width); + offset.y = offset.y.clamp(-half_window_height, half_window_height); + + let Ok(mut this_indicator) = indicators.get_mut(indicator_id.0) else { continue; }; + + let inv_rot = player_position.rotation.inverse(); + this_indicator.translation = inv_rot.mul_vec3(Vec3::new(offset.x, offset.y, 0.0)); + this_indicator.rotation = inv_rot; + } +} \ No newline at end of file diff --git a/crates/unified/src/client/planet/mod.rs b/crates/unified/src/client/planet/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..d30672ab3a2eeef5d563f998819cbe00b7973b49 --- /dev/null +++ b/crates/unified/src/client/planet/mod.rs @@ -0,0 +1,2 @@ +pub mod incoming_planets; +pub mod indicators; \ No newline at end of file diff --git a/crates/unified/src/config/planet.rs b/crates/unified/src/config/planet.rs index 30786b411a76552fa714a2e17c6a537f5614edca..c0835a50986fe980fdaae29be66129adc3431880 100644 --- a/crates/unified/src/config/planet.rs +++ b/crates/unified/src/config/planet.rs @@ -8,6 +8,7 @@ use serde::{Deserialize, Serialize}; pub struct Planet { pub name: String, pub sprite: String, + pub indicator_sprite: Option, pub radius: f32, pub mass: f32, pub default_transform: [f32; 3], diff --git a/crates/unified/src/server/player.rs b/crates/unified/src/server/player.rs index fb390bb626dcc80fa7c4c86b2ca57045d52ab357..e1f217672f77cfbc1ded350d0090acbf85fb3832 100644 --- a/crates/unified/src/server/player.rs +++ b/crates/unified/src/server/player.rs @@ -81,7 +81,7 @@ fn handle_new_players( ( Particles { effect: "particles/ship_thruster.particle.ron".to_string(), - active: true + active: false }, Transform::from_xyz( -wc.part.default_width / 2.0 + 5.0, @@ -95,7 +95,7 @@ fn handle_new_players( ( Particles { effect: "particles/ship_thruster.particle.ron".to_string(), - active: true + active: false }, Transform::from_xyz( wc.part.default_width / 2.0 - 5.0, @@ -109,7 +109,7 @@ fn handle_new_players( ( Particles { effect: "particles/ship_thruster.particle.ron".to_string(), - active: true + active: false }, Transform::from_xyz( -wc.part.default_width / 2.0 + 5.0, @@ -122,7 +122,7 @@ fn handle_new_players( ( Particles { effect: "particles/ship_thruster.particle.ron".to_string(), - active: true + active: false }, Transform::from_xyz( wc.part.default_width / 2.0 - 5.0,