live2d_parser/cubism_v1/moc/
mod.rs1mod affines;
2mod deformers;
3mod meshes;
4mod objects;
5mod params;
6mod parts;
7mod pivots;
8mod string_id;
9
10use self::parts::Part;
11pub use self::{
12 affines::Affine,
13 deformers::{CurvedSurfaceDeformer, RotationDeformer},
14 meshes::Mesh,
15 params::Parameter,
16 pivots::{Pivot, PivotManager},
17};
18use crate::{helpers::MocVersion, L2Error};
19use integer_encoding::VarInt;
20use serde::{Deserialize, Serialize};
21use std::{any::type_name, ops::AddAssign, slice::SliceIndex};
22use tracing::{error, trace, warn};
23
24#[derive(Serialize, Deserialize)]
26pub struct Moc {
27 pub version: MocVersion,
29 pub parameters: Vec<Parameter>,
31 pub parts: Vec<Part>,
33 pub canvas_width: i32,
35 pub canvas_height: i32,
37}
38
39#[derive(Debug, Serialize, Deserialize, Default)]
40pub enum ObjectData {
41 #[default]
42 Null,
43 Parameter(Parameter),
44 Part(Box<Part>),
45 RotationDeformer(RotationDeformer),
46 CurvedSurfaceDeformer(CurvedSurfaceDeformer),
47 PivotManager(PivotManager),
48 Pivot(Pivot),
49 Texture(Box<Mesh>),
50 Affine(Affine),
51 I32Array(Vec<i32>),
52 F32Array(Vec<f32>),
53 ObjectArray(Vec<ObjectData>),
54 Unknown {
55 type_id: u64,
56 },
57}
58
59struct MocReader<'i> {
60 moc: &'i [u8],
61 ptr: usize,
62 ver: u8,
63}
64
65trait MocObject {
66 fn read_object(reader: &mut MocReader) -> Result<Self, L2Error>
67 where
68 Self: Sized;
69}
70
71impl Moc {
72 pub unsafe fn new(data: &[u8]) -> Result<Moc, L2Error> {
77 let ver = match data {
78 [b'm', b'o', b'c', v, ..] => *v,
79 _ => Err(L2Error::EncodeError { format: "moc".to_string(), message: "moc magic head mismatch".to_string() })?,
80 };
81 let mut reader = MocReader { moc: data, ptr: 0, ver };
82 reader.advance(8);
83 let version = match ver {
84 6 => MocVersion::V1_6_INITIAL,
85 7 => MocVersion::V1_7_OPACITY,
86 8 => MocVersion::V1_8_TEX_OPTION,
87 9 => MocVersion::V1_9_AVATAR_PARTS,
88 10 => MocVersion::V1_10_SDK2_0,
89 11 => MocVersion::V1_11_SDK2_1,
90 v => Err(L2Error::UnimplementedSchema { schema: "moc".to_string(), version: v.to_string() })?,
91 };
92 let parameters: ObjectData = reader.read()?;
93 let parts: ObjectData = reader.read()?;
94 let canvas_width = reader.read()?;
95 let canvas_height = reader.read()?;
96 Ok(Self {
97 version,
98 parameters: parameters.as_parameters(),
100 parts: parts.as_parts(),
102 canvas_width,
103 canvas_height,
104 })
105 }
106}
107
108impl<'i> MocReader<'i> {
109 pub fn version(&self) -> u8 {
110 unsafe { *self.moc.get_unchecked(3) }
112 }
113 pub fn rest(&mut self) -> &[u8] {
114 let offset = self.ptr;
115 self.moc.get(offset..).unwrap()
116 }
117 pub fn advance(&mut self, n: usize) {
118 self.ptr.add_assign(n)
119 }
120 pub fn read_var(&mut self) -> Result<i32, L2Error> {
130 let b1: u8 = self.read()?;
131 if (b1 & 0b10000000) == 0 {
132 return Ok(b1 as i32);
133 }
134
135 let b2: u8 = self.read()?;
136 if (b2 & 0b10000000) == 0 {
137 return Ok(((b1 & 0b01111111) as i32) << 7 | (b2 & 0b01111111) as i32);
138 }
139
140 let b3: u8 = self.read()?;
141 if (b3 & 0b10000000) == 0 {
142 return Ok(((b1 & 0b01111111) as i32) << 14 | ((b2 & 0b01111111) as i32) << 7 | (b3 as i32));
143 }
144
145 let b4: u8 = self.read()?;
146 if (b4 & 0b10000000) != 0 {
147 return Err(L2Error::UnknownError {});
148 }
149
150 Ok(((b1 & 0b01111111) as i32) << 21 | ((b2 & 0b01111111) as i32) << 14 | ((b3 & 0b01111111) as i32) << 7 | (b4 as i32))
151 }
152 pub fn read<T: MocObject>(&mut self) -> Result<T, L2Error> {
153 T::read_object(self)
154 }
155}