use crate::{
core::{CanDraw, Canvas, ColChar, Vec2D},
primitives::Pixel,
};
use super::CanCollide;
#[derive(Debug, Clone)]
pub struct PixelContainer {
pub pixels: Vec<Pixel>,
}
impl Default for PixelContainer {
fn default() -> Self {
Self::new()
}
}
impl PixelContainer {
#[must_use]
pub const fn new() -> Self {
Self { pixels: vec![] }
}
pub fn plot(&mut self, pos: Vec2D, c: ColChar) {
self.pixels.push(Pixel::new(pos, c));
}
pub fn append(&mut self, pixels: &mut Vec<Pixel>) {
self.pixels.append(pixels);
}
pub fn append_points(&mut self, points: &[Vec2D], fill_char: ColChar) {
for point in points {
self.plot(*point, fill_char);
}
}
pub fn draw(&mut self, element: &impl CanDraw) {
element.draw_to(self);
}
}
impl From<&[Pixel]> for PixelContainer {
fn from(pixels: &[Pixel]) -> Self {
Self {
pixels: pixels.to_vec(),
}
}
}
impl<E: CanDraw> From<&E> for PixelContainer {
fn from(element: &E) -> Self {
let mut container = Self::new();
container.draw(element);
container
}
}
impl From<(&[Vec2D], ColChar)> for PixelContainer {
fn from(value: (&[Vec2D], ColChar)) -> Self {
Self {
pixels: value
.0
.iter()
.map(|pos| Pixel::new(*pos, value.1))
.collect(),
}
}
}
impl Canvas for PixelContainer {
fn plot(&mut self, pos: Vec2D, c: ColChar) {
self.plot(pos, c);
}
}
impl CanDraw for PixelContainer {
fn draw_to(&self, canvas: &mut impl Canvas) {
for pixel in &self.pixels {
canvas.plot(pixel.pos, pixel.fill_char);
}
}
}
impl CanCollide for PixelContainer {
fn collides_with_pos(&self, pos: Vec2D) -> bool {
self.pixels.iter().any(|p| p.pos == pos)
}
}