mod3d_base/example_client/
renderable.rs

1//a Imports
2use std::rc::Rc;
3
4use crate::{
5    AccessorClient, BufferClient, BufferData, BufferDataAccessor, BufferDescriptor,
6    BufferIndexAccessor, DescriptorClient, Material, MaterialClient, Renderable, Texture,
7    TextureClient, Vertices, VerticesClient,
8};
9
10//a Buffer
11//tp Buffer
12/// A Buffer, which is used for both a [BufferData] and a BufferAccessor client
13///
14/// This is a reference counted object - each [BufferData] has a
15/// seperate one of these, and each [BufferAccessor] clones it so that if
16/// there are N views then (after deconstruction of the object) a
17/// Buffer will have a strong count of the number of views upon it
18#[derive(Debug, Clone)]
19pub struct Buffer(Rc<u32>);
20
21//ip Display for Buffer
22impl std::fmt::Display for Buffer {
23    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
24        write!(fmt, "{}", self.0)
25    }
26}
27
28//ip Default for Buffer
29impl Default for Buffer {
30    fn default() -> Self {
31        Self(Rc::new(0))
32    }
33}
34
35//ip BufferClient for Buffer
36impl BufferClient for Buffer {}
37
38//ip AccessorClient for Buffer
39impl AccessorClient for Buffer {}
40
41//a Id
42//tp Id
43/// The thing that is Renderable - pretty much a place-holder
44///
45/// This is also used as a MaterialClient, TextureClient and VerticesClient
46#[derive(Debug, Clone, Default)]
47pub struct Id(u32);
48
49//ip Display for Id
50impl std::fmt::Display for Id {
51    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
52        write!(fmt, "{}", self.0)
53    }
54}
55
56//ip DescriptorClient for Buffer
57impl DescriptorClient for Buffer {}
58
59//ip MaterialClient for Id
60impl MaterialClient for Id {}
61
62//ip TextureClient for Id
63impl TextureClient for Id {}
64
65//ip VerticesClient for Id
66impl VerticesClient for Id {}
67
68//ip Renderable for Id
69impl Renderable for Id {
70    type Buffer = Buffer;
71    type DataAccessor = Buffer;
72    type IndexAccessor = Buffer;
73    type Descriptor = Buffer;
74    type Texture = Id;
75    type Material = Id;
76    type Vertices = Id;
77    fn init_index_accessor_client(
78        &mut self,
79        _client: &mut Self::DataAccessor,
80        _buffer_view: &BufferIndexAccessor<Self>,
81    ) {
82    }
83
84    fn init_buffer_data_client(&mut self, _buffer: &mut Buffer, _data: &BufferData<Self>) {}
85
86    fn init_buffer_desc_client(
87        &mut self,
88        client: &mut Self::Descriptor,
89        buffer_desc: &BufferDescriptor<Self>,
90    ) {
91        buffer_desc.data().create_client(self);
92        *client = buffer_desc.data().borrow_client().clone();
93    }
94
95    fn init_data_accessor_client(
96        &mut self,
97        client: &mut Buffer,
98        buffer_data_acc: &BufferDataAccessor<Self>,
99    ) {
100        buffer_data_acc.desc().data().create_client(self);
101        *client = buffer_data_acc.desc().data().borrow_client().clone();
102    }
103
104    fn create_vertices_client(&mut self, _vertices: &Vertices<Self>) -> Self::Vertices {
105        Self::Vertices::default()
106    }
107
108    fn create_texture_client(&mut self, _vertices: &Texture<Self>) -> Self::Texture {
109        Self::Texture::default()
110    }
111
112    fn create_material_client<M>(
113        &mut self,
114        _object: &crate::Object<M, Self>,
115        _material: &M,
116    ) -> Self::Material
117    where
118        M: Material,
119    {
120        Self::Material::default()
121    }
122    fn init_material_client<M: Material>(&mut self, _client: &mut Self::Material, _material: &M) {}
123}