use std::io::{StdoutLock, Write};
use crossterm::{cursor::MoveTo, queue, style::{Color, Print, SetForegroundColor}};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Pixel {
pub x: u16,
pub y: u16,
pub ch: char,
pub color: Color,
pub z: i32,
}
impl Pixel {
pub fn new(x: u16, y: u16, ch: char, color: Color, z: i32) -> Self {
Self { x, y, ch, color, z }
}
}
pub fn flush_pixels(stdout: &mut StdoutLock<'_>, pixels: &mut Vec<Pixel>) {
if pixels.is_empty() {
stdout.flush().ok();
return;
}
pixels.sort_by_key(|p| (p.z, p.y, p.x));
let mut last_color: Option<Color> = None;
for p in pixels.iter() {
if last_color != Some(p.color) {
queue!(stdout, SetForegroundColor(p.color)).unwrap();
last_color = Some(p.color);
}
queue!(stdout, MoveTo(p.x, p.y), Print(p.ch)).unwrap();
}
stdout.flush().unwrap();
pixels.clear();
}