use crate::map::chunk::ChunkPos;
use crate::map::chunk::Chunks;
use bevy::ecs::entity::{EntityMapper, MapEntities};
#[cfg(feature = "reflect")]
use bevy::ecs::reflect::ReflectMapEntities;
#[cfg(feature = "reflect")]
use bevy::prelude::{Reflect, ReflectComponent};
use bevy::math::UVec2;
use bevy::prelude::{Component, Entity};
use lettuces::cell::Cell;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use super::MapData;
#[derive(Component, Default, Hash, Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "reflect", derive(Reflect))]
#[cfg_attr(feature = "reflect", reflect(Component, Hash, MapEntities))]
pub struct Tilemap {
chunks: Chunks,
}
impl MapEntities for Tilemap {
fn map_entities<M: EntityMapper>(&mut self, entity_mapper: &mut M) {
self.chunks.map_entities(entity_mapper);
}
}
impl Tilemap {
pub fn new(chunks: Chunks) -> Tilemap {
Self { chunks }
}
pub fn get_chunk_for_cell(&self, cell: Cell, map: &impl MapData) -> Option<Entity> {
self.get_chunk(map.into_chunk_pos(cell))
}
pub fn get_chunk(&self, chunk_pos: ChunkPos) -> Option<Entity> {
self.chunks.get_chunk(chunk_pos)
}
pub fn get_chunks_max_size(&self) -> UVec2 {
self.chunks.max_chunk_size()
}
pub fn chunks(&self) -> &Chunks {
&self.chunks
}
pub fn chunks_mut(&mut self) -> &mut Chunks {
&mut self.chunks
}
}