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::{any::type_name, ops::AddAssign, slice::SliceIndex};
22use tracing::{error, trace, warn};
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    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    /// Parse moc data from a byte array
73    ///
74    /// ## Safety
75    /// The input data must be a valid moc file
76    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            //
99            parameters: parameters.as_parameters(),
100            //
101            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        // SAFETY: The constructor has checked that the length must be greater >= 4
111        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 unsafe fn read_var(&self) -> Result<usize, L2Error> {
121    //     match usize::decode_var(self.rest()) {
122    //         Some((s, delta)) => {
123    //             self.advance(delta);
124    //             Ok(s)
125    //         }
126    //         None => Err(L2Error::UnknownError {}),
127    //     }
128    // }
129    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}