use super::{Face, Transform3D, Vec3D, ViewElement3D};
use crate::elements::view::ColChar;
pub struct Grid3D {
pub transform: Transform3D,
pub cell_size: f64,
pub cell_count: usize,
generated_vertices: Vec<Vec3D>,
generated_faces: Vec<Face>,
pub fill_char: ColChar,
}
impl Grid3D {
pub fn new(cell_size: f64, cell_count: usize, fill_char: ColChar) -> Grid3D {
let mut tmp = Grid3D {
transform: Transform3D::DEFAULT,
cell_size,
cell_count,
generated_vertices: vec![],
generated_faces: vec![],
fill_char,
};
tmp.reload();
tmp
}
pub fn reload(&mut self) {
let cell_count = self.cell_count as isize;
let cell_size = self.cell_size;
self.generated_vertices = [-1, 1]
.iter()
.flat_map(move |p| {
(-cell_count / 2..=cell_count / 2).flat_map(move |b| {
let side = (cell_count / 2 * p) as f64 * cell_size;
let point_on_side = b as f64 * cell_size;
[
Vec3D::new(side, 0.0, point_on_side),
Vec3D::new(point_on_side, 0.0, side),
]
})
})
.collect();
self.generated_faces = (0..self.generated_vertices.len() / 2)
.map(|i| {
Face::new(
vec![i, i + self.generated_vertices.len() / 2],
self.fill_char,
)
})
.collect();
}
}
impl ViewElement3D for Grid3D {
fn get_transform(&self) -> Transform3D {
self.transform
}
fn get_vertices(&self) -> &[Vec3D] {
&self.generated_vertices
}
fn get_faces(&self) -> &[Face] {
&self.generated_faces
}
}