You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.2 KiB

use bevy::math::IVec3;
use super::{palette_storage::PaletteStorage, BloxelStore, BloxelStoreMut};
use crate::bloxel::math::USize3;
pub struct PaletteBloxelStorage<T: Copy + Eq> {
size: USize3,
data: PaletteStorage<T>,
}
impl<T: Copy + Eq> PaletteBloxelStorage<T> {
pub fn new(size: USize3, fill: T) -> Self {
let len = size.width.get() * size.height.get() * size.depth.get();
let data = PaletteStorage::new(len as usize, fill);
Self { size, data }
}
pub fn new_with_default(size: USize3) -> Self
where
T: Default,
{
Self::new(size, Default::default())
}
pub fn get_used_count(&self, value: T) -> usize {
self.data.get_used_count(value)
}
}
impl<T: Copy + Eq> BloxelStore<T> for PaletteBloxelStorage<T> {
fn size(&self) -> USize3 {
self.size
}
fn get(&self, pos: IVec3) -> Option<T> {
self.size
.ivec3_to_index(pos)
.map(|index| self.data.get(index))
}
}
impl<T: Copy + Eq> BloxelStoreMut<T> for PaletteBloxelStorage<T> {
fn set(&mut self, pos: IVec3, value: T) -> Result<T, ()> {
self.size
.ivec3_to_index(pos)
.map(|index| self.data.set(index, value))
.ok_or(())
}
}