~starkingdoms/starkingdoms

1e2654d85cd50357feede6126dee50657914fdc6 — core 6 days ago 011a026
netcode: remove interpolation
5 files changed, 2 insertions(+), 77 deletions(-)

D crates/unified/src/client/interpolation.rs
M crates/unified/src/client/mod.rs
M crates/unified/src/client/parts.rs
M crates/unified/src/client/planet/incoming_planets.rs
M crates/unified/src/server/priority.rs
D crates/unified/src/client/interpolation.rs => crates/unified/src/client/interpolation.rs +0 -69
@@ 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<Transform>>,
) {
    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),
        };
    }
}

M crates/unified/src/client/mod.rs => crates/unified/src/client/mod.rs +0 -2
@@ 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)

M crates/unified/src/client/parts.rs => crates/unified/src/client/parts.rs +0 -2
@@ 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);
    }

M crates/unified/src/client/planet/incoming_planets.rs => crates/unified/src/client/planet/incoming_planets.rs +1 -3
@@ 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");
    }
}

M crates/unified/src/server/priority.rs => crates/unified/src/server/priority.rs +1 -1
@@ 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);