#[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_SPRING_BONE: &str = "VRMC_springBone";
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VrmcSpringBoneSchema {
#[serde(skip_serializing_if = "Option::is_none")]
pub collider_groups: Option<Vec<ColliderGroup>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub colliders: Option<Vec<Collider>>,
#[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 spec_version: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub springs: Option<Vec<Spring>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ColliderGroup {
pub colliders: Vec<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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Collider {
#[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 node: gltf::json::Index<gltf::json::Node>,
#[cfg(not(feature = "gltf_index"))]
pub node: usize,
pub shape: ColliderShape,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ColliderShape {
#[serde(skip_serializing_if = "Option::is_none")]
pub capsule: Option<ColliderShapeCapsule>,
#[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 sphere: Option<ColliderShapeSphere>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct ColliderShapeCapsule {
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<[f64; 3]>,
#[serde(skip_serializing_if = "Option::is_none")]
pub radius: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tail: Option<[f64; 3]>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct ColliderShapeSphere {
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<[f64; 3]>,
#[serde(skip_serializing_if = "Option::is_none")]
pub radius: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Spring {
#[cfg(feature = "gltf_index")]
pub center: Option<gltf::json::Index<gltf::json::Node>>,
#[cfg(not(feature = "gltf_index"))]
pub center: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub collider_groups: Option<Vec<i64>>,
#[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 joints: Vec<SpringBoneJoint>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SpringBoneJoint {
#[serde(skip_serializing_if = "Option::is_none")]
pub drag_force: Option<f64>,
#[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 gravity_dir: Option<[f64; 3]>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gravity_power: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hit_radius: Option<f64>,
#[cfg(feature = "gltf_index")]
pub node: gltf::json::Index<gltf::json::Node>,
#[cfg(not(feature = "gltf_index"))]
pub node: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub stiffness: Option<f64>,
}