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}