use crate::object::{Value, parser::FromValue}; use glam::{Mat4, Quat, Vec2, Vec3, Vec4}; use serde::Serialize; impl FromValue for Vec2 { fn from_value(v: Value) -> anyhow::Result { let mut fields = v.as_class("Vector2f").unwrap(); Ok(Self::new(fields.field("x")?, fields.field("y")?)) } } impl FromValue for Vec3 { fn from_value(v: Value) -> anyhow::Result { let mut fields = v.as_class("Vector3f").unwrap(); Ok(Self::new( fields.field("x")?, fields.field("y")?, fields.field("z")?, )) } } impl FromValue for Vec4 { fn from_value(v: Value) -> anyhow::Result { let mut fields = v.as_class("Vector4f")?; Ok(Self::new( fields.field("x")?, fields.field("y")?, fields.field("z")?, fields.field("w")?, )) } } #[derive(Debug, Serialize)] pub struct ColorRGBA(pub Vec4); impl FromValue for ColorRGBA { fn from_value(v: Value) -> anyhow::Result { let mut fields = v.as_class("ColorRGBA")?; Ok(ColorRGBA(Vec4::new( fields.field("r")?, fields.field("g")?, fields.field("b")?, fields.field("a")?, ))) } } impl FromValue for Quat { fn from_value(v: Value) -> anyhow::Result { let mut fields = v.as_class("Quaternionf").unwrap(); Ok(Self::from_array([ fields.field("x")?, fields.field("y")?, fields.field("z")?, fields.field("w")?, ])) } } impl FromValue for Mat4 { fn from_value(v: Value) -> anyhow::Result { let mut fields = v.as_class("Matrix4x4f").unwrap(); Ok(Self::from_cols_array_2d(&[ [ fields.field("e00")?, fields.field("e01")?, fields.field("e02")?, fields.field("e03")?, ], [ fields.field("e10")?, fields.field("e11")?, fields.field("e12")?, fields.field("e13")?, ], [ fields.field("e20")?, fields.field("e21")?, fields.field("e22")?, fields.field("e23")?, ], [ fields.field("e30")?, fields.field("e31")?, fields.field("e32")?, fields.field("e33")?, ], ])) } }