bevy_mesh/
skinning.rs

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}