use bevy::{prelude::*, render::{mesh::PrimitiveTopology, render_asset::RenderAssetUsages}};
use crate::{air::Air, usage_types::coordinates::Coordinate, VectorGrid};
use super::{item_mesh::ItemMesh3d, Transparent};
pub trait VoxelMesher: Air + Transparent {
fn generate(&self, visible_sides: [bool; 6]) -> Mesh;
}
const SURROUNDING_OFFSETS: [[isize; 3]; 6] = [
[-1, 0, 0],
[1, 0, 0],
[0, -1, 0],
[0, 1, 0],
[0, 0, -1],
[0, 0, 1],
];
impl<T: VoxelMesher> ItemMesh3d for T {
fn generate(&self, at: Coordinate, grid: &VectorGrid<Self>) -> Mesh {
if self.is_air() {
return Mesh::new(PrimitiveTopology::TriangleList, RenderAssetUsages::default());
}
let mut visible_sides: [bool; 6] = [false; 6];
let at: Coordinate = at.into();
for (i, offset) in SURROUNDING_OFFSETS.iter().enumerate() {
visible_sides[i] = grid.get(&Coordinate::new(offset.to_vec()).plus(&at)).unwrap_or(&T::default()).is_transparent();
}
println!("Visible sides: {:?}", visible_sides);
self.generate(visible_sides)
}
}