use crate::canvas::{Drawable, CanvasTextureHandle, CanvasImageHandle}; use std::sync::Arc; #[derive(Debug, Clone)] pub struct Sprite { pub vertices: [(f32, f32); 6], pub ti_position: [(f32, f32); 6], position: (f32, f32), size: (f32, f32), color: (f32, f32, f32, f32), textured: bool, texture_handle: Option>, } impl Sprite { pub fn new(position: (f32, f32), size: (f32, f32)) -> Sprite { Sprite::new_with_color(position, size, (0.,0.,0.,0.)) } pub fn new_with_color(position: (f32, f32), size: (f32, f32), color: (f32, f32, f32, f32)) -> Sprite { let fsize = (size.0 as f32, size.1 as f32); Sprite { vertices: [ (position.0, position.1 ), // top left (position.0, position.1 + fsize.1), // bottom left (position.0 + fsize.0, position.1 + fsize.1 ), // bottom right (position.0, position.1 ), // top left (position.0 + fsize.0, position.1 + fsize.1 ), // bottom right (position.0 + fsize.0, position.1 ), // top right ], position: position, ti_position: [ (-1.0, -1.0), // top left (-1.0, 1.0), // bottom left ( 1.0, 1.0), // bottom right (-1.0, -1.0), // top left ( 1.0, 1.0), // bottom right ( 1.0, -1.0), // top right ], size: size, color: color, textured: false, texture_handle: None } } pub fn new_with_texture(position: (f32, f32), size: (f32, f32), texture_handle: Arc) -> Sprite { let fsize = (size.0 as f32, size.1 as f32); Sprite { vertices: [ (position.0, position.1 ), // top left (position.0, position.1 + fsize.1), // bottom left (position.0 + fsize.0, position.1 + fsize.1 ), // bottom right (position.0, position.1 ), // top left (position.0 + fsize.0, position.1 + fsize.1 ), // bottom right (position.0 + fsize.0, position.1 ), // top right ], position: position, ti_position: [ (-1.0, -1.0), // top left (-1.0, 1.0), // bottom left ( 1.0, 1.0), // bottom right (-1.0, -1.0), // top left ( 1.0, 1.0), // bottom right ( 1.0, -1.0), // top right ], size: size, color: (0.0, 0.0, 0.0, 0.0), textured: true, texture_handle: Some(texture_handle.clone()) } } } impl Drawable for Sprite { fn get_vertices(&self) -> Vec<(f32,f32)> { self.vertices.to_vec() } fn get_color(&self) -> (f32, f32, f32, f32) { self.color.clone() } fn get_ti_coords(&self) -> Vec<(f32, f32)> { self.ti_position.to_vec() } fn get_texture_handle(&self) -> Option> { match self.textured { true => { self.texture_handle.clone() }, false => None, } } fn get_image_handle(&self) -> Option> { None } } /* let vertex_buffer = { CpuAccessibleBuffer::from_iter(self.device.clone(), BufferUsage::all(), [ ColoredVertex2D { position: [ 1.0, 1.0 ], color }, ColoredVertex2D { position: [ 1.0, 0.5 ], color }, ColoredVertex2D { position: [ 0.5, 0.5 ], color }, ColoredVertex2D { position: [ 0.5, 1.0 ], color }, ].iter().cloned()).unwrap() }; */