sprite.rs
1 use crate::gfx::math::{Vector2, Vector3}; 2 use crate::gfx::rect::Rect; 3 use crate::gfx::ZDepth; 4 5 #[repr(C)] 6 #[derive(Debug, Clone, Copy)] 7 pub struct Vertex(Vector3<f32>, Vector2<f32>); 8 9 pub struct Sprite { 10 w: u32, 11 h: u32, 12 buf: Vec<Vertex>, 13 } 14 15 impl Sprite { 16 pub fn new(w: u32, h: u32) -> Self { 17 Self { 18 w, 19 h, 20 buf: Vec::with_capacity(6), 21 } 22 } 23 24 pub fn set(&mut self, src: Rect<f32>, dst: Rect<f32>, z: ZDepth) { 25 let ZDepth(z) = z; 26 27 // Relative texture coordinates 28 let rx1: f32 = src.x1 / self.w as f32; 29 let ry1: f32 = src.y1 / self.h as f32; 30 let rx2: f32 = src.x2 / self.w as f32; 31 let ry2: f32 = src.y2 / self.h as f32; 32 33 self.buf.extend_from_slice(&[ 34 Vertex(Vector3::new(dst.x1, dst.y1, z), Vector2::new(rx1, ry2)), 35 Vertex(Vector3::new(dst.x2, dst.y1, z), Vector2::new(rx2, ry2)), 36 Vertex(Vector3::new(dst.x2, dst.y2, z), Vector2::new(rx2, ry1)), 37 Vertex(Vector3::new(dst.x1, dst.y1, z), Vector2::new(rx1, ry2)), 38 Vertex(Vector3::new(dst.x1, dst.y2, z), Vector2::new(rx1, ry1)), 39 Vertex(Vector3::new(dst.x2, dst.y2, z), Vector2::new(rx2, ry1)), 40 ]); 41 } 42 43 pub fn vertices(&self) -> Vec<Vertex> { 44 self.buf.clone() 45 } 46 47 pub fn clear(&mut self) { 48 self.buf.clear(); 49 } 50 }