live2d_parser/cubism_v1/moc/
objects.rs

1use super::*;
2
3
4impl<T: MocObject> MocObject for Vec<T> {
5    fn read_object(r: &mut MocReader) -> Result<Self, L2Error>
6    where
7        Self: Sized,
8    {
9        let count = r.read_var()?;
10        let mut items = Vec::with_capacity(count as usize);
11        trace!("reading {}[{count}] items at 0x{:08X}", type_name::<T>(), r.ptr);
12        for _ in 0..count {
13            let out = r.read()?;
14            items.push(out);
15        }
16        Ok(items)
17    }
18}
19
20impl MocObject for ObjectData {
21    #[track_caller]
22    fn read_object(r: &mut MocReader) -> Result<Self, L2Error>
23    where
24        Self: Sized,
25    {
26        let caller = std::panic::Location::caller();
27        let type_id = r.read_var()?;
28        // trace!("preview: {type_id}@{:?}\n    {:?}", r.view(..8), caller);
29        let data = match type_id {
30            0 => ObjectData::Null,
31            15 => ObjectData::ObjectArray(r.read()?),
32            25 => ObjectData::I32Array(r.read()?),
33            27 => ObjectData::F32Array(r.read()?),
34            65 => ObjectData::CurvedSurfaceDeformer(r.read()?),
35            66 => ObjectData::PivotManager(r.read()?),
36            67 => ObjectData::Pivot(r.read()?),
37            68 => ObjectData::RotationDeformer(r.read()?),
38            69 => ObjectData::Affine(r.read()?),
39            70 => ObjectData::Texture(Box::new(r.read()?)),
40            131 => ObjectData::Parameter(r.read()?),
41            133 => ObjectData::Part(Box::new(r.read()?)),
42            // _ => Err(L2Error::UnknownType { type_id: type_id as u32 })?,
43            _ => panic!("unknown type: {type_id}"),
44        };
45        Ok(data)
46    }
47}
48
49impl<const N: usize> MocObject for [u8; N] {
50    fn read_object(r: &mut MocReader) -> Result<Self, L2Error>
51    where
52        Self: Sized,
53    {
54        if r.rest().len() < N {
55            return Err(L2Error::OutOfBounds { rest: r.rest().len(), request: N });
56        }
57        let array = unsafe {
58            std::ptr::read(r.rest().as_ptr() as *const [u8; N])
59        };
60        r.advance(N);
61        Ok(array)
62    }
63}
64
65impl MocObject for i32 {
66    fn read_object(r: &mut MocReader) -> Result<Self, L2Error>
67    where
68        Self: Sized,
69    {
70        Ok(i32::from_be_bytes(r.read()?))
71    }
72}
73
74impl MocObject for f32 {
75    fn read_object(r: &mut MocReader) -> Result<Self, L2Error>
76    where
77        Self: Sized,
78    {
79        Ok(f32::from_be_bytes(r.read()?))
80    }
81}
82
83impl MocObject for u8 {
84    fn read_object(r: &mut MocReader) -> Result<Self, L2Error>
85    where
86        Self: Sized,
87    {
88        let float = unsafe {
89            std::ptr::read(r.rest().as_ptr())
90        };
91        r.advance(1);
92        Ok(float)
93    }
94}
95impl MocObject for bool {
96    fn read_object(r: &mut MocReader) -> Result<Self, L2Error>
97    where
98        Self: Sized,
99    {
100        Ok(u8::read_object(r)? != 0)
101    }
102}
103
104impl ObjectData {
105    pub fn as_f32_array(self) -> Vec<f32> {
106        match self {
107            ObjectData::Null => Vec::new(),
108            // ObjectData::ObjectArray(o) => o.into_iter().map(|x| x.as_f32_array()).flatten().collect(),
109            ObjectData::F32Array(v) => v,
110            s => {
111                warn!("ObjectData::as_f32_array() called on non-pivot object {s:?}");
112                vec![]
113            }
114        }
115    }
116}