use bevy::{prelude::*, render::{mesh::PrimitiveTopology, render_asset::RenderAssetUsages}, sprite::Mesh2d};
use crate::{usage_types::coordinates::Coordinate, VectorGrid};
pub trait ItemMesh2d: Sized {
fn generate(&self, at: Coordinate, grid: &VectorGrid<Self>) -> Mesh2d;
}
pub trait ItemMesh3d: Sized {
fn generate(&self, at: Coordinate, grid: &VectorGrid<Self>) -> Mesh;
}
impl<ItemType: ItemMesh3d> VectorGrid<ItemType> {
pub fn generate_mesh3d(&self) -> Mesh {
let mut result = Mesh::new(PrimitiveTopology::TriangleList, RenderAssetUsages::default());
for (i, item) in self.items().iter().enumerate() {
let coordinate = self.get_index_coordinate(i);
let item_mesh = item.generate(coordinate.clone(), &self).translated_by(coordinate.into());
match result.indices() {
Some(_) => {
result.merge(item_mesh)
},
None => result = item_mesh,
}
}
result
}
}