Skip to main content

ursus_ecs/components/
transform_interpolation.rs

1use 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}