live2d_parser/cubism_v1/moc/
mod.rs1mod affines;
2mod deformers;
3mod objects;
4mod params;
5mod parts;
6mod pivots;
7mod meshes;
8mod string_id;
9
10use self::parts::Part;
11use crate::{
12 cubism_v1::moc::{
13 affines::Affine,
14 deformers::{CurvedSurfaceDeformer, RotationDeformer},
15 params::ParameterDefinition,
16 pivots::{Pivot, PivotManager},
17 },
18 helpers::MocVersion,
19 L2Error,
20};
21use integer_encoding::VarInt;
22use serde::{Deserialize, Serialize};
23use std::{cell::RefCell, ops::AddAssign, slice::SliceIndex};
24use tracing::debug;
25use crate::cubism_v1::moc::meshes::Mesh;
26
27#[derive(Serialize, Deserialize)]
28pub struct Moc {
29 pub version: MocVersion,
31 pub parameters: Vec<ParameterDefinition>,
33 pub parts: Vec<Part>,
35 pub canvas_width: i32,
37 pub canvas_height: i32,
39}
40
41#[derive(Debug, Serialize, Deserialize, Default)]
42pub enum ObjectData {
43 #[default]
44 Null,
45 DrawDataName,
46 BaseDataName,
47 Parameter(ParameterDefinition),
48 Part(Box<Part>),
49 RotationDeformer(RotationDeformer),
50 CurvedSurfaceDeformer(CurvedSurfaceDeformer),
51 PivotManager(PivotManager),
52 Pivot(Pivot),
53 Texture(Box<Mesh>),
54 Affine(Affine),
55 I32Array(Vec<i32>),
56 F32Array(Vec<f32>),
57 ObjectArray(Vec<ObjectData>),
58 ObjectReference(i32),
59 Unknown60,
60 Unknown134,
61 Unknown { type_id: u64 },
62}
63
64
65impl Moc {
66 pub unsafe fn new(data: &[u8]) -> Result<Moc, L2Error> {
71 let reader = MocReader { moc: data, ptr: RefCell::new(0) };
72 if reader.moc.get_unchecked(..3) == b"moc" {
73 reader.advance(8);
74 }
75 else {
76 return Err(L2Error::UnknownError {});
77 }
78 let version = reader.read()?;
79 let parameters: ObjectData = reader.read()?;
80 let parts: ObjectData = reader.read()?;
81 let canvas_width = reader.read()?;
82 let canvas_height = reader.read()?;
83 Ok(Self {
84 version,
85 parameters: parameters.as_parameters(),
87 parts: parts.as_parts(),
89 canvas_width,
90 canvas_height,
91 })
92 }
93}
94
95struct MocReader<'i> {
96 moc: &'i [u8],
97 ptr: RefCell<usize>,
98}
99
100trait MocObject {
101 unsafe fn read_object(reader: &MocReader) -> Result<Self, L2Error>
102 where
103 Self: Sized;
104}
105
106impl<'i> MocReader<'i> {
107 pub unsafe fn new(moc: &'i [u8]) -> Self {
108 Self { moc, ptr: RefCell::new(0) }
109 }
110 pub unsafe fn version(&self) -> u8 {
111 *self.moc.get_unchecked(3)
112 }
113 pub unsafe fn rest(&self) -> &[u8] {
114 let offset = self.ptr.borrow();
115 self.moc.get_unchecked(*offset..)
116 }
117 pub unsafe fn view(&self, slice: impl SliceIndex<[u8], Output = [u8]>) -> &[u8] {
118 self.rest().get_unchecked(slice)
119 }
120 pub fn advance(&self, n: usize) {
121 self.ptr.borrow_mut().add_assign(n)
122 }
123 pub unsafe fn read_var(&self) -> Result<i32, L2Error> {
133 let b1: u8 = self.read()?;
134 if (b1 & 0b10000000) == 0 {
135 return Ok(b1 as i32);
136 }
137
138 let b2: u8 = self.read()?;
139 if (b2 & 0b10000000) == 0 {
140 return Ok(((b1 & 0b01111111) as i32) << 7 | (b2 & 0b01111111) as i32);
141 }
142
143 let b3: u8 = self.read()?;
144 if (b3 & 0b10000000) == 0 {
145 return Ok(((b1 & 0b01111111) as i32) << 14 | ((b2 & 0b01111111) as i32) << 7 | (b3 as i32));
146 }
147
148 let b4: u8 = self.read()?;
149 if (b4 & 0b10000000) != 0 {
150 return Err(L2Error::UnknownError {});
151 }
152
153 Ok(((b1 & 0b01111111) as i32) << 21 | ((b2 & 0b01111111) as i32) << 14 | ((b3 & 0b01111111) as i32) << 7 | (b4 as i32))
154 }
155 #[track_caller]
156 pub unsafe fn read<T: MocObject>(&self) -> Result<T, L2Error> {
157 T::read_object(self)
158 }
159}
160