live2d_parser/cubism_v1/moc/
parts.rs1use super::*;
2use tracing::warn;
3
4#[derive(Debug, Serialize, Deserialize)]
5pub struct Part {
6 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,
18 Mesh,
20}
21
22impl MocObject for Vec<Part> {
23 unsafe 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 unsafe 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}