use std::rc::Rc;
use crate::{
AccessorClient, BufferClient, BufferData, BufferDataAccessor, BufferDescriptor,
BufferIndexAccessor, DescriptorClient, Material, MaterialClient, Renderable, Texture,
TextureClient, Vertices, VerticesClient,
};
#[derive(Debug, Clone)]
pub struct Buffer(Rc<u32>);
impl std::fmt::Display for Buffer {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
write!(fmt, "{}", self.0)
}
}
impl Default for Buffer {
fn default() -> Self {
Self(Rc::new(0))
}
}
impl BufferClient for Buffer {}
impl AccessorClient for Buffer {}
#[derive(Debug, Clone, Default)]
pub struct Id(u32);
impl std::fmt::Display for Id {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
write!(fmt, "{}", self.0)
}
}
impl DescriptorClient for Buffer {}
impl MaterialClient for Id {}
impl TextureClient for Id {}
impl VerticesClient for Id {}
impl Renderable for Id {
type Buffer = Buffer;
type DataAccessor = Buffer;
type IndexAccessor = Buffer;
type Descriptor = Buffer;
type Texture = Id;
type Material = Id;
type Vertices = Id;
fn init_index_accessor_client(
&mut self,
_client: &mut Self::DataAccessor,
_buffer_view: &BufferIndexAccessor<Self>,
) {
}
fn init_buffer_data_client(&mut self, _buffer: &mut Buffer, _data: &BufferData<Self>) {}
fn init_buffer_desc_client(
&mut self,
client: &mut Self::Descriptor,
buffer_desc: &BufferDescriptor<Self>,
) {
buffer_desc.data().create_client(self);
*client = buffer_desc.data().borrow_client().clone();
}
fn init_data_accessor_client(
&mut self,
client: &mut Buffer,
buffer_data_acc: &BufferDataAccessor<Self>,
) {
buffer_data_acc.desc().data().create_client(self);
*client = buffer_data_acc.desc().data().borrow_client().clone();
}
fn create_vertices_client(&mut self, _vertices: &Vertices<Self>) -> Self::Vertices {
Self::Vertices::default()
}
fn create_texture_client(&mut self, _vertices: &Texture<Self>) -> Self::Texture {
Self::Texture::default()
}
fn create_material_client<M>(
&mut self,
_object: &crate::Object<M, Self>,
_material: &M,
) -> Self::Material
where
M: Material,
{
Self::Material::default()
}
fn init_material_client<M: Material>(&mut self, _client: &mut Self::Material, _material: &M) {}
}