tegrine 0.1.3

Draw in a Terminal -- Ordered with Instances -> Dots like 2D Vertex/Pixels
Documentation
//! The entire purpose of Tegrine: Draw


#![allow(unused)]


mod line;


use crate::instances::{ D2, Tegrine };
use anyhow::Result;
use crossterm::{
	cursor, execute, queue,
	style::{self, Color, Print},
	terminal::{self, ClearType},
};
use std::io::stdout;


impl Tegrine {
	pub fn draw_pixel(&mut self, ins: usize, d: usize, mut pos: D2) {
		pos.x += 1 + self.x[ins].pos.x;
		pos.y += 1 + self.x[ins].pos.y;

		if pos.within_max(&self.ws) {
			self.b[pos.y as usize][pos.x as usize] = Some((ins, d));
		}
	}


	fn flush(&mut self, cur: &D2) -> Result<()> {
		let mut out = stdout();

		queue!(out, cursor::Hide, terminal::Clear(ClearType::All))?;

		for (y, d) in self.b.iter().enumerate() {
			for (x, d) in d.iter().enumerate() {
				if let Some((ins, d)) = d {
					let o = &self.x[*ins].dots[*d].color;

					if o.a != 0 {
						queue!(
							out,
							cursor::MoveTo(1 + x as u16, 1 + y as u16),
							style::SetBackgroundColor(Color::Rgb {
								r: o.r,
								g: o.g,
								b: o.b
							}),
							Print(' '),
							style::ResetColor
						)?;
					}
				}
			}
		}

		execute!(
			out,
			cursor::MoveTo(1 + cur.x as u16, 1 + cur.y as u16),
			cursor::Show
		)?;

		Ok(())
	}


	pub fn draw(&mut self, cur: &D2) -> Result<()> {
		self.b = vec![vec![None; self.ws.x as usize]; self.ws.y as usize];

		for ins in 0..self.x.len() {
			for d in 0..self.x[ins].dots.len() {
				// Neighbors
				for x in self.x[ins].dots[d].neighbors.clone() {
					self.draw_line(
						ins,
						d,
						self.x[ins].dots[d].pos.clone(),
						self.x[ins].dots[x].pos.clone(),
					);
				}
				// Text
				// Shape

				self.draw_pixel(ins, d, self.x[ins].dots[d].pos.clone());
			}
		}

		self.flush(cur)?;

		Ok(())
	}
}