#[cfg(feature = "rustc_hash")]
use rustc_hash::FxHashMap as HashMap;
use serde::{Deserialize, Serialize};
#[cfg(not(feature = "rustc_hash"))]
use std::collections::HashMap;
pub const VRMC_VRM_ANIMATION: &str = "VRMC_vrm_animation";
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VRMCVrmAnimationSchema {
pub spec_version: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub humanoid: Option<VRMCVrmAnimationHumanoid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expressions: Option<VRMCVrmAnimationExpressions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub look_at: Option<VRMCVrmAnimationLookAt>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extensions: Option<HashMap<String, HashMap<String, Option<serde_json::Value>>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extras: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VRMCVrmAnimationHumanoid {
pub human_bones: VRMCVrmAnimationHumanBones,
#[serde(skip_serializing_if = "Option::is_none")]
pub extensions: Option<HashMap<String, HashMap<String, Option<serde_json::Value>>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extras: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VRMCVrmAnimationHumanBones(
pub HashMap<crate::vrmc_vrm_1_0::HumanBoneName, Option<VRMCVrmAnimationHumanBone>>,
);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VRMCVrmAnimationHumanBone {
#[cfg(feature = "gltf_index")]
#[serde(skip_serializing_if = "Option::is_none")]
pub node: Option<gltf::json::Index<gltf::json::Node>>,
#[cfg(not(feature = "gltf_index"))]
#[serde(skip_serializing_if = "Option::is_none")]
pub node: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extensions: Option<HashMap<String, HashMap<String, Option<serde_json::Value>>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extras: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VRMCVrmAnimationExpressions {
#[serde(skip_serializing_if = "Option::is_none")]
pub preset: Option<VRMCVrmAnimationExpressionPreset>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom: Option<HashMap<String, VRMCVrmAnimationExpression>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extensions: Option<HashMap<String, HashMap<String, Option<serde_json::Value>>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extras: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VRMCVrmAnimationExpressionPreset(
pub HashMap<crate::vrmc_vrm_1_0::ExpressionPresetName, VRMCVrmAnimationExpression>,
);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VRMCVrmAnimationExpression {
#[cfg(feature = "gltf_index")]
#[serde(skip_serializing_if = "Option::is_none")]
pub node: Option<gltf::json::Index<gltf::json::Node>>,
#[cfg(not(feature = "gltf_index"))]
#[serde(skip_serializing_if = "Option::is_none")]
pub node: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extensions: Option<HashMap<String, HashMap<String, Option<serde_json::Value>>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extras: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VRMCVrmAnimationLookAt {
#[cfg(feature = "gltf_index")]
#[serde(skip_serializing_if = "Option::is_none")]
pub node: Option<gltf::json::Index<gltf::json::Node>>,
#[cfg(not(feature = "gltf_index"))]
#[serde(skip_serializing_if = "Option::is_none")]
pub node: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset_from_head_bone: Option<[f64; 3]>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extensions: Option<HashMap<String, HashMap<String, Option<serde_json::Value>>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extras: Option<serde_json::Value>,
}