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(default = "default_texture_size")]
18 pub texture_size: [u32; 2],
19 pub bones: Vec<BoneDef>,
21}
22
23fn default_texture_size() -> [u32; 2] {
24 [64, 32]
25}
26
27#[derive(Schema, Debug, Clone)]
29pub struct BoneDef {
30 pub name: String,
31 pub parent: Option<String>,
33 #[data(default)]
35 pub pivot: [f32; 3],
36 #[data(default)]
38 pub rotation: [f32; 3],
39 #[data(default)]
40 pub cubes: Vec<CubeDef>,
41 #[data(default)]
43 pub locators: Ordered<[f32; 3]>,
44}
45
46#[derive(Schema, Debug, Clone)]
48pub struct CubeDef {
49 pub origin: [f32; 3],
51 pub size: [f32; 3],
52 #[data(default)]
54 pub uv: [f32; 2],
55 #[data(default)]
58 pub inflate: f32,
59 #[data(default)]
61 pub mirror: bool,
62}
63
64#[derive(Schema, Debug, Clone, Default)]
66pub struct AnimFile(pub Ordered<ClipDef>);
67
68#[derive(Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
70pub enum Loop {
71 #[default]
73 Once,
74 Hold,
76 Loop,
78}
79
80#[derive(Schema, Debug, Clone)]
82pub struct ClipDef {
83 pub length: f32,
85 #[data(rename = "loop", default)]
86 pub repeat: Loop,
87 pub bones: Ordered<TracksDef>,
90}
91
92#[derive(Schema, Debug, Clone, Default)]
94pub struct TracksDef {
95 #[data(default)]
97 pub rotation: Ordered<KeyDef>,
98 #[data(default)]
100 pub position: Ordered<KeyDef>,
101 #[data(default)]
103 pub scale: Ordered<KeyDef>,
104}
105
106#[derive(Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
108pub enum Ease {
109 #[default]
110 Linear,
111 Smooth,
113 Step,
115}
116
117#[derive(Debug, Clone, Copy, PartialEq)]
119pub struct KeyDef {
120 pub value: [f32; 3],
121 pub ease: Ease,
122}
123
124#[derive(Schema)]
125struct KeyObject {
126 value: [f32; 3],
127 #[data(default)]
128 ease: Ease,
129}
130
131impl Schema for KeyDef {
132 fn shape() -> yog_data::Shape {
133 yog_data::Shape::Any
134 }
135
136 fn read(v: &yog_data::ValueRef<'_>, cx: &mut yog_data::Reader) -> Option<Self> {
137 if v.as_list().is_some() {
138 return <[f32; 3]>::read(v, cx).map(|value| KeyDef { value, ease: Ease::Linear });
139 }
140 KeyObject::read(v, cx).map(|k| KeyDef { value: k.value, ease: k.ease })
141 }
142
143 fn write(&self) -> yog_data::Value {
144 if self.ease == Ease::Linear {
145 return self.value.write();
146 }
147 KeyObject { value: self.value, ease: self.ease }.write()
148 }
149}