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, pub textured_drawables: HashMap, Vec>>, pub image_drawables: HashMap, Vec>>, } 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::>()); } 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], } ) ); } } } } } }