live2d_parser/cubism_v1/moc/
parts.rs

1use super::*;
2use tracing::warn;
3
4#[derive(Debug, Serialize, Deserialize)]
5pub struct Part {
6    /// Part name
7    pub id: String,
8    pub locked: bool,
9    pub visible: bool,
10    pub deformers: ObjectData,
11    pub components: ObjectData,
12}
13
14#[derive(Debug)]
15pub enum PartType {
16    /// Normal part
17    Normal,
18    /// Mesh part
19    Mesh,
20}
21
22impl MocObject for Vec<Part> {
23    fn read_object(r: &MocReader) -> Result<Self, L2Error>
24    where
25        Self: Sized,
26    {
27        let mut parts = Vec::new();
28        let count = r.read_var()?;
29        debug!("Find parts: {}", count);
30        for _ in 0..count {
31            let out = r.read()?;
32            println!("{:#?}", out);
33            parts.push(out);
34        }
35        Ok(parts)
36    }
37}
38
39impl MocObject for Part {
40    fn read_object(r: &MocReader) -> Result<Self, L2Error>
41    where
42        Self: Sized,
43    {
44        let flag: u8 = r.read()?;
45        warn!("flag: {:?}", flag);
46        let locked = flag & 0x01 != 0;
47        let visible = flag & 0x02 != 0;
48        let name = r.read()?;
49        warn!("name: {:?}", name);
50        let deformers = r.read()?;
51        let components = r.read()?;
52        Ok(Self { locked, deformers, id: name, components, visible })
53    }
54}
55
56impl ObjectData {
57    pub fn as_parts(self) -> Vec<Part> {
58        match self {
59            ObjectData::Part(v) => { vec![*v] }
60            ObjectData::ObjectArray(v) => {
61                v.into_iter().map(|o| o.as_parts()).flatten().collect()
62            }
63            s => {
64                warn!("ObjectData::as_parts() called on non-pivot object {s:?}");
65                vec![]
66            }
67        }
68    }
69}