/ src / sprite.rs
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  }