live2d_parser/cubism_v1/moc/
objects.rs1use 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 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 _ => 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::F32Array(v) => v,
110 s => {
111 warn!("ObjectData::as_f32_array() called on non-pivot object {s:?}");
112 vec![]
113 }
114 }
115 }
116}