1use bevy_asset::{Asset, Handle};
2use bevy_ecs::{
3 component::Component,
4 entity::{Entity, VisitEntities, VisitEntitiesMut},
5 prelude::ReflectComponent,
6 reflect::{ReflectMapEntities, ReflectVisitEntities, ReflectVisitEntitiesMut},
7};
8use bevy_math::Mat4;
9use bevy_reflect::prelude::*;
10use core::ops::Deref;
11
12#[derive(Component, Debug, Default, Clone, Reflect, VisitEntities, VisitEntitiesMut)]
13#[reflect(
14 Component,
15 MapEntities,
16 VisitEntities,
17 VisitEntitiesMut,
18 Default,
19 Debug
20)]
21pub struct SkinnedMesh {
22 #[visit_entities(ignore)]
23 pub inverse_bindposes: Handle<SkinnedMeshInverseBindposes>,
24 pub joints: Vec<Entity>,
25}
26
27#[derive(Asset, TypePath, Debug)]
28pub struct SkinnedMeshInverseBindposes(Box<[Mat4]>);
29
30impl From<Vec<Mat4>> for SkinnedMeshInverseBindposes {
31 fn from(value: Vec<Mat4>) -> Self {
32 Self(value.into_boxed_slice())
33 }
34}
35
36impl Deref for SkinnedMeshInverseBindposes {
37 type Target = [Mat4];
38 fn deref(&self) -> &Self::Target {
39 &self.0
40 }
41}