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
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(()) |
|
} |
|
}
|
|
|