ursus_ecs/components/
transform_interpolation.rs1use crate::components::transform::Transform;
2use glam::{Mat4, Quat, Vec3};
3
4#[derive(Debug, Clone, Copy)]
5pub struct TransformInterpolation {
6 prev_position: Vec3,
7 prev_rotation: Quat,
8 prev_scale: Vec3,
9}
10
11impl TransformInterpolation {
12 pub fn sync(&mut self, current: &Transform) {
13 self.prev_position = current.position;
14 self.prev_rotation = current.rotation;
15 self.prev_scale = current.scale;
16 }
17
18 pub fn interpolate(&self, current: &Transform, alpha: f32) -> Mat4 {
19 let position = self.prev_position.lerp(current.position, alpha);
20 let rotation = self.prev_rotation.slerp(current.rotation, alpha);
21 let scale = self.prev_scale.lerp(current.scale, alpha);
22 Mat4::from_scale_rotation_translation(scale, rotation, position)
23 }
24}
25
26impl Default for TransformInterpolation {
27 fn default() -> Self {
28 Self { prev_position: Vec3::ZERO, prev_rotation: Quat::IDENTITY, prev_scale: Vec3::ONE }
29 }
30}