1use yog_data::{Ordered, Schema};
7
8#[derive(Schema, Debug, Clone)]
10pub struct ModelFile {
11 #[data(with = "yog_data::with::RefTo<yog_data::kinds::Texture>")]
15 pub texture: String,
16 #[data(with = "yog_data::with::Opt<yog_data::with::RefTo<yog_data::kinds::Video>>")]
20 pub video: Option<String>,
21 #[data(default = "default_texture_size")]
23 pub texture_size: [u32; 2],
24 pub bones: Vec<BoneDef>,
26}
27
28fn default_texture_size() -> [u32; 2] {
29 [64, 32]
30}
31
32#[derive(Schema, Debug, Clone)]
34pub struct BoneDef {
35 pub name: String,
36 pub parent: Option<String>,
38 #[data(default)]
40 pub pivot: [f32; 3],
41 #[data(default)]
43 pub rotation: [f32; 3],
44 #[data(default)]
45 pub cubes: Vec<CubeDef>,
46 #[data(default)]
48 pub locators: Ordered<[f32; 3]>,
49}
50
51#[derive(Schema, Debug, Clone)]
53pub struct CubeDef {
54 pub origin: [f32; 3],
56 pub size: [f32; 3],
57 #[data(default)]
59 pub uv: [f32; 2],
60 #[data(default)]
63 pub inflate: f32,
64 #[data(default)]
66 pub mirror: bool,
67}
68
69#[derive(Schema, Debug, Clone, Default)]
71pub struct AnimFile(pub Ordered<ClipDef>);
72
73#[derive(Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
75pub enum Loop {
76 #[default]
78 Once,
79 Hold,
81 Loop,
83}
84
85#[derive(Schema, Debug, Clone)]
87pub struct ClipDef {
88 pub length: f32,
90 #[data(rename = "loop", default)]
91 pub repeat: Loop,
92 pub bones: Ordered<TracksDef>,
95}
96
97#[derive(Schema, Debug, Clone, Default)]
99pub struct TracksDef {
100 #[data(default)]
102 pub rotation: Ordered<KeyDef>,
103 #[data(default)]
105 pub position: Ordered<KeyDef>,
106 #[data(default)]
108 pub scale: Ordered<KeyDef>,
109}
110
111#[derive(Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
113pub enum Ease {
114 #[default]
115 Linear,
116 Smooth,
118 Step,
120}
121
122#[derive(Debug, Clone, Copy, PartialEq)]
124pub struct KeyDef {
125 pub value: [f32; 3],
126 pub ease: Ease,
127}
128
129#[derive(Schema)]
130struct KeyObject {
131 value: [f32; 3],
132 #[data(default)]
133 ease: Ease,
134}
135
136impl Schema for KeyDef {
137 fn shape() -> yog_data::Shape {
138 yog_data::Shape::Any
139 }
140
141 fn read(v: &yog_data::ValueRef<'_>, cx: &mut yog_data::Reader) -> Option<Self> {
142 if v.as_list().is_some() {
143 return <[f32; 3]>::read(v, cx).map(|value| KeyDef {
144 value,
145 ease: Ease::Linear,
146 });
147 }
148 KeyObject::read(v, cx).map(|k| KeyDef {
149 value: k.value,
150 ease: k.ease,
151 })
152 }
153
154 fn write(&self) -> yog_data::Value {
155 if self.ease == Ease::Linear {
156 return self.value.write();
157 }
158 KeyObject {
159 value: self.value,
160 ease: self.ease,
161 }
162 .write()
163 }
164}