1#[allow(clippy::module_inception)]
2mod mesh;
3pub mod morph;
4pub mod primitives;
5
6use bevy_utils::HashSet;
7pub use mesh::*;
8pub use primitives::*;
9use std::{
10 hash::{Hash, Hasher},
11 sync::Arc,
12};
13
14use crate::{render_asset::RenderAssetPlugin, texture::GpuImage, RenderApp};
15use bevy_app::{App, Plugin};
16use bevy_asset::AssetApp;
17use bevy_ecs::{entity::Entity, system::Resource};
18
19pub struct MeshPlugin;
21
22impl Plugin for MeshPlugin {
23 fn build(&self, app: &mut App) {
24 app.init_asset::<Mesh>()
25 .init_asset::<skinning::SkinnedMeshInverseBindposes>()
26 .register_asset_reflect::<Mesh>()
27 .register_type::<skinning::SkinnedMesh>()
28 .register_type::<Vec<Entity>>()
29 .add_plugins(RenderAssetPlugin::<GpuMesh, GpuImage>::default());
31
32 let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
33 return;
34 };
35
36 render_app.init_resource::<MeshVertexBufferLayouts>();
37 }
38}
39
40#[derive(Clone, Debug)]
50pub struct MeshVertexBufferLayoutRef(pub Arc<MeshVertexBufferLayout>);
51
52#[derive(Clone, Default, Resource)]
54pub struct MeshVertexBufferLayouts(HashSet<Arc<MeshVertexBufferLayout>>);
55
56impl MeshVertexBufferLayouts {
57 pub fn insert(&mut self, layout: MeshVertexBufferLayout) -> MeshVertexBufferLayoutRef {
61 MeshVertexBufferLayoutRef(
66 self.0
67 .get_or_insert_with(&layout, |layout| Arc::new(layout.clone()))
68 .clone(),
69 )
70 }
71}
72
73impl PartialEq for MeshVertexBufferLayoutRef {
74 fn eq(&self, other: &Self) -> bool {
75 Arc::ptr_eq(&self.0, &other.0)
76 }
77}
78
79impl Eq for MeshVertexBufferLayoutRef {}
80
81impl Hash for MeshVertexBufferLayoutRef {
82 fn hash<H: Hasher>(&self, state: &mut H) {
83 (Arc::as_ptr(&self.0) as usize).hash(state);
86 }
87}