1use yog_data::{Ordered, Schema};
7
8#[derive(Schema, Debug, Clone)]
10pub struct ModelFile {
11 pub texture: String,
14 #[data(default = "default_texture_size")]
16 pub texture_size: [u32; 2],
17 pub bones: Vec<BoneDef>,
19}
20
21fn default_texture_size() -> [u32; 2] {
22 [64, 32]
23}
24
25#[derive(Schema, Debug, Clone)]
27pub struct BoneDef {
28 pub name: String,
29 pub parent: Option<String>,
31 #[data(default)]
33 pub pivot: [f32; 3],
34 #[data(default)]
36 pub rotation: [f32; 3],
37 #[data(default)]
38 pub cubes: Vec<CubeDef>,
39 #[data(default)]
41 pub locators: Ordered<[f32; 3]>,
42}
43
44#[derive(Schema, Debug, Clone)]
46pub struct CubeDef {
47 pub origin: [f32; 3],
49 pub size: [f32; 3],
50 #[data(default)]
52 pub uv: [f32; 2],
53 #[data(default)]
56 pub inflate: f32,
57 #[data(default)]
59 pub mirror: bool,
60}
61
62#[derive(Schema, Debug, Clone, Default)]
64pub struct AnimFile(pub Ordered<ClipDef>);
65
66#[derive(Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
68pub enum Loop {
69 #[default]
71 Once,
72 Hold,
74 Loop,
76}
77
78#[derive(Schema, Debug, Clone)]
80pub struct ClipDef {
81 pub length: f32,
83 #[data(rename = "loop", default)]
84 pub repeat: Loop,
85 pub bones: Ordered<TracksDef>,
88}
89
90#[derive(Schema, Debug, Clone, Default)]
92pub struct TracksDef {
93 #[data(default)]
95 pub rotation: Ordered<KeyDef>,
96 #[data(default)]
98 pub position: Ordered<KeyDef>,
99 #[data(default)]
101 pub scale: Ordered<KeyDef>,
102}
103
104#[derive(Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
106pub enum Ease {
107 #[default]
108 Linear,
109 Smooth,
111 Step,
113}
114
115#[derive(Debug, Clone, Copy, PartialEq)]
117pub struct KeyDef {
118 pub value: [f32; 3],
119 pub ease: Ease,
120}
121
122#[derive(Schema)]
123struct KeyObject {
124 value: [f32; 3],
125 #[data(default)]
126 ease: Ease,
127}
128
129impl Schema for KeyDef {
130 fn shape() -> yog_data::Shape {
131 yog_data::Shape::Any
132 }
133
134 fn read(v: &yog_data::ValueRef<'_>, cx: &mut yog_data::Reader) -> Option<Self> {
135 if v.as_list().is_some() {
136 return <[f32; 3]>::read(v, cx).map(|value| KeyDef { value, ease: Ease::Linear });
137 }
138 KeyObject::read(v, cx).map(|k| KeyDef { value: k.value, ease: k.ease })
139 }
140
141 fn write(&self) -> yog_data::Value {
142 if self.ease == Ease::Linear {
143 return self.value.write();
144 }
145 KeyObject { value: self.value, ease: self.ease }.write()
146 }
147}