live2d_parser/cubism_v1/moc/
mod.rs

1mod 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    /// The version of the moc file
30    pub version: MocVersion,
31    /// Parameter list
32    pub parameters: Vec<ParameterDefinition>,
33    /// Parts list
34    pub parts: Vec<Part>,
35    /// Canvas width
36    pub canvas_width: i32,
37    /// Canvas height
38    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    /// Parse moc data from a byte array
67    ///
68    /// ## Safety
69    /// The input data must be a valid moc file
70    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            //
86            parameters: parameters.as_parameters(),
87            //
88            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<usize, L2Error> {
124    //     match usize::decode_var(self.rest()) {
125    //         Some((s, delta)) => {
126    //             self.advance(delta);
127    //             Ok(s)
128    //         }
129    //         None => Err(L2Error::UnknownError {}),
130    //     }
131    // }
132    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