|
|
|
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<Arc<CanvasTextureHandle>>,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Container class which implements drawable.
|
|
|
|
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: [
|
|
|
|
(-0.0, -0.0), // top left
|
|
|
|
(-0.0, 1.0), // bottom left
|
|
|
|
( 1.0, 1.0), // bottom right
|
|
|
|
(-0.0, -0.0), // top left
|
|
|
|
( 1.0, 1.0), // bottom right
|
|
|
|
( 1.0, -0.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<CanvasTextureHandle>) -> 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: [
|
|
|
|
(-0.0, -0.0), // top left
|
|
|
|
(-0.0, 1.0), // bottom left
|
|
|
|
( 1.0, 1.0), // bottom right
|
|
|
|
(-0.0, -0.0), // top left
|
|
|
|
( 1.0, 1.0), // bottom right
|
|
|
|
( 1.0, -0.0), // top right
|
|
|
|
],
|
|
|
|
size: size,
|
|
|
|
color: (1.0, 0.0, 0.0, 1.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<Arc<CanvasTextureHandle>> {
|
|
|
|
match self.textured {
|
|
|
|
true => {
|
|
|
|
self.texture_handle.clone()
|
|
|
|
},
|
|
|
|
false => None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn get_image_handle(&self) -> Option<Arc<CanvasImageHandle>> {
|
|
|
|
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()
|
|
|
|
};
|
|
|
|
|
|
|
|
*/
|