pub mod chunk;
mod tilemap;
use bevy::{
math::UVec2,
prelude::{Component, Entity},
utils::HashMap,
};
use chunk::{Chunk, ChunkLayer, ChunkPos};
use lettuces::cell::Cell;
use std::hash::Hash;
pub use tilemap::Tilemap;
pub trait MapLayer: Default {
fn to_bits(&self) -> u32;
fn all_bits() -> u32;
}
impl<L: MapLayer> MapLayer for &L
where
for<'a> &'a L: Default,
{
fn to_bits(&self) -> u32 {
L::to_bits(self)
}
fn all_bits() -> u32 {
L::all_bits()
}
}
pub trait MapData: Hash + Component {
#[allow(clippy::wrong_self_convention)]
fn into_chunk_pos(&self, cell: Cell) -> ChunkPos;
fn max_chunk_size(&self) -> UVec2;
fn break_data_vecs_down_into_chunk_data<TileData>(
&self,
data: &[Vec<TileData>],
chunk_pos: ChunkPos,
max_chunk_size: UVec2,
) -> Vec<Vec<TileData>>
where
TileData: Clone + Copy + Sized + Default + Send + Sync + 'static;
fn break_data_vecs_into_chunks<TileData, MapChunk>(
&self,
data: &[Vec<TileData>],
max_chunk_size: UVec2,
chunk_settings: MapChunk::ChunkSettings,
) -> Vec<Vec<Chunk<MapChunk, TileData>>>
where
TileData: Hash + Clone + Copy + Sized + Default + Send + Sync + 'static,
MapChunk: ChunkLayer<TileData> + Send + Sync + 'static + Default;
fn break_hashmap_into_chunks<TileData, MapChunk>(
&self,
map_layer: impl MapLayer,
data: &HashMap<Cell, TileData>,
map_size: UVec2,
max_chunk_size: UVec2,
chunk_settings: MapChunk::ChunkSettings,
) -> Vec<Vec<Chunk<MapChunk, TileData>>>
where
TileData: Hash + Clone + Copy + Sized + Default + Send + Sync + 'static,
MapChunk: ChunkLayer<TileData> + Send + Sync + 'static + Default;
fn add_entities_to_layer<TileData, MapChunk>(
&self,
map_layer: u32,
chunks: &mut Vec<Vec<Chunk<MapChunk, TileData>>>,
entities: &HashMap<Cell, Entity>,
) where
TileData: Hash + Clone + Copy + Sized + Default + Send + Sync + 'static,
MapChunk: ChunkLayer<TileData> + Send + Sync + 'static + Default,
{
for (cell, entity) in entities.iter() {
let chunk_pos = self.into_chunk_pos(*cell);
let chunk = &mut chunks[chunk_pos.y() as usize][chunk_pos.x() as usize];
chunk.set_tile_entity(
map_layer,
MapChunk::into_chunk_cell(*cell, &chunk.chunk_settings),
*entity,
);
}
}
}