use std::time::{Duration};
use avian2d::parry::transformation::utils::transform;
use crate::prelude::*;
pub fn interpolation_plugin(app: &mut App) {
app
.add_systems(Update, update_interpolation_info)
.add_systems(Update, do_interpolation);
}
#[derive(Component, Debug)]
pub struct TransformInterpolationInfo {
pub last_dt: Duration,
pub this_tick_start: bevy::platform::time::Instant,
pub latest_transform: Transform,
pub last_transform: Transform,
}
fn update_interpolation_info(
mut interpolation_query: Query<(&Transform, &mut TransformInterpolationInfo), Changed<Transform>>,
time: Res<Time>,
) {
for (transform, mut info) in interpolation_query.iter_mut() {
info.last_dt = info.this_tick_start.elapsed();
info.this_tick_start = bevy::platform::time::Instant::now();
info.last_transform = info.latest_transform;
info.latest_transform = transform.clone();
}
}
fn do_interpolation(
mut interpolation_query: Query<(&mut Transform, &TransformInterpolationInfo)>,
) {
for (mut transform, info) in &mut interpolation_query {
let dt = bevy::platform::time::Instant::now() - info.this_tick_start;
let progress = dt.as_secs_f32() / info.last_dt.as_secs_f32(); // should be between 0.0 and 1.0
transform.bypass_change_detection().translation = info.last_transform.translation + progress * (info.latest_transform.translation - info.last_transform.translation);
}
}