mraphics_core/geometry/
mesh.rs1use 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}