atagen

monolith

public
Star0
Watch0
de1e9f21296c48217cae4e7a7dd6e1d6e6d1e20d
1
ssh://brewery@pls.lobotomise.me:33/atagen/monolith.git

Blame: crates/motion/src/timeline.rs

b563d2da1c80atagen2026-10-16 08:25 UTC1
/// A plan's place in time. Every phase lasts `phase_ns`.
b563d2da1c80atagen2026-10-16 08:25 UTC2
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
b563d2da1c80atagen2026-10-16 08:25 UTC3
pub struct Timeline {
b563d2da1c80atagen2026-10-16 08:25 UTC4
    pub start_ns: u64,
b563d2da1c80atagen2026-10-16 08:25 UTC5
    pub phase_ns: u64,
b563d2da1c80atagen2026-10-16 08:25 UTC6
    pub phases: usize,
b563d2da1c80atagen2026-10-16 08:25 UTC7
}
b563d2da1c80atagen2026-10-16 08:25 UTC8
b563d2da1c80atagen2026-10-16 08:25 UTC9
#[derive(Clone, Copy, Debug, PartialEq)]
b563d2da1c80atagen2026-10-16 08:25 UTC10
pub enum Position {
b563d2da1c80atagen2026-10-16 08:25 UTC11
    NotStarted,
b563d2da1c80atagen2026-10-16 08:25 UTC12
    /// Inside `phase`, with linear time `t` in [0, 1) before easing.
b563d2da1c80atagen2026-10-16 08:25 UTC13
    Phase {
b563d2da1c80atagen2026-10-16 08:25 UTC14
        phase: usize,
b563d2da1c80atagen2026-10-16 08:25 UTC15
        t: f64,
b563d2da1c80atagen2026-10-16 08:25 UTC16
    },
b563d2da1c80atagen2026-10-16 08:25 UTC17
    Finished,
b563d2da1c80atagen2026-10-16 08:25 UTC18
}
b563d2da1c80atagen2026-10-16 08:25 UTC19
b563d2da1c80atagen2026-10-16 08:25 UTC20
impl Timeline {
b563d2da1c80atagen2026-10-16 08:25 UTC21
    pub fn end_ns(&self) -> u64 {
b563d2da1c80atagen2026-10-16 08:25 UTC22
        self.start_ns + self.phase_ns * self.phases as u64
b563d2da1c80atagen2026-10-16 08:25 UTC23
    }
b563d2da1c80atagen2026-10-16 08:25 UTC24
b563d2da1c80atagen2026-10-16 08:25 UTC25
    pub fn locate(&self, now_ns: u64) -> Position {
b563d2da1c80atagen2026-10-16 08:25 UTC26
        if now_ns < self.start_ns {
b563d2da1c80atagen2026-10-16 08:25 UTC27
            return Position::NotStarted;
b563d2da1c80atagen2026-10-16 08:25 UTC28
        }
b563d2da1c80atagen2026-10-16 08:25 UTC29
        if self.phase_ns == 0 || now_ns >= self.end_ns() {
b563d2da1c80atagen2026-10-16 08:25 UTC30
            return Position::Finished;
b563d2da1c80atagen2026-10-16 08:25 UTC31
        }
b563d2da1c80atagen2026-10-16 08:25 UTC32
        let elapsed = now_ns - self.start_ns;
b563d2da1c80atagen2026-10-16 08:25 UTC33
        let phase = (elapsed / self.phase_ns) as usize;
b563d2da1c80atagen2026-10-16 08:25 UTC34
        let t = (elapsed % self.phase_ns) as f64 / self.phase_ns as f64;
b563d2da1c80atagen2026-10-16 08:25 UTC35
        Position::Phase { phase, t }
b563d2da1c80atagen2026-10-16 08:25 UTC36
    }
b563d2da1c80atagen2026-10-16 08:25 UTC37
}