From 1e2654d85cd50357feede6126dee50657914fdc6 Mon Sep 17 00:00:00 2001 From: core Date: Thu, 11 Jun 2026 00:37:16 -0400 Subject: [PATCH] netcode: remove interpolation --- crates/unified/src/client/interpolation.rs | 69 ------------------- crates/unified/src/client/mod.rs | 2 - crates/unified/src/client/parts.rs | 2 - .../src/client/planet/incoming_planets.rs | 4 +- crates/unified/src/server/priority.rs | 2 +- 5 files changed, 2 insertions(+), 77 deletions(-) delete mode 100644 crates/unified/src/client/interpolation.rs diff --git a/crates/unified/src/client/interpolation.rs b/crates/unified/src/client/interpolation.rs deleted file mode 100644 index aba35f6f661c06c8dfe706f50037706aa9bc14e1..0000000000000000000000000000000000000000 --- a/crates/unified/src/client/interpolation.rs +++ /dev/null @@ -1,69 +0,0 @@ -use std::time::Duration; -use bevy_replicon::client::confirm_history::ConfirmHistory; -use bevy_replicon::prelude::RepliconTick; -use web_time::Instant; -use crate::prelude::*; -use crate::shared::plugins::TICK_RATE; - -const MAX_INTERPOLATION_DURATION: Duration = Duration::from_millis(500); - -#[derive(Component)] -pub struct TransformInterpolation { - start: Transform, - end: Transform, - end_tick: RepliconTick, - duration: Duration, - end_received_at: Instant, -} - -impl TransformInterpolation { - pub fn new(transform: Transform, tick: RepliconTick) -> Self { - Self { - start: transform, - end: transform, - end_tick: tick, - duration: Duration::ZERO, - end_received_at: Instant::now(), - } - } -} - -pub fn transform_interpolation_plugin(app: &mut App) { - app.add_systems(Update, (record_transform_changes, apply_transform_interpolation).chain()); -} - -// must run before `apply_transform_interpolation` -fn record_transform_changes( - mut entities: Query<(&Transform, &ConfirmHistory, &mut TransformInterpolation), Changed>, -) { - let now = Instant::now(); - for (transform, confirm_history, mut interpolation) in &mut entities { - let tick = confirm_history.last_tick(); - let tick_delta = tick - interpolation.end_tick; - let duration = Duration::from_secs_f64(tick_delta as f64 / TICK_RATE).min(MAX_INTERPOLATION_DURATION); - - interpolation.start = interpolation.end; - interpolation.end = *transform; - interpolation.end_tick = tick; - interpolation.duration = duration; - interpolation.end_received_at = now; - } -} - -fn apply_transform_interpolation(mut entities: Query<(&mut Transform, &TransformInterpolation)>) { - let now = Instant::now(); - for (mut transform, interpolation) in &mut entities { - let t = if interpolation.duration > Duration::ZERO { - (now.duration_since(interpolation.end_received_at).as_secs_f64() / interpolation.duration.as_secs_f64()) - .clamp(0.0, 1.0) as f32 - } else { - 1.0 - }; - - *transform.bypass_change_detection() = Transform { - translation: interpolation.start.translation.lerp(interpolation.end.translation, t), - rotation: interpolation.start.rotation.slerp(interpolation.end.rotation, t), - scale: interpolation.start.scale.lerp(interpolation.end.scale, t), - }; - } -} diff --git a/crates/unified/src/client/mod.rs b/crates/unified/src/client/mod.rs index 1fe189d27dc07fb110c1f763b6899081fc69264d..ea59b3e05cdc3e324b71efba77164cee50f60261 100644 --- a/crates/unified/src/client/mod.rs +++ b/crates/unified/src/client/mod.rs @@ -45,7 +45,6 @@ use wasm_bindgen_futures::JsFuture; use crate::shared::config::planet::Planet; pub mod colors; -pub mod interpolation; pub mod key_input; pub mod parts; pub mod planet; @@ -73,7 +72,6 @@ impl Plugin for ClientPlugin { .add_plugins(ship::thrusters::client_thrusters_plugin) .add_plugins((incoming_planets_plugin, indicators_plugin)) .add_plugins(parts_plugin) - .add_plugins(interpolation::transform_interpolation_plugin) .add_plugins(key_input_plugin) .add_plugins(starfield_plugin) .add_plugins(ui_plugin) diff --git a/crates/unified/src/client/parts.rs b/crates/unified/src/client/parts.rs index b404e319a1e9ebc4365f91b7657a8dc0ffac35f8..a78fd0d62ee3719846988939bb75e160534c842d 100644 --- a/crates/unified/src/client/parts.rs +++ b/crates/unified/src/client/parts.rs @@ -8,7 +8,6 @@ use crate::shared::ecs::{DragAction, DragRequestEvent, Part, MAIN_LAYER}; use crate::client::input::CursorWorldCoordinates; use bevy::color::palettes::css::{ORANGE, PURPLE, RED, YELLOW}; use crate::client::components::Me; -use crate::client::interpolation::TransformInterpolation; use crate::client::ship::attachment::AttachmentDebugRes; use crate::prelude::*; use bevy_replicon::client::confirm_history::ConfirmHistory; @@ -60,7 +59,6 @@ fn handle_incoming_parts( .insert(MAIN_LAYER) .insert(sprite) .insert(Pickable::default()) - .insert(TransformInterpolation::new(*transform, confirm_history.last_tick())) .observe(on_part_click) .observe(open_crafting_ui); } diff --git a/crates/unified/src/client/planet/incoming_planets.rs b/crates/unified/src/client/planet/incoming_planets.rs index 9c20717a250ca23b1f9b7f31961c6f8dd57a55f2..2ffc7f289016934c46deaf755bf28131dc9b5316 100644 --- a/crates/unified/src/client/planet/incoming_planets.rs +++ b/crates/unified/src/client/planet/incoming_planets.rs @@ -1,4 +1,3 @@ -use crate::client::interpolation::TransformInterpolation; use crate::shared::config::planet::{Planet, SpecialSpriteProperties}; use crate::prelude::*; use crate::shared::ecs::{MAIN_STAR_LAYERS}; @@ -25,8 +24,7 @@ fn handle_incoming_planets( for (new_entity, new_planet, transform, confirm_history) in new_planets.iter() { commands.entity(new_entity) .insert(MAIN_STAR_LAYERS.clone()) - .insert(build_planet_sprite(new_planet, &asset_server)) - .insert(TransformInterpolation::new(*transform, confirm_history.last_tick())); + .insert(build_planet_sprite(new_planet, &asset_server)); trace!(?new_planet, "prepared new planet"); } } diff --git a/crates/unified/src/server/priority.rs b/crates/unified/src/server/priority.rs index 50d65496387c179c33d7b538e6383cf58455b33e..5854c2c7ef2c681321c231a8701fd102d49636d9 100644 --- a/crates/unified/src/server/priority.rs +++ b/crates/unified/src/server/priority.rs @@ -4,7 +4,7 @@ use crate::server::ConnectedNetworkEntity; use crate::shared::attachment::Parts; use crate::shared::ecs::{Part, Player}; -const OTHER_SHIP_PART_PRIORITY: f32 = 0.25; +const OTHER_SHIP_PART_PRIORITY: f32 = 1.0; pub fn replication_priority_plugin(app: &mut App) { app.add_systems(Update, prioritize_own_ship_parts);