rafx_plugins/assets/anim/
assets.rs

1use hydrate_base::LoadHandle;
2use rafx::api::RafxResult;
3use rafx::assets::{AssetManager, DefaultAssetTypeHandler, DefaultAssetTypeLoadHandler};
4use serde::{Deserialize, Serialize};
5use std::sync::Arc;
6use type_uuid::*;
7
8#[derive(Serialize, Deserialize, Debug, Copy, Clone)]
9pub enum AnimInterpolationMode {
10    Linear,
11}
12
13#[derive(Serialize, Deserialize, Debug, Clone)]
14pub struct BoneChannelVec3 {
15    pub min_frame: u32,
16    pub max_frame: u32,
17    //pub interpolation: Vec<AnimInterpolationMode>,
18    pub values: Vec<glam::Vec3>,
19}
20
21#[derive(Serialize, Deserialize, Debug, Clone)]
22pub struct BoneChannelQuat {
23    pub min_frame: u32,
24    pub max_frame: u32,
25    //pub interpolation: Vec<AnimInterpolationMode>,
26    pub values: Vec<glam::Quat>,
27}
28
29#[derive(Serialize, Deserialize, Debug, Default, Clone)]
30pub struct BoneChannelGroup {
31    pub position: Option<BoneChannelVec3>,
32    pub rotation: Option<BoneChannelQuat>,
33    pub scale: Option<BoneChannelVec3>,
34}
35
36#[derive(Serialize, Deserialize, Debug, Clone)]
37pub struct AnimClip {
38    pub name: String,
39    pub bone_channel_groups: Vec<BoneChannelGroup>,
40}
41
42#[derive(Serialize, Deserialize, Debug, Clone)]
43pub struct Bone {
44    pub name: String,
45    // _rel = relative to parent
46    pub position_rel: glam::Vec3,
47    pub rotation_rel: glam::Quat,
48    pub parent: i16,
49    pub chain_depth: i16,
50}
51
52#[derive(Serialize, Deserialize, Debug, Clone)]
53pub struct Skeleton {
54    pub bones: Vec<Bone>,
55}
56
57#[derive(TypeUuid, Serialize, Deserialize, Debug, Clone)]
58#[uuid = "5ee97f08-d8a7-45d3-96bb-412831e8bcb6"]
59pub struct AnimAssetData {
60    pub skeleton: Skeleton,
61    pub clips: Vec<AnimClip>,
62}
63
64#[derive(Debug)]
65pub struct AnimAssetInner {
66    pub skeleton: Arc<Skeleton>,
67    pub clips: Vec<Arc<AnimClip>>,
68}
69
70#[derive(TypeUuid, Clone, Debug)]
71#[uuid = "f5575dbe-a482-48a4-a1f8-2916f75f1c71"]
72pub struct AnimAsset {
73    inner: Arc<AnimAssetInner>,
74}
75
76impl AnimAsset {
77    pub fn skeleton(&self) -> &Arc<Skeleton> {
78        &self.inner.skeleton
79    }
80
81    pub fn clip(
82        &self,
83        index: usize,
84    ) -> &Arc<AnimClip> {
85        &self.inner.clips[index]
86    }
87}
88
89pub struct AnimLoadHandler;
90
91impl DefaultAssetTypeLoadHandler<AnimAssetData, AnimAsset> for AnimLoadHandler {
92    #[profiling::function]
93    fn load(
94        _asset_manager: &mut AssetManager,
95        anim_asset: AnimAssetData,
96        _load_handle: LoadHandle,
97    ) -> RafxResult<AnimAsset> {
98        let skeleton = Arc::new(anim_asset.skeleton);
99        let clips = anim_asset.clips.into_iter().map(|x| Arc::new(x)).collect();
100
101        let inner = AnimAssetInner { skeleton, clips };
102
103        Ok(AnimAsset {
104            inner: Arc::new(inner),
105        })
106    }
107}
108
109pub type AnimAssetType = DefaultAssetTypeHandler<AnimAssetData, AnimAsset, AnimLoadHandler>;