live2d_parser/cubism_v1/moc/
params.rs

1use crate::{
2    cubism_v1::moc::{parts::Part, MocObject, MocReader, ObjectData},
3    L2Error,
4};
5use serde::{Deserialize, Serialize};
6use tracing::{debug, warn};
7
8#[derive(Debug)]
9pub struct ParameterList {
10    items: Vec<u32>,
11}
12
13#[derive(Debug, Serialize, Deserialize)]
14pub struct ParameterDefinition {
15    /// Parameter name
16    pub id: String,
17    /// Minimum value
18    pub min_value: f32,
19    /// Maximum value
20    pub max_value: f32,
21    /// Default value
22    pub default_value: f32,
23}
24
25impl MocObject for ParameterDefinition {
26    unsafe fn read_object(r: &MocReader) -> Result<ParameterDefinition, L2Error>
27    where
28        Self: Sized,
29    {
30        let max_value = r.read()?;
31        let min_value = r.read()?;
32        let default_value = r.read()?;
33        let name = r.read()?;
34        Ok(ParameterDefinition { id: name, min_value, max_value, default_value })
35    }
36}
37
38impl ObjectData {
39    pub fn as_parameters(self) -> Vec<ParameterDefinition> {
40        match self {
41            ObjectData::Parameter(p) => vec![p],
42            ObjectData::ObjectArray(v) => v.into_iter().map(|o| o.as_parameters()).flatten().collect(),
43            s => {
44                warn!("ObjectData::as_parameters() called on non-pivot object {s:?}");
45                vec![]
46            }
47        }
48    }
49}