crystal_api/
mesh.rs

1use std::{marker::PhantomData, sync::Arc};
2
3/// Used to setup vertex shader attributes
4#[derive(Clone, Copy)]
5pub struct Attribute {
6    /// Size of the attribute
7    pub size: usize,
8    /// Offset of the attribute
9    pub offset: usize,
10}
11
12/// Needed to be implemented for Vertex for using it in Mesh
13///
14/// # Examples
15/// ```rust
16/// use std::mem::offset_of;
17/// use crystal_api::mesh::{AttributeDescriptor, Attribute};
18///
19/// type Vec3 = [f32; 3];
20/// type Vec2 = [f32; 2];
21///
22/// #[repr(C)]
23/// #[derive(Clone, Copy, Default)]
24/// pub struct VertexTexture {
25///     pos: Vec3,
26///     uv: Vec2,
27/// }
28/// impl AttributeDescriptor for VertexTexture {
29///     fn get_attributes() -> &'static [Attribute] {
30///         &[
31///             Attribute {
32///                 size: size_of::<Vec3>(),
33///                 offset: offset_of!(Self, pos),
34///             },
35///             Attribute {
36///                 size: size_of::<Vec2>(),
37///                 offset: offset_of!(Self, uv),
38///             },
39///         ]
40///     }
41/// }
42/// ```
43pub trait AttributeDescriptor {
44    /// Should return attributes of Vertex
45    fn get_attributes() -> &'static [Attribute];
46}
47
48/// `Mesh` struct stores the mesh data in CPU memory
49pub struct Mesh<V: AttributeDescriptor, I> {
50    #[allow(missing_docs)]
51    pub vertices: Vec<V>,
52    #[allow(missing_docs)]
53    pub indices: Vec<I>,
54}
55
56impl<V: AttributeDescriptor, I> Mesh<V, I> {
57    pub(crate) fn size(&self) -> u64 {
58        self.vertices.len() as u64 * size_of::<V>() as u64
59            + self.indices.len() as u64 * size_of::<I>() as u64
60    }
61}
62
63/// `MeshBuffer` struct stores the mesh data in GPU memory
64pub struct MeshBuffer<V: AttributeDescriptor, I> {
65    pub(crate) inner: Arc<crate::object::MeshBufferProxy>,
66    _tp: PhantomData<(V, I)>,
67}
68
69impl<V: AttributeDescriptor, I> MeshBuffer<V, I> {
70    pub(crate) fn new(inner: Arc<crate::object::MeshBufferProxy>) -> Self {
71        Self {
72            inner,
73            _tp: PhantomData,
74        }
75    }
76}