From 827d7ac625a9afa1a6afee0c2e10e0afc1fcb162 Mon Sep 17 00:00:00 2001 From: core Date: Sat, 22 Nov 2025 09:45:47 -0500 Subject: [PATCH] chore: client refactoring --- crates/unified/src/client/input/mod.rs | 34 ++++++++++++ crates/unified/src/client/mod.rs | 62 ++++------------------ crates/unified/src/client/parts.rs | 3 +- crates/unified/src/client/rendering/mod.rs | 37 +++++++++++++ crates/unified/src/ecs.rs | 3 -- 5 files changed, 82 insertions(+), 57 deletions(-) create mode 100644 crates/unified/src/client/input/mod.rs create mode 100644 crates/unified/src/client/rendering/mod.rs diff --git a/crates/unified/src/client/input/mod.rs b/crates/unified/src/client/input/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..c6e8cd0bb2c1ca881ef0320286c022e455e6bdbe --- /dev/null +++ b/crates/unified/src/client/input/mod.rs @@ -0,0 +1,34 @@ +use bevy::app::{App, Update}; +use bevy::window::PrimaryWindow; +use crate::ecs::MainCamera; +use crate::prelude::*; + + +pub fn input_plugin(app: &mut App) { + app + .insert_resource(CursorWorldCoordinates(None)) + .add_systems(Update, update_cursor_position); +} + + +#[derive(Resource, Default)] +pub struct CursorWorldCoordinates(pub Option); + +fn update_cursor_position( + q_windows: Query<&Window, With>, + q_camera: Query<(&Camera, &GlobalTransform), With>, + mut coords: ResMut, +) { + let (camera, camera_transform) = q_camera.single().unwrap(); + let window = q_windows.single().unwrap(); + + if let Some(world_position) = window + .cursor_position() + .and_then(|cursor| camera.viewport_to_world(camera_transform, cursor).ok()) + .map(|ray| ray.origin.truncate()) + { + coords.0 = Some(world_position); + } else { + coords.0 = None; + } +} diff --git a/crates/unified/src/client/mod.rs b/crates/unified/src/client/mod.rs index cf49e6959ecffa771e49e1b173626c7708822c30..78be4cce4acc3ae167c318d23703509bbdf30b80 100644 --- a/crates/unified/src/client/mod.rs +++ b/crates/unified/src/client/mod.rs @@ -1,18 +1,13 @@ use crate::client::key_input::key_input_plugin; -use crate::client::net::set_config; use crate::client::parts::parts_plugin; use crate::client::planet::indicators::indicators_plugin; use crate::client::starfield::starfield_plugin; use crate::client::ui::ui_plugin; use crate::client::zoom::zoom_plugin; -use crate::ecs::{CursorWorldCoordinates, MainCamera, Part, Player}; +use crate::ecs::{Part, Player}; use aeronet_websocket::client::WebSocketClient; -use bevy::anti_alias::fxaa::Fxaa; -use bevy::core_pipeline::tonemapping::DebandDither; use bevy::dev_tools::picking_debug::DebugPickingMode; -use bevy::post_process::bloom::Bloom; use crate::prelude::*; -use bevy::window::PrimaryWindow; use planet::incoming_planets::incoming_planets_plugin; use crate::client::ship::attachment::client_attachment_plugin; use crate::ecs::Me; @@ -27,6 +22,8 @@ pub mod starfield; pub mod ui; pub mod zoom; pub mod ship; +mod rendering; +mod input; pub struct ClientPlugin { pub server: Option, @@ -35,7 +32,7 @@ impl Plugin for ClientPlugin { fn build(&self, app: &mut App) { let server = self.server.clone(); app - .insert_resource(CursorWorldCoordinates(None)) + .add_systems(Startup, move |mut commands: Commands| { let Some(server) = server.as_ref() else { return }; let config = net::websocket_config(); @@ -44,11 +41,10 @@ impl Plugin for ClientPlugin { .spawn(Name::new("default-session")) .queue(WebSocketClient::connect(config, server.clone())); }) - .add_systems(Startup, setup_graphics) - .add_systems(Update, update_cursor_position) - .add_systems(Update, follow_camera) + .add_plugins(rendering::render_plugin) + .add_plugins(input::input_plugin) .add_systems(Update, find_me) - .add_systems(Update, set_config) + .add_systems(Update, net::set_config) .add_plugins((incoming_planets_plugin, indicators_plugin)) .add_plugins(parts_plugin) .add_plugins(key_input_plugin) @@ -57,6 +53,8 @@ impl Plugin for ClientPlugin { .add_plugins(zoom_plugin) .add_plugins(client_attachment_plugin) .insert_resource(DebugPickingMode::Disabled); + + // These are only needed if we're actually doing network things if self.server.is_some() { app.add_observer(net::on_connecting) .add_observer(net::on_connected) @@ -92,45 +90,3 @@ fn find_me( } } -fn setup_graphics(mut commands: Commands) { - commands - .spawn(Camera2d) - .insert(Camera { - clear_color: ClearColorConfig::Custom(Color::BLACK), - ..default() - }) - .insert(Bloom::default()) - .insert(DebandDither::Enabled) - .insert(Fxaa::default()) - .insert(MainCamera); -} - -fn follow_camera( - mut camera: Query<&mut Transform, (With, Without)>, - player: Query<&Transform, With>, -) { - let mut camera = camera.single_mut().unwrap(); - let Ok(player) = player.single() else { - return; - }; - camera.translation = player.translation; -} - -fn update_cursor_position( - q_windows: Query<&Window, With>, - q_camera: Query<(&Camera, &GlobalTransform), With>, - mut coords: ResMut, -) { - let (camera, camera_transform) = q_camera.single().unwrap(); - let window = q_windows.single().unwrap(); - - if let Some(world_position) = window - .cursor_position() - .and_then(|cursor| camera.viewport_to_world(camera_transform, cursor).ok()) - .map(|ray| ray.origin.truncate()) - { - coords.0 = Some(world_position); - } else { - coords.0 = None; - } -} diff --git a/crates/unified/src/client/parts.rs b/crates/unified/src/client/parts.rs index a56675667a0f3db4029d1b781125db2011e2e498..ddb771c49410f3941fba336bf584089a9512ca7a 100644 --- a/crates/unified/src/client/parts.rs +++ b/crates/unified/src/client/parts.rs @@ -3,7 +3,8 @@ use std::f32::consts::PI; use crate::attachment::{Joint, JointOf, Joints, PartInShip, Peer, SnapOf, SnapOfJoint}; use crate::ecs::Me; use crate::client::colors::GREEN; -use crate::ecs::{CursorWorldCoordinates, DragRequestEvent, Part}; +use crate::ecs::{DragRequestEvent, Part}; +use crate::client::input::CursorWorldCoordinates; use bevy::color::palettes::css::{ORANGE, PURPLE, RED, YELLOW}; use crate::client::ship::attachment::AttachmentDebugRes; use crate::prelude::*; diff --git a/crates/unified/src/client/rendering/mod.rs b/crates/unified/src/client/rendering/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..881b1eb7fbd29c0aacd2cda1188f113694b03dd7 --- /dev/null +++ b/crates/unified/src/client/rendering/mod.rs @@ -0,0 +1,37 @@ +use bevy::anti_alias::fxaa::Fxaa; +use bevy::app::{App, Startup}; +use bevy::core_pipeline::tonemapping::DebandDither; +use bevy::post_process::bloom::Bloom; +use crate::ecs::{MainCamera, Me}; +use crate::prelude::*; + +pub fn render_plugin(app: &mut App) { + app + .add_systems(Startup, setup_graphics) + .add_systems(Update, follow_camera); +} + + +fn setup_graphics(mut commands: Commands) { + commands + .spawn(Camera2d) + .insert(Camera { + clear_color: ClearColorConfig::Custom(Color::BLACK), + ..default() + }) + .insert(Bloom::default()) + .insert(DebandDither::Enabled) + .insert(Fxaa::default()) + .insert(MainCamera); +} + +fn follow_camera( + mut camera: Query<&mut Transform, (With, Without)>, + player: Query<&Transform, With>, +) { + let mut camera = camera.single_mut().unwrap(); + let Ok(player) = player.single() else { + return; + }; + camera.translation = player.translation; +} \ No newline at end of file diff --git a/crates/unified/src/ecs.rs b/crates/unified/src/ecs.rs index e459e8c2d3e822480ade14557651184f1871c85f..6468ac6c9828092b214e3566337dee95bdca3a6b 100644 --- a/crates/unified/src/ecs.rs +++ b/crates/unified/src/ecs.rs @@ -20,9 +20,6 @@ pub struct FuelText; #[derive(Component)] pub struct PowerText; -#[derive(Resource, Default)] -pub struct CursorWorldCoordinates(pub Option); - #[derive(Debug, Deserialize, Message, Serialize)] pub enum ThrustEvent { Up(bool),