use super::{gameobject::GameObject, pptr::PPtr}; use crate::object::{Value, parser::FromValue}; use anyhow::{Context, Result}; use glam::{Quat, Vec3}; use serde::Serialize; #[derive(Debug, Serialize)] pub struct Transform { pub father: PPtr, pub children: Vec>, pub gameobject: PPtr, pub local_position: Vec3, pub local_rotation: Quat, pub local_scale: Vec3, } impl FromValue for Transform { fn from_value(v: Value) -> Result { let mut fields = v .clone() .as_class("RectTransform") .or(v.as_class("Transform"))?; Ok(Self { father: fields.field("m_Father")?, gameobject: fields .field("m_GameObject") .context("gameobject of transform")?, local_position: fields.field("m_LocalPosition")?, local_rotation: fields.field("m_LocalRotation")?, local_scale: fields.field("m_LocalScale")?, children: fields .remove("m_Children") .unwrap() .as_vector() .unwrap() .into_iter() .map(|e| PPtr::from_value(e).unwrap()) .collect(), }) } }