use crate::{BufferData, BufferDataAccessor, BufferIndexAccessor, Texture, Vertices};
use crate::{BufferDescriptor, MaterialAspect, MaterialBaseData, ShortIndex};
pub trait BufferClient: Sized + std::fmt::Debug + std::default::Default + Clone {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
<Self as std::fmt::Debug>::fmt(self, fmt)
}
}
impl BufferClient for () {}
pub trait AccessorClient: Sized + std::fmt::Debug + std::default::Default + Clone {}
impl AccessorClient for () {}
pub trait DescriptorClient: Sized + std::fmt::Debug + std::default::Default + Clone {}
impl DescriptorClient for () {}
pub trait TextureClient: Sized + std::fmt::Debug + std::default::Default + Clone {}
impl TextureClient for () {}
pub trait MaterialClient: Sized + std::fmt::Debug {}
impl MaterialClient for () {}
pub trait VerticesClient: Sized + std::fmt::Debug + std::default::Default + Clone {}
impl VerticesClient for () {}
pub trait Renderable: Sized {
type Buffer: BufferClient;
type Descriptor: DescriptorClient;
type DataAccessor: AccessorClient;
type IndexAccessor: AccessorClient;
type Texture: TextureClient;
type Material: MaterialClient;
type Vertices: VerticesClient;
fn init_buffer_data_client(
&mut self,
client: &mut Self::Buffer,
buffer_data: &BufferData<Self>,
);
fn init_buffer_desc_client(
&mut self,
client: &mut Self::Descriptor,
buffer_desc: &BufferDescriptor<Self>,
);
fn init_index_accessor_client(
&mut self,
client: &mut Self::IndexAccessor,
buffer_view: &BufferIndexAccessor<Self>,
);
fn init_data_accessor_client(
&mut self,
client: &mut Self::DataAccessor,
buffer_view: &BufferDataAccessor<Self>,
);
fn create_vertices_client(&mut self, vertices: &Vertices<Self>) -> Self::Vertices;
fn create_texture_client(&mut self, texture: &Texture<Self>) -> Self::Texture;
fn create_material_client<M>(
&mut self,
object: &crate::Object<M, Self>,
material: &M,
) -> Self::Material
where
M: Material;
fn init_material_client<M: Material>(&mut self, client: &mut Self::Material, material: &M);
}
pub trait Material: std::fmt::Debug {
fn base_data(&self) -> &MaterialBaseData;
fn texture(&self, _aspect: MaterialAspect) -> ShortIndex {
ShortIndex::none()
}
}