mraphics_core/geometry/
mesh.rs

1use crate::{Geometry, Material, RenderInstance, Renderable};
2use std::sync::atomic::AtomicUsize;
3
4static GLOBAL_MESH_ID: AtomicUsize = AtomicUsize::new(0);
5
6pub trait MeshLike<G: Geometry, M: Material>: Renderable {
7    fn geometry(&self) -> &G;
8    fn material(&self) -> &M;
9}
10
11#[derive(Debug, PartialEq, Eq, Hash)]
12pub struct MeshIndex(usize);
13
14impl MeshIndex {
15    pub fn new(index: usize) -> Self {
16        Self(index)
17    }
18
19    pub fn index(&self) -> usize {
20        self.0
21    }
22}
23
24pub struct Mesh<G: Geometry, M: Material> {
25    pub identifier: MeshIndex,
26    pub geometry: G,
27    pub material: M,
28}
29
30impl<G: Geometry, M: Material> Mesh<G, M> {
31    pub fn new(geometry: G, material: M) -> Self {
32        Self {
33            identifier: Self::acquire_id(),
34            geometry: geometry,
35            material: material,
36        }
37    }
38
39    pub fn acquire_id() -> MeshIndex {
40        MeshIndex::new(GLOBAL_MESH_ID.fetch_add(1, std::sync::atomic::Ordering::Relaxed))
41    }
42}
43
44impl<G: Geometry, M: Material> Renderable for Mesh<G, M> {
45    fn identifier(&self) -> usize {
46        self.identifier.index()
47    }
48
49    fn build_instance(&self) -> RenderInstance {
50        RenderInstance::new(self.identifier.index().to_string(), &self.material)
51    }
52}
53
54impl<G: Geometry, M: Material> MeshLike<G, M> for Mesh<G, M> {
55    fn geometry(&self) -> &G {
56        &self.geometry
57    }
58
59    fn material(&self) -> &M {
60        &self.material
61    }
62}