pub mod expression_preset_name;
pub mod human_bone_name;
pub use expression_preset_name::ExpressionPresetName;
pub use human_bone_name::HumanBoneName;
use serde::{Deserialize, Serialize};
pub const VRMC_VRM: &str = "VRMC_vrm";
#[cfg(feature = "rustc_hash")]
use rustc_hash::FxHashMap as HashMap;
#[cfg(not(feature = "rustc_hash"))]
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VRMCVrmSchema {
#[serde(skip_serializing_if = "Option::is_none")]
pub expressions: Option<Expressions>,
#[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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_person: Option<FirstPerson>,
pub humanoid: Humanoid,
#[serde(skip_serializing_if = "Option::is_none")]
pub look_at: Option<LookAt>,
pub meta: Meta,
pub spec_version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Expressions {
#[serde(skip_serializing_if = "Option::is_none")]
pub custom: Option<HashMap<String, Expression>>,
#[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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub preset: Option<Preset>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Expression {
#[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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_binary: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub material_color_binds: Option<Vec<MaterialColorBind>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub morph_target_binds: Option<Vec<MorphTargetBind>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub override_blink: Option<ExpressionOverrideType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub override_look_at: Option<ExpressionOverrideType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub override_mouth: Option<ExpressionOverrideType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub texture_transform_binds: Option<Vec<TextureTransformBind>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MaterialColorBind {
#[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>,
#[cfg(feature = "gltf_index")]
pub material: gltf::json::Index<gltf::json::Material>,
#[cfg(not(feature = "gltf_index"))]
pub material: usize,
pub target_value: Vec<f64>,
pub r#type: MaterialColorType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MorphTargetBind {
#[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>,
pub index: usize,
#[cfg(feature = "gltf_index")]
pub node: gltf::json::Index<gltf::json::Node>,
#[cfg(not(feature = "gltf_index"))]
pub node: usize,
pub weight: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextureTransformBind {
#[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>,
#[cfg(feature = "gltf_index")]
pub material: gltf::json::Index<gltf::json::Node>,
#[cfg(not(feature = "gltf_index"))]
pub material: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<Vec<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scale: Option<Vec<f64>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Preset(pub HashMap<ExpressionPresetName, Expression>);
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FirstPerson {
#[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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mesh_annotations: Option<Vec<MeshAnnotation>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeshAnnotation {
#[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>,
#[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(rename = "type")]
pub mesh_annotation_type: FirstPersonType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Humanoid {
#[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>,
pub human_bones: HumanBones,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HumanBones(pub HashMap<HumanBoneName, Option<HumanBone>>);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HumanBone {
#[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>,
#[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>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LookAt {
#[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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset_from_head_bone: Option<Vec<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub range_map_horizontal_inner: Option<LookAtRangeMap>,
#[serde(skip_serializing_if = "Option::is_none")]
pub range_map_horizontal_outer: Option<LookAtRangeMap>,
#[serde(skip_serializing_if = "Option::is_none")]
pub range_map_vertical_down: Option<LookAtRangeMap>,
#[serde(skip_serializing_if = "Option::is_none")]
pub range_map_vertical_up: Option<LookAtRangeMap>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
pub look_at_type: Option<LookAtType>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LookAtRangeMap {
#[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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_max_value: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_scale: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Meta {
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_antisocial_or_hate_usage: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_excessively_sexual_usage: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_excessively_violent_usage: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_political_or_religious_usage: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_redistribution: Option<bool>,
pub authors: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar_permission: Option<AvatarPermissionType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub commercial_usage: Option<CommercialUsageType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contact_information: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub copyright_information: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub credit_notation: Option<CreditNotationType>,
#[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>,
pub license_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub modification: Option<ModificationType>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub other_license_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub references: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub third_party_licenses: Option<String>,
#[cfg(feature = "gltf_index")]
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail_image: Option<gltf::json::Index<gltf::json::Image>>,
#[cfg(not(feature = "gltf_index"))]
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail_image: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Clone, Copy, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum MaterialColorType {
Color,
EmissionColor,
MatcapColor,
OutlineColor,
RimColor,
ShadeColor,
}
#[derive(Debug, Clone, Copy, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum ExpressionOverrideType {
Blend,
Block,
None,
}
#[derive(Debug, Clone, Copy, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum FirstPersonType {
Auto,
Both,
FirstPersonOnly,
ThirdPersonOnly,
}
#[derive(Debug, Clone, Copy, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum LookAtType {
Bone,
Expression,
}
#[derive(Debug, Clone, Copy, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum AvatarPermissionType {
Everyone,
OnlyAuthor,
OnlySeparatelyLicensedPerson,
}
#[derive(Debug, Clone, Copy, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum CommercialUsageType {
Corporation,
PersonalNonProfit,
PersonalProfit,
}
#[derive(Debug, Clone, Copy, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum CreditNotationType {
Required,
Unnecessary,
}
#[derive(Debug, Clone, Copy, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum ModificationType {
AllowModification,
AllowModificationRedistribution,
Prohibited,
}