use yog_data::{Ordered, Schema};
#[derive(Schema, Debug, Clone)]
pub struct ModelFile {
pub texture: String,
#[data(default = "default_texture_size")]
pub texture_size: [u32; 2],
pub bones: Vec<BoneDef>,
}
fn default_texture_size() -> [u32; 2] {
[64, 32]
}
#[derive(Schema, Debug, Clone)]
pub struct BoneDef {
pub name: String,
pub parent: Option<String>,
#[data(default)]
pub pivot: [f32; 3],
#[data(default)]
pub rotation: [f32; 3],
#[data(default)]
pub cubes: Vec<CubeDef>,
#[data(default)]
pub locators: Ordered<[f32; 3]>,
}
#[derive(Schema, Debug, Clone)]
pub struct CubeDef {
pub origin: [f32; 3],
pub size: [f32; 3],
#[data(default)]
pub uv: [f32; 2],
#[data(default)]
pub inflate: f32,
#[data(default)]
pub mirror: bool,
}
#[derive(Schema, Debug, Clone, Default)]
pub struct AnimFile(pub Ordered<ClipDef>);
#[derive(Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Loop {
#[default]
Once,
Hold,
Loop,
}
#[derive(Schema, Debug, Clone)]
pub struct ClipDef {
pub length: f32,
#[data(rename = "loop", default)]
pub repeat: Loop,
pub bones: Ordered<TracksDef>,
}
#[derive(Schema, Debug, Clone, Default)]
pub struct TracksDef {
#[data(default)]
pub rotation: Ordered<KeyDef>,
#[data(default)]
pub position: Ordered<KeyDef>,
#[data(default)]
pub scale: Ordered<KeyDef>,
}
#[derive(Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Ease {
#[default]
Linear,
Smooth,
Step,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct KeyDef {
pub value: [f32; 3],
pub ease: Ease,
}
#[derive(Schema)]
struct KeyObject {
value: [f32; 3],
#[data(default)]
ease: Ease,
}
impl Schema for KeyDef {
fn shape() -> yog_data::Shape {
yog_data::Shape::Any
}
fn read(v: &yog_data::ValueRef<'_>, cx: &mut yog_data::Reader) -> Option<Self> {
if v.as_list().is_some() {
return <[f32; 3]>::read(v, cx).map(|value| KeyDef { value, ease: Ease::Linear });
}
KeyObject::read(v, cx).map(|k| KeyDef { value: k.value, ease: k.ease })
}
fn write(&self) -> yog_data::Value {
if self.ease == Ease::Linear {
return self.value.write();
}
KeyObject { value: self.value, ease: self.ease }.write()
}
}