live2d_parser/cubism_v1/moc/
mod.rs

1mod 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/// The model data structure used in the Live2D SDK2
25#[derive(Serialize, Deserialize)]
26pub struct Moc {
27    /// The version of the moc file
28    pub version: MocVersion,
29    /// Parameter definition list
30    pub parameters: Vec<Parameter>,
31    /// Parts list
32    pub parts: Vec<Part>,
33    /// Canvas width
34    pub canvas_width: i32,
35    /// Canvas height
36    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    /// Parse moc data from a byte array
66    ///
67    /// ## Safety
68    /// The input data must be a valid moc file
69    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            //
92            parameters: parameters.as_parameters(),
93            //
94            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        // SAFETY: The constructor has checked that the length must be greater >= 4
116        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 unsafe fn read_var(&self) -> Result<usize, L2Error> {
126    //     match usize::decode_var(self.rest()) {
127    //         Some((s, delta)) => {
128    //             self.advance(delta);
129    //             Ok(s)
130    //         }
131    //         None => Err(L2Error::UnknownError {}),
132    //     }
133    // }
134    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}