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::{cell::RefCell, ops::AddAssign, slice::SliceIndex};
22use tracing::debug;
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 DrawDataName,
44 BaseDataName,
45 Parameter(Parameter),
46 Part(Box<Part>),
47 RotationDeformer(RotationDeformer),
48 CurvedSurfaceDeformer(CurvedSurfaceDeformer),
49 PivotManager(PivotManager),
50 Pivot(Pivot),
51 Texture(Box<Mesh>),
52 Affine(Affine),
53 I32Array(Vec<i32>),
54 F32Array(Vec<f32>),
55 ObjectArray(Vec<ObjectData>),
56 ObjectReference(i32),
57 Unknown60,
58 Unknown134,
59 Unknown {
60 type_id: u64,
61 },
62}
63
64impl Moc {
65 pub unsafe fn new(data: &[u8]) -> Result<Moc, L2Error> {
70 let ver = match data {
71 [b'm', b'o', b'c', v] => *v,
72 _ => Err(L2Error::EncodeError { format: "moc".to_string(), message: "moc magic head mismatch".to_string() })?,
73 };
74 let reader = MocReader { moc: data, ptr: RefCell::new(0), ver };
75 reader.advance(8);
76 let version = match ver {
77 6 => MocVersion::V1_6_INITIAL,
78 7 => MocVersion::V1_7_OPACITY,
79 8 => MocVersion::V1_8_TEX_OPTION,
80 9 => MocVersion::V1_9_AVATAR_PARTS,
81 10 => MocVersion::V1_10_SDK2_0,
82 11 => MocVersion::V1_11_SDK2_1,
83 v => Err(L2Error::UnimplementedSchema { schema: "moc".to_string(), version: v.to_string() })?,
84 };
85 let parameters: ObjectData = reader.read()?;
86 let parts: ObjectData = reader.read()?;
87 let canvas_width = reader.read()?;
88 let canvas_height = reader.read()?;
89 Ok(Self {
90 version,
91 parameters: parameters.as_parameters(),
93 parts: parts.as_parts(),
95 canvas_width,
96 canvas_height,
97 })
98 }
99}
100
101struct MocReader<'i> {
102 moc: &'i [u8],
103 ptr: RefCell<usize>,
104 ver: u8,
105}
106
107trait MocObject {
108 fn read_object(reader: &MocReader) -> Result<Self, L2Error>
109 where
110 Self: Sized;
111}
112
113impl<'i> MocReader<'i> {
114 pub fn version(&self) -> u8 {
115 unsafe { *self.moc.get_unchecked(3) }
117 }
118 pub fn rest(&self) -> &[u8] {
119 let offset = self.ptr.borrow();
120 self.moc.get(*offset..).unwrap()
121 }
122 pub fn advance(&self, n: usize) {
123 self.ptr.borrow_mut().add_assign(n)
124 }
125 pub fn read_var(&self) -> Result<i32, L2Error> {
135 let b1: u8 = self.read()?;
136 if (b1 & 0b10000000) == 0 {
137 return Ok(b1 as i32);
138 }
139
140 let b2: u8 = self.read()?;
141 if (b2 & 0b10000000) == 0 {
142 return Ok(((b1 & 0b01111111) as i32) << 7 | (b2 & 0b01111111) as i32);
143 }
144
145 let b3: u8 = self.read()?;
146 if (b3 & 0b10000000) == 0 {
147 return Ok(((b1 & 0b01111111) as i32) << 14 | ((b2 & 0b01111111) as i32) << 7 | (b3 as i32));
148 }
149
150 let b4: u8 = self.read()?;
151 if (b4 & 0b10000000) != 0 {
152 return Err(L2Error::UnknownError {});
153 }
154
155 Ok(((b1 & 0b01111111) as i32) << 21 | ((b2 & 0b01111111) as i32) << 14 | ((b3 & 0b01111111) as i32) << 7 | (b4 as i32))
156 }
157 pub fn read<T: MocObject>(&self) -> Result<T, L2Error> {
158 unsafe { T::read_object(self) }
159 }
160}