#[cfg(feature = "serialize")]
use serde::{
Deserialize,
Serialize,
};
use crate::types::{
Model,
Palette,
Size,
Version,
Voxel,
};
pub type VoxData = VoxModels<Model>;
impl VoxModelBuffer for Model {
fn new(size: Size) -> Self {
Model {
size,
voxels: vec![],
}
}
fn set_voxel(&mut self, voxel: Voxel, _palette: &Palette) {
self.voxels.push(voxel);
}
}
pub trait VoxBuffer {
fn set_version(&mut self, _version: Version) {}
fn set_num_models(&mut self, _num_models: usize) {}
fn set_model_size(&mut self, _model_size: Size) {}
fn set_voxel(&mut self, voxel: Voxel);
fn set_palette(&mut self, palette: Palette);
}
pub trait VoxModelBuffer {
fn new(size: Size) -> Self;
fn set_voxel(&mut self, voxel: Voxel, palette: &Palette);
}
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub struct VoxModels<V> {
pub version: Version,
pub models: Vec<V>,
pub palette: Palette,
}
impl<V> Default for VoxModels<V> {
fn default() -> Self {
Self {
version: Version::default(),
models: vec![],
palette: Palette::default(),
}
}
}
impl<V: VoxModelBuffer> VoxBuffer for VoxModels<V> {
fn set_version(&mut self, version: Version) {
self.version = version;
}
fn set_num_models(&mut self, num_models: usize) {
self.models.reserve_exact(num_models);
}
fn set_model_size(&mut self, model_size: Size) {
self.models.push(V::new(model_size));
}
fn set_voxel(&mut self, voxel: Voxel) {
let model = self.models.last_mut().expect("model");
model.set_voxel(voxel, &self.palette);
}
fn set_palette(&mut self, palette: Palette) {
self.palette = palette;
}
}