use super::Resources;
use crate::{data::Data, error::NoDataError, Vertex};
use anyhow::Result;
use vulkano::buffer::Subbuffer;
#[derive(Clone, Debug, PartialEq)]
pub struct ModelData {
vertex_sub_buffer: Subbuffer<[Vertex]>,
index_sub_buffer: Subbuffer<[u32]>,
data: Data,
}
impl ModelData {
pub fn new(data: Data, resources: &Resources) -> Result<Self> {
if data.is_empty() {
return Err(NoDataError.into());
}
let loader = resources.loader().lock();
let vertex_sub_buffer = loader
.vertex_buffer_allocator
.allocate_slice(data.vertices.clone().len() as _)?;
let index_sub_buffer = loader
.index_buffer_allocator
.allocate_slice(data.indices.clone().len() as _)?;
vertex_sub_buffer.write()?.copy_from_slice(&data.vertices);
index_sub_buffer.write()?.copy_from_slice(&data.indices);
Ok(Self {
vertex_sub_buffer,
index_sub_buffer,
data,
})
}
pub fn get_data(&self) -> &Data {
&self.data
}
pub fn get_size(&self) -> usize {
self.data.indices.len()
}
pub(crate) fn get_vertex_buffer(&self) -> Subbuffer<[Vertex]> {
self.vertex_sub_buffer.clone()
}
pub(crate) fn get_index_buffer(&self) -> Subbuffer<[u32]> {
self.index_sub_buffer.clone()
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum Model {
Custom(ModelData),
Square,
Triangle,
}
impl Default for Model {
fn default() -> Self {
Self::Square
}
}