52 lines
935 B
Rust
52 lines
935 B
Rust
use glam::Vec2;
|
|
|
|
#[derive(Default, Copy, Clone)]
|
|
pub struct Transform {
|
|
pub pos: Vec2,
|
|
pub transform: glam::Mat4,
|
|
|
|
pub dim: Vec2, // for convenience
|
|
}
|
|
|
|
const TRANSFORM_STACK_MAX: usize = 64;
|
|
pub struct TransformStack {
|
|
pub stack: [Transform; TRANSFORM_STACK_MAX],
|
|
top: u8,
|
|
}
|
|
|
|
impl TransformStack {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
stack: [Default::default(); TRANSFORM_STACK_MAX],
|
|
top: 1,
|
|
}
|
|
}
|
|
|
|
pub fn push(&mut self, mut t: Transform) {
|
|
assert!(self.top < TRANSFORM_STACK_MAX as u8);
|
|
let idx = (self.top - 1) as usize;
|
|
t.pos += self.stack[idx].pos;
|
|
self.stack[self.top as usize] = t;
|
|
self.top += 1;
|
|
}
|
|
|
|
pub fn pop(&mut self) {
|
|
assert!(self.top > 0);
|
|
self.top -= 1;
|
|
}
|
|
|
|
pub fn get(&self) -> &Transform {
|
|
&self.stack[(self.top - 1) as usize]
|
|
}
|
|
|
|
pub fn get_pos(&self) -> Vec2 {
|
|
self.stack[(self.top - 1) as usize].pos
|
|
}
|
|
}
|
|
|
|
impl Default for TransformStack {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|