rafx_plugins/assets/anim/
assets.rs1use 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 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 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 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>;