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.2 KiB
62 lines
2.2 KiB
6 years ago
|
use crate::vertex_2d::{ColoredVertex2D, Vertex2D};
|
||
|
use std::sync::Arc;
|
||
|
use std::collections::HashMap;
|
||
|
use crate::canvas::Drawable;
|
||
|
|
||
|
pub struct CanvasFrame {
|
||
|
pub colored_drawables: Vec<ColoredVertex2D>,
|
||
|
pub textured_drawables: HashMap<Arc<u32>, Vec<Vec<Vertex2D>>>,
|
||
|
pub image_drawables: HashMap<Arc<u32>, 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],
|
||
|
}
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|