You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
2.3 KiB
62 lines
2.3 KiB
use crate::vertex_2d::{ColoredVertex2D, Vertex2D};
|
|
use std::sync::Arc;
|
|
use std::collections::HashMap;
|
|
use crate::canvas::{Drawable, CanvasTextureHandle, CanvasImage, CanvasImageHandle};
|
|
|
|
pub struct CanvasFrame {
|
|
pub colored_drawables: Vec<ColoredVertex2D>,
|
|
pub textured_drawables: HashMap<Arc<CanvasTextureHandle>, Vec<Vec<Vertex2D>>>,
|
|
pub image_drawables: HashMap<Arc<CanvasImageHandle>, Vec<Vec<Vertex2D>>>,
|
|
}
|
|
|
|
impl CanvasFrame {
|
|
pub fn new() -> CanvasFrame {
|
|
CanvasFrame {
|
|
colored_drawables: vec![],
|
|
textured_drawables: Default::default(),
|
|
image_drawables: Default::default(),
|
|
}
|
|
}
|
|
|
|
// Accumulates the drawables vertices and colors
|
|
pub fn draw(&mut self, drawable: &dyn Drawable) {
|
|
match drawable.get_texture_handle() {
|
|
Some(handle) => {
|
|
self.textured_drawables
|
|
.entry(handle.clone())
|
|
.or_insert(Vec::new())
|
|
.push(drawable.get_vertices().iter().map(|n|
|
|
Vertex2D {
|
|
position: [n.0, n.1],
|
|
}
|
|
).collect::<Vec<Vertex2D>>());
|
|
}
|
|
None => {
|
|
match drawable.get_image_handle() {
|
|
Some(handle) => {
|
|
self.image_drawables
|
|
.entry(handle.clone())
|
|
.or_insert(Vec::new())
|
|
.push(drawable.get_vertices().iter().map(|n|
|
|
Vertex2D {
|
|
position: [n.0, n.1],
|
|
}
|
|
).collect());
|
|
}
|
|
None => {
|
|
let colors = drawable.get_color();
|
|
|
|
self.colored_drawables.extend(
|
|
drawable.get_vertices().iter().map(|n|
|
|
ColoredVertex2D {
|
|
position: [n.0, n.1],
|
|
color: [colors.0, colors.1, colors.2, colors.3],
|
|
}
|
|
)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |