Generate skeleton attention and genepool catalogs (#49)
Some checks failed
Native code generation / deterministic (push) Successful in 5m4s
Imaging and meshing gate / native (push) Failing after 17s
JPEG 2000 feature / linux (push) Failing after 59s
Skia feature / linux (push) Failing after 1m31s

This commit is contained in:
2026-08-09 09:28:40 +00:00
parent 5f83ce61e1
commit 4a32025e37
18 changed files with 7018 additions and 423 deletions

View File

@@ -0,0 +1,147 @@
// @generated by libremetaverse-codegen; DO NOT EDIT.
// Regenerate: cargo run -p libremetaverse-codegen -- generate
// Generator: attentions
// Source: codegen/inputs/attentions.xml sha256=bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af license=BSD-3-Clause
// Source: codegen/inputs/attentionsN.xml sha256=80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b license=BSD-3-Clause
#![allow(
clippy::missing_errors_doc,
clippy::must_use_candidate,
clippy::should_implement_trait
)]
use std::sync::OnceLock;
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AttentionData {
priority: f32,
timeout: f32,
}
impl AttentionData {
pub fn priority(&self) -> f32 {
self.priority
}
pub fn set_priority(&mut self, value: f32) {
self.priority = value;
}
pub fn timeout(&self) -> f32 {
self.timeout
}
pub fn set_timeout(&mut self, value: f32) {
self.timeout = value;
}
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AttentionSet {
name: String,
entries: Vec<AttentionData>,
}
impl AttentionSet {
pub fn get(&self, type_: crate::LookAtType) -> Result<AttentionData, crate::Error> {
self.entries.get(type_ as usize).cloned().ok_or(crate::Error::IndexOutOfRange)
}
pub fn entries(&self) -> Vec<AttentionData> {
self.entries.clone()
}
pub fn set_entries(&mut self, value: Vec<AttentionData>) {
self.entries = value;
}
pub fn name(&self) -> String {
self.name.clone()
}
pub fn set_name(&mut self, value: String) {
self.name = value;
}
}
fn default_sets() -> &'static [AttentionSet] {
static SETS: OnceLock<Vec<AttentionSet>> = OnceLock::new();
SETS.get_or_init(|| {
vec![
AttentionSet { name : "Masculine".to_owned(), entries :
vec![AttentionData { priority : 0.0_f32, timeout : 0.0_f32 },
AttentionData { priority : 1.0_f32, timeout : 3.0_f32 }, AttentionData {
priority : 3.0_f32, timeout : 4.0_f32 }, AttentionData { priority :
2.0_f32, timeout : 2.0_f32 }, AttentionData { priority : 3.0_f32, timeout
: 4.0_f32 }, AttentionData { priority : 4.0_f32, timeout : 1.0_f32 },
AttentionData { priority : 0.0_f32, timeout : - 1.0_f32 }, AttentionData
{ priority : 6.0_f32, timeout : - 1.0_f32 }, AttentionData { priority :
6.0_f32, timeout : - 1.0_f32 }, AttentionData { priority : 7.0_f32,
timeout : - 1.0_f32 }, AttentionData { priority : 0.0_f32, timeout :
0.0_f32 }] }, AttentionSet { name : "Feminine".to_owned(), entries :
vec![AttentionData { priority : 0.0_f32, timeout : 0.0_f32 },
AttentionData { priority : 1.0_f32, timeout : 3.0_f32 }, AttentionData {
priority : 3.0_f32, timeout : 4.0_f32 }, AttentionData { priority :
2.0_f32, timeout : 2.0_f32 }, AttentionData { priority : 3.0_f32, timeout
: 4.0_f32 }, AttentionData { priority : 4.0_f32, timeout : 1.0_f32 },
AttentionData { priority : 0.0_f32, timeout : - 1.0_f32 }, AttentionData
{ priority : 6.0_f32, timeout : - 1.0_f32 }, AttentionData { priority :
6.0_f32, timeout : - 1.0_f32 }, AttentionData { priority : 7.0_f32,
timeout : - 1.0_f32 }, AttentionData { priority : 0.0_f32, timeout :
0.0_f32 }] }
]
})
.as_slice()
}
fn updated_sets() -> &'static [AttentionSet] {
static SETS: OnceLock<Vec<AttentionSet>> = OnceLock::new();
SETS.get_or_init(|| {
vec![
AttentionSet { name : "Masculine".to_owned(), entries :
vec![AttentionData { priority : 0.0_f32, timeout : 0.0_f32 },
AttentionData { priority : 1.0_f32, timeout : 3.0_f32 }, AttentionData {
priority : 3.0_f32, timeout : 4.0_f32 }, AttentionData { priority :
2.0_f32, timeout : 2.0_f32 }, AttentionData { priority : 3.0_f32, timeout
: 3.0_f32 }, AttentionData { priority : 4.0_f32, timeout : 1.0_f32 },
AttentionData { priority : 5.0_f32, timeout : 3.0_f32 }, AttentionData {
priority : 3.5_f32, timeout : - 1.0_f32 }, AttentionData { priority :
3.5_f32, timeout : 20.0_f32 }, AttentionData { priority : 7.0_f32,
timeout : - 1.0_f32 }, AttentionData { priority : 0.0_f32, timeout :
0.0_f32 }] }, AttentionSet { name : "Feminine".to_owned(), entries :
vec![AttentionData { priority : 0.0_f32, timeout : 0.0_f32 },
AttentionData { priority : 1.0_f32, timeout : 3.0_f32 }, AttentionData {
priority : 3.0_f32, timeout : 4.0_f32 }, AttentionData { priority :
2.0_f32, timeout : 2.0_f32 }, AttentionData { priority : 3.0_f32, timeout
: 6.0_f32 }, AttentionData { priority : 4.0_f32, timeout : 1.0_f32 },
AttentionData { priority : 5.0_f32, timeout : 6.0_f32 }, AttentionData {
priority : 2.5_f32, timeout : - 1.0_f32 }, AttentionData { priority :
2.5_f32, timeout : 10.0_f32 }, AttentionData { priority : 7.0_f32,
timeout : - 1.0_f32 }, AttentionData { priority : 0.0_f32, timeout :
0.0_f32 }] }
]
})
.as_slice()
}
pub struct LindenAttentions;
impl LindenAttentions {
pub fn default() -> Vec<AttentionSet> {
default_sets().to_vec()
}
pub fn updated() -> Vec<AttentionSet> {
updated_sets().to_vec()
}
pub fn default_masculine() -> AttentionSet {
default_sets()[0].clone()
}
pub fn default_feminine() -> AttentionSet {
default_sets()[1].clone()
}
pub fn updated_masculine() -> AttentionSet {
updated_sets()[0].clone()
}
pub fn updated_feminine() -> AttentionSet {
updated_sets()[1].clone()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn generated_attention_shape() {
assert_eq!(default_sets().len(), 2);
assert_eq!(updated_sets().len(), 2);
assert!(
default_sets().iter().chain(updated_sets()).all(| set | set.entries.len() ==
11)
);
assert_eq!(default_sets() [0].name, "Masculine");
assert_eq!(default_sets() [1].name, "Feminine");
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -4789,33 +4789,10 @@ impl AppearanceSetEventArgs {
}
/// C# type: `T:LibreMetaverse.ArchetypeParam`.
pub struct ArchetypeParam;
impl ArchetypeParam {
/// C# member: `P:LibreMetaverse.ArchetypeParam.Id`.
pub fn id(&self) -> i32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.ArchetypeParam.Id")
}
/// Setter for C# member: `P:LibreMetaverse.ArchetypeParam.Id`.
pub fn set_id(&mut self, value: i32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.ArchetypeParam.Id")
}
/// C# member: `P:LibreMetaverse.ArchetypeParam.Name`.
pub fn name(&self) -> String {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.ArchetypeParam.Name")
}
/// Setter for C# member: `P:LibreMetaverse.ArchetypeParam.Name`.
pub fn set_name(&mut self, value: String) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.ArchetypeParam.Name")
}
/// C# member: `P:LibreMetaverse.ArchetypeParam.Value`.
pub fn value(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.ArchetypeParam.Value")
}
/// Setter for C# member: `P:LibreMetaverse.ArchetypeParam.Value`.
pub fn set_value(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.ArchetypeParam.Value")
}
}
/// C# member: `P:LibreMetaverse.ArchetypeParam.Id`.
/// C# member: `P:LibreMetaverse.ArchetypeParam.Name`.
/// C# member: `P:LibreMetaverse.ArchetypeParam.Value`.
pub use crate::genepool_catalog::ArchetypeParam;
/// C# type: `T:LibreMetaverse.AssetCache`.
pub struct AssetCache {
@@ -5420,55 +5397,15 @@ impl AttachedSoundGainChangeEventArgs {
}
/// C# type: `T:LibreMetaverse.AttentionData`.
pub struct AttentionData;
impl AttentionData {
/// C# member: `P:LibreMetaverse.AttentionData.Priority`.
pub fn priority(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.AttentionData.Priority")
}
/// Setter for C# member: `P:LibreMetaverse.AttentionData.Priority`.
pub fn set_priority(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.AttentionData.Priority")
}
/// C# member: `P:LibreMetaverse.AttentionData.Timeout`.
pub fn timeout(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.AttentionData.Timeout")
}
/// Setter for C# member: `P:LibreMetaverse.AttentionData.Timeout`.
pub fn set_timeout(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.AttentionData.Timeout")
}
}
/// C# member: `P:LibreMetaverse.AttentionData.Priority`.
/// C# member: `P:LibreMetaverse.AttentionData.Timeout`.
pub use crate::attention_catalog::AttentionData;
/// C# type: `T:LibreMetaverse.AttentionSet`.
pub struct AttentionSet;
impl AttentionSet {
/// C# member: `M:LibreMetaverse.AttentionSet.Get(LibreMetaverse.LookAtType)`.
pub fn get(
&self,
type_: libremetaverse::LookAtType,
) -> Result<libremetaverse::AttentionData, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.AttentionSet.Get(LibreMetaverse.LookAtType)",
)
}
/// C# member: `P:LibreMetaverse.AttentionSet.Entries`.
pub fn entries(&self) -> Vec<libremetaverse::AttentionData> {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.AttentionSet.Entries")
}
/// Setter for C# member: `P:LibreMetaverse.AttentionSet.Entries`.
pub fn set_entries(&mut self, value: Vec<libremetaverse::AttentionData>) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.AttentionSet.Entries")
}
/// C# member: `P:LibreMetaverse.AttentionSet.Name`.
pub fn name(&self) -> String {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.AttentionSet.Name")
}
/// Setter for C# member: `P:LibreMetaverse.AttentionSet.Name`.
pub fn set_name(&mut self, value: String) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.AttentionSet.Name")
}
}
/// C# member: `M:LibreMetaverse.AttentionSet.Get(LibreMetaverse.LookAtType)`.
/// C# member: `P:LibreMetaverse.AttentionSet.Entries`.
/// C# member: `P:LibreMetaverse.AttentionSet.Name`.
pub use crate::attention_catalog::AttentionSet;
/// C# type: `T:LibreMetaverse.Avatar`.
pub struct Avatar {
@@ -10936,42 +10873,15 @@ impl GLTFMaterialUpdate {
}
/// C# type: `T:LibreMetaverse.Genepool`.
pub struct Genepool;
impl Genepool {
/// C# member: `F:LibreMetaverse.Genepool.Archetypes`.
pub fn archetypes() -> Vec<libremetaverse::GenepoolArchetype> {
libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Genepool.Archetypes")
}
/// C# member: `M:LibreMetaverse.Genepool.FindIndex(System.String)`.
pub fn find_index(name: String) -> Result<i32, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Genepool.FindIndex(System.String)")
}
/// C# member: `M:LibreMetaverse.Genepool.Get(System.Int32)`.
pub fn get(index: i32) -> Result<libremetaverse::GenepoolArchetype, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Genepool.Get(System.Int32)")
}
}
/// C# member: `F:LibreMetaverse.Genepool.Archetypes`.
/// C# member: `M:LibreMetaverse.Genepool.FindIndex(System.String)`.
/// C# member: `M:LibreMetaverse.Genepool.Get(System.Int32)`.
pub use crate::genepool_catalog::Genepool;
/// C# type: `T:LibreMetaverse.GenepoolArchetype`.
pub struct GenepoolArchetype;
impl GenepoolArchetype {
/// C# member: `P:LibreMetaverse.GenepoolArchetype.Name`.
pub fn name(&self) -> String {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GenepoolArchetype.Name")
}
/// Setter for C# member: `P:LibreMetaverse.GenepoolArchetype.Name`.
pub fn set_name(&mut self, value: String) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GenepoolArchetype.Name")
}
/// C# member: `P:LibreMetaverse.GenepoolArchetype.Params`.
pub fn params(&self) -> Vec<libremetaverse::ArchetypeParam> {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GenepoolArchetype.Params")
}
/// Setter for C# member: `P:LibreMetaverse.GenepoolArchetype.Params`.
pub fn set_params(&mut self, value: Vec<libremetaverse::ArchetypeParam>) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GenepoolArchetype.Params")
}
}
/// C# member: `P:LibreMetaverse.GenepoolArchetype.Name`.
/// C# member: `P:LibreMetaverse.GenepoolArchetype.Params`.
pub use crate::genepool_catalog::GenepoolArchetype;
/// C# type: `T:LibreMetaverse.GenericStreamingMessageEventArgs`.
pub struct GenericStreamingMessageEventArgs;
@@ -17214,41 +17124,13 @@ impl LegacyEnvironmentEventArgs {
}
/// C# type: `T:LibreMetaverse.LindenAttentions`.
pub struct LindenAttentions;
impl LindenAttentions {
/// C# member: `F:LibreMetaverse.LindenAttentions.Default`.
pub fn default() -> Vec<libremetaverse::AttentionSet> {
libremetaverse_types::unimplemented_api!("F:LibreMetaverse.LindenAttentions.Default")
}
/// C# member: `F:LibreMetaverse.LindenAttentions.Updated`.
pub fn updated() -> Vec<libremetaverse::AttentionSet> {
libremetaverse_types::unimplemented_api!("F:LibreMetaverse.LindenAttentions.Updated")
}
/// C# member: `P:LibreMetaverse.LindenAttentions.DefaultFeminine`.
pub fn default_feminine() -> libremetaverse::AttentionSet {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.LindenAttentions.DefaultFeminine"
)
}
/// C# member: `P:LibreMetaverse.LindenAttentions.DefaultMasculine`.
pub fn default_masculine() -> libremetaverse::AttentionSet {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.LindenAttentions.DefaultMasculine"
)
}
/// C# member: `P:LibreMetaverse.LindenAttentions.UpdatedFeminine`.
pub fn updated_feminine() -> libremetaverse::AttentionSet {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.LindenAttentions.UpdatedFeminine"
)
}
/// C# member: `P:LibreMetaverse.LindenAttentions.UpdatedMasculine`.
pub fn updated_masculine() -> libremetaverse::AttentionSet {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.LindenAttentions.UpdatedMasculine"
)
}
}
/// C# member: `F:LibreMetaverse.LindenAttentions.Default`.
/// C# member: `F:LibreMetaverse.LindenAttentions.Updated`.
/// C# member: `P:LibreMetaverse.LindenAttentions.DefaultFeminine`.
/// C# member: `P:LibreMetaverse.LindenAttentions.DefaultMasculine`.
/// C# member: `P:LibreMetaverse.LindenAttentions.UpdatedFeminine`.
/// C# member: `P:LibreMetaverse.LindenAttentions.UpdatedMasculine`.
pub use crate::attention_catalog::LindenAttentions;
/// C# type: `T:LibreMetaverse.LiveParticle`.
pub struct LiveParticle {
@@ -170382,15 +170264,8 @@ pub mod rendering {
impl BoneTransform {}
/// C# type: `T:LibreMetaverse.Rendering.CollisionVolume`.
pub struct CollisionVolume;
impl CollisionVolume {
/// C# member: `M:LibreMetaverse.Rendering.CollisionVolume.#ctor`.
pub fn new() -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Rendering.CollisionVolume.#ctor",
)
}
}
/// C# member: `M:LibreMetaverse.Rendering.CollisionVolume.#ctor`.
pub use crate::skeleton::CollisionVolume;
/// C# type: `T:LibreMetaverse.Rendering.DetailLevel`.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
@@ -170667,150 +170542,27 @@ pub mod rendering {
}
/// C# type: `T:LibreMetaverse.Rendering.Joint`.
pub struct Joint {
/// Rust composition for C# base type `LibreMetaverse.Rendering.JointBase`.
pub base: libremetaverse::rendering::JointBase,
}
impl Joint {
/// C# member: `M:LibreMetaverse.Rendering.Joint.#ctor`.
pub fn new() -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Rendering.Joint.#ctor")
}
/// C# member: `M:LibreMetaverse.Rendering.Joint.GetAliasesList`.
pub fn get_aliases_list(&self) -> Result<Vec<String>, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Rendering.Joint.GetAliasesList")
}
/// C# member: `P:LibreMetaverse.Rendering.Joint.aliases`.
pub fn aliases(&self) -> String {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.Joint.aliases")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.Joint.aliases`.
pub fn set_aliases(&mut self, value: String) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.Joint.aliases")
}
/// C# member: `P:LibreMetaverse.Rendering.Joint.bone`.
pub fn bone(&self) -> Option<Vec<libremetaverse::rendering::Joint>> {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.Joint.bone")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.Joint.bone`.
pub fn set_bone(&mut self, value: Option<Vec<libremetaverse::rendering::Joint>>) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.Joint.bone")
}
/// C# member: `P:LibreMetaverse.Rendering.Joint.collision_volume`.
pub fn collision_volume(&self) -> Vec<libremetaverse::rendering::CollisionVolume> {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.Joint.collision_volume"
)
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.Joint.collision_volume`.
pub fn set_collision_volume(
&mut self,
value: Vec<libremetaverse::rendering::CollisionVolume>,
) {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.Joint.collision_volume"
)
}
/// C# member: `P:LibreMetaverse.Rendering.Joint.connected`.
pub fn connected(&self) -> bool {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.Joint.connected")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.Joint.connected`.
pub fn set_connected(&mut self, value: bool) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.Joint.connected")
}
/// C# member: `P:LibreMetaverse.Rendering.Joint.pivot`.
pub fn pivot(&self) -> Vec<f32> {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.Joint.pivot")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.Joint.pivot`.
pub fn set_pivot(&mut self, value: Vec<f32>) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.Joint.pivot")
}
}
/// C# member: `M:LibreMetaverse.Rendering.Joint.#ctor`.
/// C# member: `M:LibreMetaverse.Rendering.Joint.GetAliasesList`.
/// C# member: `P:LibreMetaverse.Rendering.Joint.aliases`.
/// C# member: `P:LibreMetaverse.Rendering.Joint.bone`.
/// C# member: `P:LibreMetaverse.Rendering.Joint.collision_volume`.
/// C# member: `P:LibreMetaverse.Rendering.Joint.connected`.
/// C# member: `P:LibreMetaverse.Rendering.Joint.pivot`.
pub use crate::skeleton::Joint;
/// C# type: `T:LibreMetaverse.Rendering.JointBase`.
pub struct JointBase;
impl JointBase {
/// C# member: `M:LibreMetaverse.Rendering.JointBase.#ctor`.
pub fn new() -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Rendering.JointBase.#ctor")
}
/// C# member: `P:LibreMetaverse.Rendering.JointBase.SupportCategory`.
pub fn support_category(&self) -> libremetaverse::rendering::JointSupportCategory {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.JointBase.SupportCategory"
)
}
/// C# member: `P:LibreMetaverse.Rendering.JointBase.end`.
pub fn end(&self) -> Vec<f32> {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.end")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.JointBase.end`.
pub fn set_end(&mut self, value: Vec<f32>) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.end")
}
/// C# member: `P:LibreMetaverse.Rendering.JointBase.group`.
pub fn group(&self) -> String {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.group")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.JointBase.group`.
pub fn set_group(&mut self, value: String) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.group")
}
/// C# member: `P:LibreMetaverse.Rendering.JointBase.name`.
pub fn name(&self) -> String {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.name")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.JointBase.name`.
pub fn set_name(&mut self, value: String) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.name")
}
/// C# member: `P:LibreMetaverse.Rendering.JointBase.pos`.
pub fn pos(&self) -> Vec<f32> {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.pos")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.JointBase.pos`.
pub fn set_pos(&mut self, value: Vec<f32>) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.pos")
}
/// C# member: `P:LibreMetaverse.Rendering.JointBase.reposition`.
pub fn reposition(&self) -> bool {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.JointBase.reposition"
)
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.JointBase.reposition`.
pub fn set_reposition(&mut self, value: bool) {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.JointBase.reposition"
)
}
/// C# member: `P:LibreMetaverse.Rendering.JointBase.rot`.
pub fn rot(&self) -> Vec<f32> {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.rot")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.JointBase.rot`.
pub fn set_rot(&mut self, value: Vec<f32>) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.rot")
}
/// C# member: `P:LibreMetaverse.Rendering.JointBase.scale`.
pub fn scale(&self) -> Vec<f32> {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.scale")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.JointBase.scale`.
pub fn set_scale(&mut self, value: Vec<f32>) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.scale")
}
/// C# member: `P:LibreMetaverse.Rendering.JointBase.support`.
pub fn support(&self) -> String {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.support")
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.JointBase.support`.
pub fn set_support(&mut self, value: String) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.Rendering.JointBase.support")
}
}
/// C# member: `M:LibreMetaverse.Rendering.JointBase.#ctor`.
/// C# member: `P:LibreMetaverse.Rendering.JointBase.SupportCategory`.
/// C# member: `P:LibreMetaverse.Rendering.JointBase.end`.
/// C# member: `P:LibreMetaverse.Rendering.JointBase.group`.
/// C# member: `P:LibreMetaverse.Rendering.JointBase.name`.
/// C# member: `P:LibreMetaverse.Rendering.JointBase.pos`.
/// C# member: `P:LibreMetaverse.Rendering.JointBase.reposition`.
/// C# member: `P:LibreMetaverse.Rendering.JointBase.rot`.
/// C# member: `P:LibreMetaverse.Rendering.JointBase.scale`.
/// C# member: `P:LibreMetaverse.Rendering.JointBase.support`.
pub use crate::skeleton::JointBase;
/// C# type: `T:LibreMetaverse.Rendering.JointSupportCategory`.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
@@ -171284,133 +171036,20 @@ pub mod rendering {
}
/// C# type: `T:LibreMetaverse.Rendering.LindenSkeleton`.
pub struct LindenSkeleton;
impl LindenSkeleton {
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.#ctor`.
pub fn new() -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Rendering.LindenSkeleton.#ctor")
}
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.BuildExpandedJointList(System.Collections.Generic.IEnumerable{System.String})`.
pub fn build_expanded_joint_list(
&self,
joints_filter: Box<dyn Iterator<Item = String>>,
) -> Result<Vec<String>, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Rendering.LindenSkeleton.BuildExpandedJointList(System.Collections.Generic.IEnumerable{System.String})",
)
}
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.BuildJointDictionary`.
pub fn build_joint_dictionary(
&self,
) -> Result<
std::collections::HashMap<String, std::sync::Arc<libremetaverse::rendering::Joint>>,
crate::Error,
> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Rendering.LindenSkeleton.BuildJointDictionary",
)
}
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.GetAllJoints`.
pub fn get_all_joints(
&self,
) -> Result<
Box<dyn Iterator<Item = std::sync::Arc<libremetaverse::rendering::Joint>>>,
crate::Error,
> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Rendering.LindenSkeleton.GetAllJoints",
)
}
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.GetBone(System.String)`.
pub fn get_bone(
&self,
name_or_alias: String,
) -> Result<Option<std::sync::Arc<libremetaverse::rendering::Joint>>, crate::Error>
{
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Rendering.LindenSkeleton.GetBone(System.String)",
)
}
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.GetDefault`.
pub fn get_default() -> Result<libremetaverse::rendering::LindenSkeleton, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Rendering.LindenSkeleton.GetDefault",
)
}
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.Load`.
pub fn load_with_method() -> Result<libremetaverse::rendering::LindenSkeleton, crate::Error>
{
libremetaverse_types::not_implemented("M:LibreMetaverse.Rendering.LindenSkeleton.Load")
}
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.Load(System.String)`.
pub fn load_with_string(
file_name: Option<String>,
) -> Result<libremetaverse::rendering::LindenSkeleton, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Rendering.LindenSkeleton.Load(System.String)",
)
}
/// C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.bone`.
pub fn bone(&self) -> libremetaverse::rendering::Joint {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.LindenSkeleton.bone"
)
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.bone`.
pub fn set_bone(&mut self, value: libremetaverse::rendering::Joint) {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.LindenSkeleton.bone"
)
}
/// C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.num_bones`.
pub fn num_bones(&self) -> String {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.LindenSkeleton.num_bones"
)
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.num_bones`.
pub fn set_num_bones(&mut self, value: String) {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.LindenSkeleton.num_bones"
)
}
/// C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.num_collision_volumes`.
pub fn num_collision_volumes(&self) -> String {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.LindenSkeleton.num_collision_volumes"
)
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.num_collision_volumes`.
pub fn set_num_collision_volumes(&mut self, value: String) {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.LindenSkeleton.num_collision_volumes"
)
}
/// C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.version`.
pub fn version(&self) -> f32 {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.LindenSkeleton.version"
)
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.version`.
pub fn set_version(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.LindenSkeleton.version"
)
}
/// C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.versionSpecified`.
pub fn version_specified(&self) -> bool {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.LindenSkeleton.versionSpecified"
)
}
/// Setter for C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.versionSpecified`.
pub fn set_version_specified(&mut self, value: bool) {
libremetaverse_types::unimplemented_api!(
"P:LibreMetaverse.Rendering.LindenSkeleton.versionSpecified"
)
}
}
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.#ctor`.
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.BuildExpandedJointList(System.Collections.Generic.IEnumerable{System.String})`.
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.BuildJointDictionary`.
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.GetAllJoints`.
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.GetBone(System.String)`.
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.GetDefault`.
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.Load`.
/// C# member: `M:LibreMetaverse.Rendering.LindenSkeleton.Load(System.String)`.
/// C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.bone`.
/// C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.num_bones`.
/// C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.num_collision_volumes`.
/// C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.version`.
/// C# member: `P:LibreMetaverse.Rendering.LindenSkeleton.versionSpecified`.
pub use crate::skeleton::LindenSkeleton;
/// C# type: `T:LibreMetaverse.Rendering.Mesh`.
pub struct Mesh {

View File

@@ -2,15 +2,22 @@
extern crate self as libremetaverse;
#[rustfmt::skip] // Deterministic machine output is formatted by the pinned generator.
mod attention_catalog;
mod bit_pack;
#[rustfmt::skip] // Deterministic machine output is formatted by the pinned generator.
mod foliage_catalog;
mod generated;
#[rustfmt::skip] // Deterministic machine output is formatted by the pinned generator.
mod genepool_catalog;
mod j2k;
mod message_codec;
#[rustfmt::skip]
pub mod packet_catalog;
mod packet_wire;
mod skeleton;
#[rustfmt::skip] // Deterministic machine output is formatted by the pinned generator.
mod skeleton_catalog;
mod targa;
#[rustfmt::skip] // Deterministic machine output is formatted by the pinned generator.
mod visual_catalog;

View File

@@ -0,0 +1,580 @@
//! Native skeleton records, traversal helpers, and custom XML loading.
#![allow(clippy::missing_errors_doc)] // Public signatures are fixed by the compatibility catalog.
#![allow(clippy::must_use_candidate)] // Getters mirror C# properties.
#![allow(clippy::needless_pass_by_value)] // Owned strings are fixed by the compatibility API.
#![allow(clippy::unnecessary_wraps)] // Constructors mirror fallible mapped signatures.
use roxmltree::{Document, Node};
use std::collections::{HashMap, HashSet};
use std::sync::Arc;
#[derive(Clone, Debug, Default, PartialEq)]
pub struct JointBase {
name: String,
pos: Vec<f32>,
rot: Vec<f32>,
scale: Vec<f32>,
group: String,
support: String,
end: Vec<f32>,
reposition: bool,
}
impl JointBase {
pub fn new() -> Result<Self, crate::Error> {
Ok(Self::default())
}
pub fn support_category(&self) -> crate::rendering::JointSupportCategory {
if self.support.eq_ignore_ascii_case("extended") {
crate::rendering::JointSupportCategory::Extended
} else {
crate::rendering::JointSupportCategory::Base
}
}
pub fn end(&self) -> Vec<f32> {
self.end.clone()
}
pub fn set_end(&mut self, value: Vec<f32>) {
self.end = value;
}
pub fn group(&self) -> String {
self.group.clone()
}
pub fn set_group(&mut self, value: String) {
self.group = value;
}
pub fn name(&self) -> String {
self.name.clone()
}
pub fn set_name(&mut self, value: String) {
self.name = value;
}
pub fn pos(&self) -> Vec<f32> {
self.pos.clone()
}
pub fn set_pos(&mut self, value: Vec<f32>) {
self.pos = value;
}
pub fn reposition(&self) -> bool {
self.reposition
}
pub fn set_reposition(&mut self, value: bool) {
self.reposition = value;
}
pub fn rot(&self) -> Vec<f32> {
self.rot.clone()
}
pub fn set_rot(&mut self, value: Vec<f32>) {
self.rot = value;
}
pub fn scale(&self) -> Vec<f32> {
self.scale.clone()
}
pub fn set_scale(&mut self, value: Vec<f32>) {
self.scale = value;
}
pub fn support(&self) -> String {
self.support.clone()
}
pub fn set_support(&mut self, value: String) {
self.support = value;
}
#[allow(clippy::too_many_arguments)]
pub(crate) fn from_parts(
name: String,
pos: Vec<f32>,
rot: Vec<f32>,
scale: Vec<f32>,
group: String,
support: String,
end: Vec<f32>,
reposition: bool,
) -> Self {
Self {
name,
pos,
rot,
scale,
group,
support,
end,
reposition,
}
}
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CollisionVolume {
pub base: JointBase,
}
impl CollisionVolume {
pub fn new() -> Result<Self, crate::Error> {
Ok(Self::default())
}
pub(crate) fn from_base(base: JointBase) -> Self {
Self { base }
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct Joint {
pub base: JointBase,
collision_volume: Vec<CollisionVolume>,
bone: Option<Vec<Joint>>,
pivot: Vec<f32>,
aliases: String,
connected: bool,
}
impl Default for Joint {
fn default() -> Self {
Self {
base: JointBase::default(),
collision_volume: Vec::new(),
bone: Some(Vec::new()),
pivot: Vec::new(),
aliases: String::new(),
connected: false,
}
}
}
impl Joint {
pub fn new() -> Result<Self, crate::Error> {
Ok(Self::default())
}
pub fn get_aliases_list(&self) -> Result<Vec<String>, crate::Error> {
Ok(self
.aliases
.split_ascii_whitespace()
.map(str::to_owned)
.collect())
}
pub fn aliases(&self) -> String {
self.aliases.clone()
}
pub fn set_aliases(&mut self, value: String) {
self.aliases = value;
}
pub fn bone(&self) -> Option<Vec<Self>> {
self.bone.clone()
}
pub fn set_bone(&mut self, value: Option<Vec<Self>>) {
self.bone = value;
}
pub fn collision_volume(&self) -> Vec<CollisionVolume> {
self.collision_volume.clone()
}
pub fn set_collision_volume(&mut self, value: Vec<CollisionVolume>) {
self.collision_volume = value;
}
pub fn connected(&self) -> bool {
self.connected
}
pub fn set_connected(&mut self, value: bool) {
self.connected = value;
}
pub fn pivot(&self) -> Vec<f32> {
self.pivot.clone()
}
pub fn set_pivot(&mut self, value: Vec<f32>) {
self.pivot = value;
}
pub(crate) fn from_parts(
base: JointBase,
collision_volume: Vec<CollisionVolume>,
bone: Vec<Self>,
pivot: Vec<f32>,
aliases: String,
connected: bool,
) -> Self {
Self {
base,
collision_volume,
bone: Some(bone),
pivot,
aliases,
connected,
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct LindenSkeleton {
bone: Joint,
version: f32,
version_specified: bool,
num_bones: String,
num_collision_volumes: String,
}
impl Default for LindenSkeleton {
fn default() -> Self {
Self {
bone: Joint::default(),
version: 0.0,
version_specified: false,
num_bones: String::new(),
num_collision_volumes: String::new(),
}
}
}
impl LindenSkeleton {
pub fn new() -> Result<Self, crate::Error> {
Ok(Self::default())
}
pub fn build_expanded_joint_list(
&self,
joints_filter: Box<dyn Iterator<Item = String>>,
) -> Result<Vec<String>, crate::Error> {
let filter = joints_filter.collect::<Vec<_>>();
let mut expanded = Vec::new();
if let Some(children) = &self.bone.bone {
for child in children {
expand_joint(child, &self.bone.base.name, &mut expanded, &filter);
}
}
Ok(expanded)
}
pub fn build_joint_dictionary(&self) -> Result<HashMap<String, Arc<Joint>>, crate::Error> {
let mut dictionary = HashMap::new();
for joint in collect_joints(&self.bone) {
if !joint.base.name.is_empty() {
dictionary.insert(joint.base.name.clone(), Arc::clone(&joint));
}
for alias in joint.aliases.split_ascii_whitespace() {
if !alias.is_empty() {
dictionary.insert(alias.to_owned(), Arc::clone(&joint));
}
}
}
Ok(dictionary)
}
pub fn get_all_joints(&self) -> Result<Box<dyn Iterator<Item = Arc<Joint>>>, crate::Error> {
Ok(Box::new(collect_joints(&self.bone).into_iter()))
}
pub fn get_bone(&self, name_or_alias: String) -> Result<Option<Arc<Joint>>, crate::Error> {
if name_or_alias.is_empty() {
return Ok(None);
}
Ok(self.build_joint_dictionary()?.remove(&name_or_alias))
}
pub fn get_default() -> Result<Self, crate::Error> {
Ok(crate::skeleton_catalog::default_skeleton())
}
pub fn load_with_method() -> Result<Self, crate::Error> {
Self::get_default()
}
pub fn load_with_string(file_name: Option<String>) -> Result<Self, crate::Error> {
let Some(file_name) = file_name else {
return Self::get_default();
};
let text = std::fs::read_to_string(file_name).map_err(|_| crate::Error::Argument)?;
parse_skeleton_xml(&text)
}
pub fn bone(&self) -> Joint {
self.bone.clone()
}
pub fn set_bone(&mut self, value: Joint) {
self.bone = value;
}
pub fn num_bones(&self) -> String {
self.num_bones.clone()
}
pub fn set_num_bones(&mut self, value: String) {
self.num_bones = value;
}
pub fn num_collision_volumes(&self) -> String {
self.num_collision_volumes.clone()
}
pub fn set_num_collision_volumes(&mut self, value: String) {
self.num_collision_volumes = value;
}
pub fn version(&self) -> f32 {
self.version
}
pub fn set_version(&mut self, value: f32) {
self.version = value;
}
pub fn version_specified(&self) -> bool {
self.version_specified
}
pub fn set_version_specified(&mut self, value: bool) {
self.version_specified = value;
}
pub(crate) fn from_parts(
bone: Joint,
version: f32,
version_specified: bool,
num_bones: String,
num_collision_volumes: String,
) -> Self {
Self {
bone,
version,
version_specified,
num_bones,
num_collision_volumes,
}
}
}
fn collect_joints(root: &Joint) -> Vec<Arc<Joint>> {
fn visit(joint: &Joint, output: &mut Vec<Arc<Joint>>) {
output.push(Arc::new(joint.clone()));
if let Some(children) = &joint.bone {
for child in children {
visit(child, output);
}
}
}
let mut output = Vec::new();
visit(root, &mut output);
output
}
fn expand_joint(
current: &Joint,
effective_parent: &str,
expanded: &mut Vec<String>,
filter: &[String],
) {
let mut next_effective_parent = effective_parent;
if filter.iter().any(|name| name == &current.base.name) {
let parent_matches_last = expanded.last().is_some_and(|last| last == effective_parent);
if !parent_matches_last && filter.iter().any(|name| name == effective_parent) {
expanded.push(effective_parent.to_owned());
}
expanded.push(current.base.name.clone());
next_effective_parent = &current.base.name;
}
if let Some(children) = &current.bone {
for child in children {
expand_joint(child, next_effective_parent, expanded, filter);
}
}
}
fn parse_error(position: usize) -> crate::Error {
crate::Error::Parse {
position,
context: "avatar skeleton XML",
}
}
fn node_position(node: Node<'_, '_>) -> usize {
node.range().start
}
fn required_attribute<'a>(node: Node<'a, '_>, name: &str) -> Result<&'a str, crate::Error> {
node.attribute(name)
.filter(|value| !value.is_empty())
.ok_or_else(|| parse_error(node_position(node)))
}
fn vector_attribute(node: Node<'_, '_>, name: &str) -> Result<Vec<f32>, crate::Error> {
let Some(value) = node.attribute(name) else {
return Ok(Vec::new());
};
let values = value
.split_ascii_whitespace()
.map(str::parse::<f32>)
.collect::<Result<Vec<_>, _>>()
.map_err(|_| parse_error(node_position(node)))?;
if values.len() != 3 || values.iter().any(|value| !value.is_finite()) {
return Err(parse_error(node_position(node)));
}
Ok(values)
}
fn boolean_attribute(node: Node<'_, '_>, name: &str) -> Result<bool, crate::Error> {
match node.attribute(name) {
None => Ok(false),
Some(value) if value.eq_ignore_ascii_case("true") => Ok(true),
Some(value) if value.eq_ignore_ascii_case("false") => Ok(false),
Some(_) => Err(parse_error(node_position(node))),
}
}
fn parse_base(node: Node<'_, '_>) -> Result<JointBase, crate::Error> {
let support = node.attribute("support").unwrap_or_default();
if !support.is_empty()
&& !support.eq_ignore_ascii_case("base")
&& !support.eq_ignore_ascii_case("extended")
{
return Err(parse_error(node_position(node)));
}
Ok(JointBase::from_parts(
required_attribute(node, "name")?.to_owned(),
vector_attribute(node, "pos")?,
vector_attribute(node, "rot")?,
vector_attribute(node, "scale")?,
node.attribute("group").unwrap_or_default().to_owned(),
support.to_owned(),
vector_attribute(node, "end")?,
boolean_attribute(node, "reposition")?,
))
}
fn parse_joint(node: Node<'_, '_>, names: &mut HashSet<String>) -> Result<Joint, crate::Error> {
if !node.has_tag_name("bone") {
return Err(parse_error(node_position(node)));
}
let base = parse_base(node)?;
if !names.insert(base.name.clone()) {
return Err(parse_error(node_position(node)));
}
let aliases = node.attribute("aliases").unwrap_or_default().to_owned();
for alias in aliases.split_ascii_whitespace() {
if !names.insert(alias.to_owned()) {
return Err(parse_error(node_position(node)));
}
}
let mut collision_volumes = Vec::new();
let mut bones = Vec::new();
for child in node.children().filter(Node::is_element) {
if child.has_tag_name("collision_volume") {
if child.children().any(|node| node.is_element()) {
return Err(parse_error(node_position(child)));
}
collision_volumes.push(CollisionVolume::from_base(parse_base(child)?));
} else if child.has_tag_name("bone") {
bones.push(parse_joint(child, names)?);
} else {
return Err(parse_error(node_position(child)));
}
}
Ok(Joint::from_parts(
base,
collision_volumes,
bones,
vector_attribute(node, "pivot")?,
aliases,
boolean_attribute(node, "connected")?,
))
}
pub(crate) fn parse_skeleton_xml(text: &str) -> Result<LindenSkeleton, crate::Error> {
let document = Document::parse(text).map_err(|_| parse_error(0))?;
let root = document.root_element();
if !root.has_tag_name("linden_skeleton") {
return Err(parse_error(node_position(root)));
}
let version_text = required_attribute(root, "version")?;
let version = version_text
.parse::<f32>()
.map_err(|_| parse_error(node_position(root)))?;
if !version.is_finite() {
return Err(parse_error(node_position(root)));
}
let num_bones = required_attribute(root, "num_bones")?.to_owned();
let expected_bones = num_bones
.parse::<usize>()
.map_err(|_| parse_error(node_position(root)))?;
let num_collision_volumes = required_attribute(root, "num_collision_volumes")?.to_owned();
let expected_collision_volumes = num_collision_volumes
.parse::<usize>()
.map_err(|_| parse_error(node_position(root)))?;
let root_bones = root.children().filter(Node::is_element).collect::<Vec<_>>();
if root_bones.len() != 1 || !root_bones[0].has_tag_name("bone") {
return Err(parse_error(node_position(root)));
}
let mut names = HashSet::new();
let bone = parse_joint(root_bones[0], &mut names)?;
let (actual_bones, actual_collision_volumes) = skeleton_counts(&bone);
if actual_bones != expected_bones || actual_collision_volumes != expected_collision_volumes {
return Err(parse_error(node_position(root)));
}
Ok(LindenSkeleton::from_parts(
bone,
version,
true,
num_bones,
num_collision_volumes,
))
}
pub(crate) fn skeleton_counts(root: &Joint) -> (usize, usize) {
let mut bones = 1;
let mut collision_volumes = root.collision_volume.len();
if let Some(children) = &root.bone {
for child in children {
let (child_bones, child_collision_volumes) = skeleton_counts(child);
bones += child_bones;
collision_volumes += child_collision_volumes;
}
}
(bones, collision_volumes)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn runtime_parser_rejects_count_mismatches_and_unknown_children() {
let wrong_count = "<linden_skeleton version=\"1\" num_bones=\"2\" num_collision_volumes=\"0\"><bone name=\"root\"/></linden_skeleton>";
assert!(matches!(
parse_skeleton_xml(wrong_count),
Err(crate::Error::Parse { .. })
));
let unknown = "<linden_skeleton version=\"1\" num_bones=\"1\" num_collision_volumes=\"0\"><bone name=\"root\"><unknown/></bone></linden_skeleton>";
assert!(matches!(
parse_skeleton_xml(unknown),
Err(crate::Error::Parse { .. })
));
}
}

View File

@@ -0,0 +1,996 @@
// @generated by libremetaverse-codegen; DO NOT EDIT.
// Regenerate: cargo run -p libremetaverse-codegen -- generate
// Generator: skeleton
// Source: codegen/inputs/avatar_skeleton.xml sha256=addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a license=BSD-3-Clause
#![allow(clippy::float_cmp, clippy::too_many_lines, clippy::unreadable_literal)]
pub(crate) fn default_skeleton() -> crate::skeleton::LindenSkeleton {
crate::skeleton::LindenSkeleton::from_parts(
crate::skeleton::Joint::from_parts(
crate::skeleton::JointBase::from_parts(
"mPelvis".to_owned(),
vec![0.0_f32, 0.0_f32, 1.067_f32],
vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32],
"Torso".to_owned(),
"base".to_owned(),
vec![0.0_f32, 0.0_f32, 0.084_f32],
true,
),
vec![
crate ::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("PELVIS".to_owned(), vec![- 0.01_f32,
0.0_f32,- 0.02_f32], vec![0.0_f32, 8.0_f32, 0.0_f32], vec![0.12_f32,
0.16_f32, 0.17_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.03_f32, 0.0_f32, 0.095_f32], true)), crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("BUTT".to_owned(), vec![- 0.06_f32,
0.0_f32,- 0.1_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![0.1_f32,
0.1_f32, 0.1_f32], "Collision".to_owned(), "base".to_owned(), vec![-
0.1_f32, 0.0_f32, 0.0_f32], true))
],
vec![
crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mSpine1".to_owned(), vec![0.0_f32,
0.0_f32, 0.084_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Spine".to_owned(), "extended".to_owned(),
vec![0.0_f32, 0.0_f32,- 0.084_f32], false), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mSpine2".to_owned(), vec![0.0_f32,
0.0_f32,- 0.084_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Spine".to_owned(), "extended".to_owned(),
vec![0.0_f32, 0.0_f32, 0.084_f32], false), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mTorso".to_owned(), vec![0.0_f32,
0.0_f32, 0.084_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Torso".to_owned(), "base".to_owned(), vec![-
0.015_f32, 0.0_f32, 0.205_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("BELLY".to_owned(), vec![0.028_f32,
0.0_f32, 0.04_f32], vec![0.0_f32, 8.0_f32, 0.0_f32], vec![0.09_f32,
0.13_f32, 0.15_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.028_f32, 0.0_f32, 0.094_f32], true)), crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("LEFT_HANDLE".to_owned(), vec![0.0_f32,
0.1_f32, 0.058_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![0.05_f32,
0.05_f32, 0.05_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.0_f32, 0.1_f32, 0.0_f32], true)), crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("RIGHT_HANDLE".to_owned(),
vec![0.0_f32,- 0.1_f32, 0.058_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![0.05_f32, 0.05_f32, 0.05_f32], "Collision".to_owned(), "base"
.to_owned(), vec![0.0_f32,- 0.1_f32, 0.0_f32], true)), crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("LOWER_BACK".to_owned(), vec![0.0_f32,
0.0_f32, 0.023_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![0.09_f32,
0.13_f32, 0.15_f32], "Collision".to_owned(), "base".to_owned(), vec![-
0.1_f32, 0.0_f32, 0.0_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mSpine3".to_owned(), vec![- 0.015_f32,
0.0_f32, 0.205_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Spine".to_owned(), "extended".to_owned(),
vec![0.015_f32, 0.0_f32,- 0.205_f32], false), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mSpine4".to_owned(), vec![0.015_f32,
0.0_f32,- 0.205_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Spine".to_owned(), "extended".to_owned(), vec![-
0.015_f32, 0.0_f32, 0.205_f32], false), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mChest".to_owned(), vec![- 0.015_f32,
0.0_f32, 0.205_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Torso".to_owned(), "base".to_owned(), vec![-
0.01_f32, 0.0_f32, 0.25_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("CHEST".to_owned(), vec![0.028_f32,
0.0_f32, 0.07_f32], vec![0.0_f32,- 10.0_f32, 0.0_f32], vec![0.11_f32,
0.15_f32, 0.2_f32], "Collision".to_owned(), "base".to_owned(), vec![-
0.096_f32, 0.0_f32, 0.152_f32], true)), crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("LEFT_PEC".to_owned(), vec![0.119_f32,
0.082_f32, 0.042_f32], vec![0.0_f32, 4.29_f32, 0.0_f32], vec![0.05_f32,
0.05_f32, 0.05_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.08_f32, 0.0_f32,- 0.006_f32], true)), crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("RIGHT_PEC".to_owned(),
vec![0.119_f32,- 0.082_f32, 0.042_f32], vec![0.0_f32, 4.29_f32, 0.0_f32],
vec![0.05_f32, 0.05_f32, 0.05_f32], "Collision".to_owned(), "base"
.to_owned(), vec![0.08_f32, 0.0_f32,- 0.006_f32], true)), crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("UPPER_BACK".to_owned(), vec![0.0_f32,
0.0_f32, 0.017_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![0.09_f32,
0.13_f32, 0.15_f32], "Collision".to_owned(), "base".to_owned(), vec![-
0.1_f32, 0.0_f32, 0.0_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mNeck".to_owned(), vec![- 0.01_f32,
0.0_f32, 0.251_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Torso".to_owned(), "base".to_owned(), vec![0.0_f32,
0.0_f32, 0.077_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("NECK".to_owned(), vec![0.0_f32,
0.0_f32, 0.02_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![0.05_f32,
0.06_f32, 0.08_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.0_f32, 0.0_f32, 0.08_f32], false))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHead".to_owned(), vec![0.0_f32,-
0.0_f32, 0.076_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Torso".to_owned(), "base".to_owned(), vec![0.0_f32,
0.0_f32, 0.079_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("HEAD".to_owned(), vec![0.02_f32,
0.0_f32, 0.07_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![0.11_f32,
0.09_f32, 0.12_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.0_f32, 0.0_f32, 0.1_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mSkull".to_owned(), vec![0.0_f32,
0.0_f32, 0.079_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Extra".to_owned(), "base".to_owned(), vec![0.0_f32,
0.0_f32, 0.033_f32], true), vec![], vec![], vec![0.0_f32, 0.0_f32,
0.079_f32], "figureHair avatar_mSkull".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mEyeRight".to_owned(),
vec![0.098_f32,- 0.036_f32, 0.079_f32], vec![0.0_f32, 0.0_f32,- 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Extra".to_owned(), "base".to_owned(),
vec![0.025_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.098466_f32,- 0.036_f32, 0.079_f32], "avatar_mEyeRight".to_owned(),
false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mEyeLeft".to_owned(), vec![0.098_f32,
0.036_f32, 0.079_f32], vec![0.0_f32,- 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Extra".to_owned(), "base".to_owned(), vec![0.025_f32,
0.0_f32, 0.0_f32], true), vec![], vec![], vec![0.098461_f32, 0.036_f32,
0.079_f32], "avatar_mEyeLeft".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceRoot".to_owned(), vec![0.025_f32,
0.0_f32, 0.045_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Face".to_owned(), "extended".to_owned(),
vec![0.02_f32, 0.0_f32, 0.0_f32], false), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyeAltRight".to_owned(),
vec![0.073_f32,- 0.036_f32, 0.034_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.025_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.073466_f32,- 0.036_f32, 0.03393_f32], "avatar_mFaceEyeAltRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyeAltLeft".to_owned(),
vec![0.073_f32, 0.036_f32, 0.034_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.025_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.073461_f32, 0.036_f32, 0.03393_f32], "avatar_mFaceEyeAltLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceForeheadLeft".to_owned(),
vec![0.061_f32, 0.035_f32, 0.083_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.024_f32, 0.004_f32, 0.018_f32], true), vec![],
vec![], vec![0.061_f32, 0.035_f32, 0.083_f32], "avatar_mFaceForeheadLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceForeheadRight".to_owned(),
vec![0.061_f32,- 0.035_f32, 0.083_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.024_f32,- 0.004_f32, 0.018_f32], true), vec![],
vec![], vec![0.061_f32,- 0.035_f32, 0.083_f32],
"avatar_mFaceForeheadRight".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyebrowOuterLeft".to_owned(),
vec![0.064_f32, 0.051_f32, 0.048_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Eyes".to_owned(), "extended"
.to_owned(), vec![0.023_f32, 0.013_f32, 0.0_f32], true), vec![], vec![],
vec![0.064_f32, 0.051_f32, 0.048_f32], "avatar_mFaceEyebrowOuterLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyebrowCenterLeft".to_owned(),
vec![0.07_f32, 0.043_f32, 0.056_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Eyes".to_owned(), "extended"
.to_owned(), vec![0.027_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.07_f32, 0.043_f32, 0.056_f32], "avatar_mFaceEyebrowCenterLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyebrowInnerLeft".to_owned(),
vec![0.075_f32, 0.022_f32, 0.051_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Eyes".to_owned(), "extended"
.to_owned(), vec![0.026_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.075_f32, 0.022_f32, 0.051_f32], "avatar_mFaceEyebrowInnerLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyebrowOuterRight".to_owned(),
vec![0.064_f32,- 0.051_f32, 0.048_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Eyes".to_owned(), "extended"
.to_owned(), vec![0.023_f32,- 0.013_f32, 0.0_f32], true), vec![], vec![],
vec![0.064_f32,- 0.051_f32, 0.048_f32], "avatar_mFaceEyebrowOuterRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyebrowCenterRight".to_owned(),
vec![0.07_f32,- 0.043_f32, 0.056_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Eyes".to_owned(), "extended"
.to_owned(), vec![0.027_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.07_f32,- 0.043_f32, 0.056_f32], "avatar_mFaceEyebrowCenterRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyebrowInnerRight".to_owned(),
vec![0.075_f32,- 0.022_f32, 0.051_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Eyes".to_owned(), "extended"
.to_owned(), vec![0.026_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.075_f32,- 0.022_f32, 0.051_f32], "avatar_mFaceEyebrowInnerRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyeLidUpperLeft".to_owned(),
vec![0.073_f32, 0.036_f32, 0.034_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Eyes".to_owned(), "extended"
.to_owned(), vec![0.027_f32, 0.0_f32, 0.005_f32], true), vec![], vec![],
vec![0.073_f32, 0.036_f32, 0.034_f32], "avatar_mFaceEyeLidUpperLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyeLidLowerLeft".to_owned(),
vec![0.073_f32, 0.036_f32, 0.034_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Eyes".to_owned(), "extended"
.to_owned(), vec![0.024_f32, 0.0_f32,- 0.007_f32], true), vec![], vec![],
vec![0.073_f32, 0.036_f32, 0.034_f32], "avatar_mFaceEyeLidLowerLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyeLidUpperRight".to_owned(),
vec![0.073_f32,- 0.036_f32, 0.034_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Eyes".to_owned(), "extended"
.to_owned(), vec![0.027_f32, 0.0_f32, 0.005_f32], true), vec![], vec![],
vec![0.073_f32,- 0.036_f32, 0.034_f32], "avatar_mFaceEyeLidUpperRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyeLidLowerRight".to_owned(),
vec![0.073_f32,- 0.036_f32, 0.034_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Eyes".to_owned(), "extended"
.to_owned(), vec![0.024_f32, 0.0_f32,- 0.007_f32], true), vec![], vec![],
vec![0.073_f32,- 0.036_f32, 0.034_f32], "avatar_mFaceEyeLidLowerRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEar1Left".to_owned(),
vec![0.0_f32, 0.08_f32, 0.002_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Ears".to_owned(), "extended"
.to_owned(), vec![- 0.019_f32, 0.018_f32, 0.025_f32], true), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEar2Left".to_owned(), vec![-
0.019_f32, 0.018_f32, 0.025_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Ears".to_owned(), "extended"
.to_owned(), vec![0.0_f32, 0.0_f32, 0.033_f32], true), vec![], vec![],
vec![- 0.019_f32, 0.018_f32, 0.025_f32], "avatar_mFaceEar2Left"
.to_owned(), true)], vec![0.0_f32, 0.08_f32, 0.002_f32],
"avatar_mFaceEar1Left".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEar1Right".to_owned(),
vec![0.0_f32,- 0.08_f32, 0.002_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Ears".to_owned(), "extended"
.to_owned(), vec![- 0.019_f32,- 0.018_f32, 0.025_f32], true), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEar2Right".to_owned(), vec![-
0.019_f32,- 0.018_f32, 0.025_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Ears".to_owned(), "extended"
.to_owned(), vec![0.0_f32, 0.0_f32, 0.033_f32], true), vec![], vec![],
vec![- 0.019_f32,- 0.018_f32, 0.025_f32], "avatar_mFaceEar2Right"
.to_owned(), true)], vec![0.0_f32,- 0.08_f32, 0.002_f32],
"avatar_mFaceEar1Right".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceNoseLeft".to_owned(),
vec![0.086_f32, 0.015_f32,- 0.004_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.015_f32, 0.004_f32, 0.0_f32], true), vec![], vec![],
vec![0.086_f32, 0.015_f32,- 0.004_f32], "avatar_mFaceNoseLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceNoseCenter".to_owned(),
vec![0.102_f32, 0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.025_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.102_f32, 0.0_f32, 0.0_f32], "avatar_mFaceNoseCenter".to_owned(),
false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceNoseRight".to_owned(),
vec![0.086_f32,- 0.015_f32,- 0.004_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.015_f32,- 0.004_f32, 0.0_f32], true), vec![], vec![],
vec![0.086_f32,- 0.015_f32,- 0.004_f32], "avatar_mFaceNoseRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceCheekLowerLeft".to_owned(),
vec![0.05_f32, 0.034_f32,- 0.031_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.013_f32, 0.03_f32, 0.0_f32], true), vec![], vec![],
vec![0.05_f32, 0.034_f32,- 0.031_f32], "avatar_mFaceCheekLowerLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceCheekUpperLeft".to_owned(),
vec![0.07_f32, 0.034_f32,- 0.005_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.022_f32, 0.015_f32, 0.0_f32], true), vec![], vec![],
vec![0.07_f32, 0.034_f32,- 0.005_f32], "avatar_mFaceCheekUpperLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceCheekLowerRight".to_owned(),
vec![0.05_f32,- 0.034_f32,- 0.031_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.013_f32,- 0.03_f32, 0.0_f32], true), vec![], vec![],
vec![0.05_f32,- 0.034_f32,- 0.031_f32], "avatar_mFaceCheekLowerRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceCheekUpperRight".to_owned(),
vec![0.07_f32,- 0.034_f32,- 0.005_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.022_f32,- 0.015_f32, 0.0_f32], true), vec![], vec![],
vec![0.07_f32,- 0.034_f32,- 0.005_f32], "avatar_mFaceCheekUpperRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceJaw".to_owned(), vec![-
0.001_f32, 0.0_f32,- 0.015_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Mouth".to_owned(), "extended"
.to_owned(), vec![0.059_f32, 0.0_f32,- 0.039_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceChin".to_owned(), vec![0.074_f32,
0.0_f32,- 0.054_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Mouth".to_owned(), "extended".to_owned(),
vec![0.021_f32, 0.0_f32,- 0.018_f32], true), vec![], vec![],
vec![0.074_f32, 0.0_f32,- 0.054_f32], "avatar_mFaceChin".to_owned(),
false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceTeethLower".to_owned(),
vec![0.021_f32, 0.0_f32,- 0.039_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Mouth".to_owned(), "extended"
.to_owned(), vec![0.035_f32, 0.0_f32, 0.0_f32], true), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceLipLowerLeft".to_owned(),
vec![0.045_f32, 0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Lips".to_owned(), "extended"
.to_owned(), vec![0.034_f32, 0.017_f32, 0.005_f32], true), vec![],
vec![], vec![0.045_f32, 0.0_f32, 0.0_f32], "avatar_mFaceLipLowerLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceLipLowerRight".to_owned(),
vec![0.045_f32, 0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Lips".to_owned(), "extended"
.to_owned(), vec![0.034_f32,- 0.017_f32, 0.005_f32], true), vec![],
vec![], vec![0.045_f32, 0.0_f32, 0.0_f32], "avatar_mFaceLipLowerRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceLipLowerCenter".to_owned(),
vec![0.045_f32, 0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Lips".to_owned(), "extended"
.to_owned(), vec![0.04_f32, 0.0_f32, 0.002_f32], true), vec![], vec![],
vec![0.045_f32, 0.0_f32, 0.0_f32], "avatar_mFaceLipLowerCenter"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceTongueBase".to_owned(),
vec![0.039_f32, 0.0_f32, 0.005_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Mouth".to_owned(), "extended"
.to_owned(), vec![0.022_f32, 0.0_f32, 0.007_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceTongueTip".to_owned(),
vec![0.022_f32, 0.0_f32, 0.007_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Mouth".to_owned(), "extended"
.to_owned(), vec![0.01_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.022_f32, 0.0_f32, 0.007_f32], "avatar_mFaceTongueTip".to_owned(),
true)], vec![0.039_f32, 0.0_f32, 0.005_f32], "avatar_mFaceTongueBase"
.to_owned(), false)], vec![0.021_f32, 0.0_f32,- 0.039_f32],
"avatar_mFaceTeethLower".to_owned(), false)], vec![- 0.001_f32, 0.0_f32,-
0.015_f32], "avatar_mFaceJaw".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceJawShaper".to_owned(),
vec![0.0_f32, 0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![- 0.017_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.0_f32, 0.0_f32, 0.0_f32], "avatar_mFaceJawShaper".to_owned(),
false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceForeheadCenter".to_owned(),
vec![0.069_f32, 0.0_f32, 0.065_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.036_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.069_f32, 0.0_f32, 0.065_f32], "avatar_mFaceForeheadCenter"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceNoseBase".to_owned(),
vec![0.094_f32, 0.0_f32,- 0.016_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Nose".to_owned(), "extended"
.to_owned(), vec![0.014_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.094_f32, 0.0_f32,- 0.016_f32], "avatar_mFaceNoseBase".to_owned(),
false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceTeethUpper".to_owned(),
vec![0.02_f32, 0.0_f32,- 0.03_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Mouth".to_owned(), "extended"
.to_owned(), vec![0.035_f32, 0.0_f32, 0.0_f32], true), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceLipUpperLeft".to_owned(),
vec![0.045_f32, 0.0_f32,- 0.003_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Lips".to_owned(), "extended"
.to_owned(), vec![0.041_f32, 0.015_f32, 0.0_f32], true), vec![], vec![],
vec![0.045_f32, 0.0_f32,- 0.003_f32], "avatar_mFaceLipUpperLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceLipUpperRight".to_owned(),
vec![0.045_f32, 0.0_f32,- 0.003_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Lips".to_owned(), "extended"
.to_owned(), vec![0.041_f32,- 0.015_f32, 0.0_f32], true), vec![], vec![],
vec![0.045_f32, 0.0_f32,- 0.003_f32], "avatar_mFaceLipUpperRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceLipCornerLeft".to_owned(),
vec![0.028_f32,- 0.019_f32,- 0.01_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Lips".to_owned(), "extended"
.to_owned(), vec![0.045_f32, 0.051_f32, 0.0_f32], true), vec![], vec![],
vec![0.028_f32,- 0.019_f32,- 0.01_f32], "avatar_mFaceLipCornerLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceLipCornerRight".to_owned(),
vec![0.028_f32, 0.019_f32,- 0.01_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Lips".to_owned(), "extended"
.to_owned(), vec![0.045_f32,- 0.051_f32, 0.0_f32], true), vec![], vec![],
vec![0.028_f32, 0.019_f32,- 0.01_f32], "avatar_mFaceLipCornerRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceLipUpperCenter".to_owned(),
vec![0.045_f32, 0.0_f32,- 0.003_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Lips".to_owned(), "extended"
.to_owned(), vec![0.043_f32, 0.0_f32, 0.002_f32], true), vec![], vec![],
vec![0.045_f32, 0.0_f32,- 0.003_f32], "avatar_mFaceLipUpperCenter"
.to_owned(), false)], vec![0.02_f32, 0.0_f32,- 0.03_f32],
"avatar_mFaceTeethUpper".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyecornerInnerLeft".to_owned(),
vec![0.075_f32, 0.017_f32, 0.032_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.016_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.075_f32, 0.017_f32, 0.032_f32], "avatar_mFaceEyecornerInnerLeft"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceEyecornerInnerRight".to_owned(),
vec![0.075_f32,- 0.017_f32, 0.032_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Face".to_owned(), "extended"
.to_owned(), vec![0.016_f32, 0.0_f32, 0.0_f32], true), vec![], vec![],
vec![0.075_f32,- 0.017_f32, 0.032_f32], "avatar_mFaceEyecornerInnerRight"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFaceNoseBridge".to_owned(),
vec![0.091_f32, 0.0_f32, 0.02_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Nose".to_owned(), "extended"
.to_owned(), vec![0.015_f32, 0.0_f32, 0.008_f32], true), vec![], vec![],
vec![0.091_f32, 0.0_f32, 0.02_f32], "avatar_mFaceNoseBridge".to_owned(),
false)], vec![0.025_f32, 0.0_f32, 0.045_f32], "avatar_mFaceRoot"
.to_owned(), false)], vec![0.0_f32,- 0.0_f32, 0.07563_f32],
"head avatar_mHead".to_owned(), true)], vec![- 0.009507_f32, 0.0_f32,
0.251108_f32], "neck avatar_mNeck".to_owned(), true), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mCollarLeft".to_owned(), vec![-
0.021_f32, 0.085_f32, 0.165_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Arms".to_owned(), "base".to_owned(),
vec![0.0_f32, 0.079_f32, 0.0_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("L_CLAVICLE".to_owned(), vec![0.02_f32,
0.0_f32, 0.02_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![0.07_f32,
0.14_f32, 0.05_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.0_f32, 0.1_f32, 0.0_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mShoulderLeft".to_owned(),
vec![0.0_f32, 0.079_f32,- 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Arms".to_owned(), "base".to_owned(),
vec![0.0_f32, 0.247_f32, 0.0_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("L_UPPER_ARM".to_owned(), vec![0.0_f32,
0.12_f32, 0.01_f32], vec![- 5.0_f32, 0.0_f32, 0.0_f32], vec![0.05_f32,
0.17_f32, 0.05_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.0_f32, 0.13_f32,- 0.003_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mElbowLeft".to_owned(), vec![0.0_f32,
0.248_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Arms".to_owned(), "base".to_owned(), vec![0.0_f32,
0.205_f32, 0.0_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("L_LOWER_ARM".to_owned(), vec![0.0_f32,
0.1_f32, 0.0_f32], vec![- 3.0_f32, 0.0_f32, 0.0_f32], vec![0.04_f32,
0.14_f32, 0.04_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.0_f32, 0.1_f32,- 0.001_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWristLeft".to_owned(), vec![-
0.0_f32, 0.205_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Arms".to_owned(), "base".to_owned(),
vec![0.0_f32, 0.06_f32, 0.0_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("L_HAND".to_owned(), vec![0.01_f32,
0.05_f32, 0.0_f32], vec![- 3.0_f32, 0.0_f32,- 10.0_f32], vec![0.05_f32,
0.08_f32, 0.03_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.005_f32, 0.049_f32,- 0.001_f32], false))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandMiddle1Left".to_owned(),
vec![0.013_f32, 0.101_f32, 0.015_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.001_f32, 0.04_f32,- 0.006_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandMiddle2Left".to_owned(), vec![-
0.001_f32, 0.04_f32,- 0.006_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.001_f32, 0.049_f32,- 0.008_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandMiddle3Left".to_owned(), vec![-
0.001_f32, 0.049_f32,- 0.008_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.002_f32, 0.033_f32,- 0.006_f32], false), vec![],
vec![], vec![- 0.001_f32, 0.049_f32,- 0.008_f32],
"avatar_mHandMiddle3Left".to_owned(), true)], vec![- 0.001_f32,
0.04_f32,- 0.006_f32], "avatar_mHandMiddle2Left".to_owned(), true)],
vec![0.013_f32, 0.101_f32, 0.015_f32], "avatar_mHandMiddle1Left"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandIndex1Left".to_owned(),
vec![0.038_f32, 0.097_f32, 0.015_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.017_f32, 0.036_f32,- 0.006_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandIndex2Left".to_owned(),
vec![0.017_f32, 0.036_f32,- 0.006_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.014_f32, 0.032_f32,- 0.006_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandIndex3Left".to_owned(),
vec![0.014_f32, 0.032_f32,- 0.006_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.011_f32, 0.025_f32,- 0.004_f32], false), vec![],
vec![], vec![0.014_f32, 0.032_f32,- 0.006_f32], "avatar_mHandIndex3Left"
.to_owned(), true)], vec![0.017_f32, 0.036_f32,- 0.006_f32],
"avatar_mHandIndex2Left".to_owned(), true)], vec![0.038_f32, 0.097_f32,
0.015_f32], "avatar_mHandIndex1Left".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandRing1Left".to_owned(), vec![-
0.01_f32, 0.099_f32, 0.009_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.013_f32, 0.038_f32,- 0.008_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandRing2Left".to_owned(), vec![-
0.013_f32, 0.038_f32,- 0.008_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.013_f32, 0.04_f32,- 0.009_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandRing3Left".to_owned(), vec![-
0.013_f32, 0.04_f32,- 0.009_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.01_f32, 0.028_f32,- 0.006_f32], false), vec![],
vec![], vec![- 0.013_f32, 0.04_f32,- 0.009_f32], "avatar_mHandRing3Left"
.to_owned(), true)], vec![- 0.013_f32, 0.038_f32,- 0.008_f32],
"avatar_mHandRing2Left".to_owned(), true)], vec![- 0.01_f32, 0.099_f32,
0.009_f32], "avatar_mHandRing1Left".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandPinky1Left".to_owned(), vec![-
0.031_f32, 0.095_f32, 0.003_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.024_f32, 0.025_f32,- 0.006_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandPinky2Left".to_owned(), vec![-
0.024_f32, 0.025_f32,- 0.006_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.015_f32, 0.018_f32,- 0.004_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandPinky3Left".to_owned(), vec![-
0.015_f32, 0.018_f32,- 0.004_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.013_f32, 0.016_f32,- 0.004_f32], false), vec![],
vec![], vec![- 0.015_f32, 0.018_f32,- 0.004_f32],
"avatar_mHandPinky3Left".to_owned(), true)], vec![- 0.024_f32,
0.025_f32,- 0.006_f32], "avatar_mHandPinky2Left".to_owned(), true)],
vec![- 0.031_f32, 0.095_f32, 0.003_f32], "avatar_mHandPinky1Left"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandThumb1Left".to_owned(),
vec![0.031_f32, 0.026_f32, 0.004_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.028_f32, 0.032_f32, 0.0_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandThumb2Left".to_owned(),
vec![0.028_f32, 0.032_f32,- 0.001_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.023_f32, 0.031_f32, 0.0_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandThumb3Left".to_owned(),
vec![0.023_f32, 0.031_f32,- 0.001_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.015_f32, 0.025_f32, 0.0_f32], false), vec![], vec![],
vec![0.023_f32, 0.031_f32,- 0.001_f32], "avatar_mHandThumb3Left"
.to_owned(), true)], vec![0.028_f32, 0.032_f32,- 0.001_f32],
"avatar_mHandThumb2Left".to_owned(), true)], vec![0.031_f32, 0.026_f32,
0.004_f32], "avatar_mHandThumb1Left".to_owned(), false)], vec![- 0.0_f32,
0.204846_f32, 0.0_f32], "lHand avatar_mWristLeft".to_owned(), true)],
vec![0.0_f32, 0.248_f32, 0.0_f32], "lForeArm avatar_mElbowLeft"
.to_owned(), true)], vec![0.0_f32, 0.079_f32,- 0.0_f32],
"lShldr avatar_mShoulderLeft".to_owned(), true)], vec![- 0.020927_f32,
0.084665_f32, 0.165396_f32], "lCollar avatar_mCollarLeft".to_owned(),
false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mCollarRight".to_owned(), vec![-
0.021_f32,- 0.085_f32, 0.165_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Arms".to_owned(), "base".to_owned(),
vec![0.0_f32,- 0.079_f32, 0.0_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("R_CLAVICLE".to_owned(), vec![0.02_f32,
0.0_f32, 0.02_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![0.07_f32,
0.14_f32, 0.05_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.0_f32,- 0.1_f32, 0.0_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mShoulderRight".to_owned(),
vec![0.0_f32,- 0.079_f32,- 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Arms".to_owned(), "base".to_owned(),
vec![0.0_f32,- 0.247_f32, 0.0_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("R_UPPER_ARM".to_owned(),
vec![0.0_f32,- 0.12_f32, 0.01_f32], vec![5.0_f32, 0.0_f32, 0.0_f32],
vec![0.05_f32, 0.17_f32, 0.05_f32], "Collision".to_owned(), "base"
.to_owned(), vec![0.0_f32,- 0.13_f32,- 0.003_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mElbowRight".to_owned(),
vec![0.0_f32,- 0.248_f32,- 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Arms".to_owned(), "base".to_owned(),
vec![0.0_f32,- 0.205_f32, 0.0_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("R_LOWER_ARM".to_owned(),
vec![0.0_f32,- 0.1_f32, 0.0_f32], vec![3.0_f32, 0.0_f32, 0.0_f32],
vec![0.04_f32, 0.14_f32, 0.04_f32], "Collision".to_owned(), "base"
.to_owned(), vec![0.0_f32,- 0.1_f32,- 0.001_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWristRight".to_owned(),
vec![0.0_f32,- 0.205_f32,- 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Arms".to_owned(), "base".to_owned(),
vec![0.0_f32,- 0.06_f32, 0.0_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("R_HAND".to_owned(), vec![0.01_f32,-
0.05_f32, 0.0_f32], vec![3.0_f32, 0.0_f32, 10.0_f32], vec![0.05_f32,
0.08_f32, 0.03_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.005_f32,- 0.049_f32,- 0.001_f32], false))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandMiddle1Right".to_owned(),
vec![0.013_f32,- 0.101_f32, 0.015_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.001_f32,- 0.04_f32,- 0.006_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandMiddle2Right".to_owned(), vec![-
0.001_f32,- 0.04_f32,- 0.006_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.001_f32,- 0.049_f32,- 0.008_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandMiddle3Right".to_owned(), vec![-
0.001_f32,- 0.049_f32,- 0.008_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.002_f32,- 0.033_f32,- 0.006_f32], false), vec![],
vec![], vec![- 0.001_f32,- 0.049_f32,- 0.008_f32],
"avatar_mHandMiddle3Right".to_owned(), true)], vec![- 0.001_f32,-
0.04_f32,- 0.006_f32], "avatar_mHandMiddle2Right".to_owned(), true)],
vec![0.013_f32,- 0.101_f32, 0.015_f32], "avatar_mHandMiddle1Right"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandIndex1Right".to_owned(),
vec![0.038_f32,- 0.097_f32, 0.015_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.017_f32,- 0.036_f32,- 0.006_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandIndex2Right".to_owned(),
vec![0.017_f32,- 0.036_f32,- 0.006_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.014_f32,- 0.032_f32,- 0.006_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandIndex3Right".to_owned(),
vec![0.014_f32,- 0.032_f32,- 0.006_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.011_f32,- 0.025_f32,- 0.004_f32], false), vec![],
vec![], vec![0.014_f32,- 0.032_f32,- 0.006_f32],
"avatar_mHandIndex3Right".to_owned(), true)], vec![0.017_f32,-
0.036_f32,- 0.006_f32], "avatar_mHandIndex2Right".to_owned(), true)],
vec![0.038_f32,- 0.097_f32, 0.015_f32], "avatar_mHandIndex1Right"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandRing1Right".to_owned(), vec![-
0.01_f32,- 0.099_f32, 0.009_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.013_f32,- 0.038_f32,- 0.008_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandRing2Right".to_owned(), vec![-
0.013_f32,- 0.038_f32,- 0.008_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.013_f32,- 0.04_f32,- 0.009_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandRing3Right".to_owned(), vec![-
0.013_f32,- 0.04_f32,- 0.009_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.01_f32,- 0.028_f32,- 0.006_f32], false), vec![],
vec![], vec![- 0.013_f32,- 0.04_f32,- 0.009_f32],
"avatar_mHandRing3Right".to_owned(), true)], vec![- 0.013_f32,-
0.038_f32,- 0.008_f32], "avatar_mHandRing2Right".to_owned(), true)],
vec![- 0.01_f32,- 0.099_f32, 0.009_f32], "avatar_mHandRing1Right"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandPinky1Right".to_owned(), vec![-
0.031_f32,- 0.095_f32, 0.003_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.024_f32,- 0.025_f32,- 0.006_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandPinky2Right".to_owned(), vec![-
0.024_f32,- 0.025_f32,- 0.006_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.015_f32,- 0.018_f32,- 0.004_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandPinky3Right".to_owned(), vec![-
0.015_f32,- 0.018_f32,- 0.004_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![- 0.013_f32,- 0.016_f32,- 0.004_f32], false), vec![],
vec![], vec![- 0.015_f32,- 0.018_f32,- 0.004_f32],
"avatar_mHandPinky3Right".to_owned(), true)], vec![- 0.024_f32,-
0.025_f32,- 0.006_f32], "avatar_mHandPinky2Right".to_owned(), true)],
vec![- 0.031_f32,- 0.095_f32, 0.003_f32], "avatar_mHandPinky1Right"
.to_owned(), false), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandThumb1Right".to_owned(),
vec![0.031_f32,- 0.026_f32, 0.004_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.028_f32,- 0.032_f32, 0.0_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandThumb2Right".to_owned(),
vec![0.028_f32,- 0.032_f32,- 0.001_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.023_f32,- 0.031_f32, 0.0_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHandThumb3Right".to_owned(),
vec![0.023_f32,- 0.031_f32,- 0.001_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Hand".to_owned(), "extended"
.to_owned(), vec![0.015_f32,- 0.025_f32, 0.0_f32], false), vec![],
vec![], vec![0.023_f32,- 0.031_f32,- 0.001_f32],
"avatar_mHandThumb3Right".to_owned(), true)], vec![0.028_f32,-
0.032_f32,- 0.001_f32], "avatar_mHandThumb2Right".to_owned(), true)],
vec![0.031_f32,- 0.026_f32, 0.004_f32], "avatar_mHandThumb1Right"
.to_owned(), false)], vec![- 0.0_f32,- 0.205_f32,- 0.0_f32],
"rHand avatar_mWristRight".to_owned(), true)], vec![0.0_f32,- 0.248_f32,-
0.0_f32], "rForeArm avatar_mElbowRight".to_owned(), true)],
vec![0.0_f32,- 0.079418_f32,- 0.0_f32], "rShldr avatar_mShoulderRight"
.to_owned(), true)], vec![- 0.020927_f32,- 0.085_f32, 0.165396_f32],
"rCollar avatar_mCollarRight".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWingsRoot".to_owned(), vec![-
0.014_f32, 0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.061_f32, 0.0_f32, 0.0_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWing1Left".to_owned(), vec![-
0.099_f32, 0.105_f32, 0.181_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.168_f32, 0.169_f32, 0.067_f32], true), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWing2Left".to_owned(), vec![-
0.168_f32, 0.169_f32, 0.067_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.181_f32, 0.183_f32, 0.0_f32], true), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWing3Left".to_owned(), vec![-
0.181_f32, 0.183_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.171_f32, 0.173_f32, 0.0_f32], true), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWing4Left".to_owned(), vec![-
0.171_f32, 0.173_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.146_f32, 0.132_f32, 0.0_f32], true), vec![],
vec![], vec![- 0.171_f32, 0.173_f32, 0.0_f32], "avatar_mWing4Left"
.to_owned(), true), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWing4FanLeft".to_owned(), vec![-
0.171_f32, 0.173_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.068_f32, 0.062_f32,- 0.159_f32], true), vec![],
vec![], vec![- 0.171_f32, 0.173_f32, 0.0_f32], "avatar_mWing4FanLeft"
.to_owned(), true)], vec![- 0.181_f32, 0.183_f32, 0.0_f32],
"avatar_mWing3Left".to_owned(), true)], vec![- 0.168_f32, 0.169_f32,
0.067_f32], "avatar_mWing2Left".to_owned(), true)], vec![- 0.099_f32,
0.105_f32, 0.181_f32], "avatar_mWing1Left".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWing1Right".to_owned(), vec![-
0.099_f32,- 0.105_f32, 0.181_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.168_f32,- 0.169_f32, 0.067_f32], true), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWing2Right".to_owned(), vec![-
0.168_f32,- 0.169_f32, 0.067_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.181_f32,- 0.183_f32, 0.0_f32], true), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWing3Right".to_owned(), vec![-
0.181_f32,- 0.183_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.171_f32,- 0.173_f32, 0.0_f32], true), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWing4Right".to_owned(), vec![-
0.171_f32,- 0.173_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.146_f32,- 0.132_f32, 0.0_f32], true), vec![],
vec![], vec![- 0.171_f32,- 0.173_f32, 0.0_f32], "avatar_mWing4Right"
.to_owned(), true), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mWing4FanRight".to_owned(), vec![-
0.171_f32,- 0.173_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Wing".to_owned(), "extended"
.to_owned(), vec![- 0.068_f32,- 0.062_f32,- 0.159_f32], true), vec![],
vec![], vec![- 0.171_f32,- 0.173_f32, 0.0_f32], "avatar_mWing4FanRight"
.to_owned(), true)], vec![- 0.181_f32,- 0.183_f32, 0.0_f32],
"avatar_mWing3Right".to_owned(), true)], vec![- 0.168_f32,- 0.169_f32,
0.067_f32], "avatar_mWing2Right".to_owned(), true)], vec![- 0.099_f32,-
0.105_f32, 0.181_f32], "avatar_mWing1Right".to_owned(), false)], vec![-
0.014_f32, 0.0_f32, 0.0_f32], "avatar_mWingsRoot".to_owned(), false)],
vec![- 0.015368_f32, 0.0_f32, 0.204877_f32], "chest avatar_mChest"
.to_owned(), true)], vec![0.015368_f32, 0.0_f32,- 0.204877_f32],
"avatar_mSpine4".to_owned(), true)], vec![- 0.015368_f32, 0.0_f32,
0.204877_f32], "avatar_mSpine3".to_owned(), true)], vec![0.0_f32,
0.0_f32, 0.084073_f32], "abdomen avatar_mTorso".to_owned(), true)],
vec![0.0_f32, 0.0_f32,- 0.084073_f32], "avatar_mSpine2".to_owned(),
true)], vec![0.0_f32, 0.0_f32, 0.084073_f32], "avatar_mSpine1"
.to_owned(), true), crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHipRight".to_owned(),
vec![0.034_f32,- 0.129_f32,- 0.041_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Legs".to_owned(), "base".to_owned(),
vec![- 0.001_f32, 0.049_f32,- 0.491_f32], true), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("R_UPPER_LEG".to_owned(), vec![-
0.02_f32, 0.05_f32,- 0.22_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![0.09_f32, 0.09_f32, 0.32_f32], "Collision".to_owned(), "base"
.to_owned(), vec![0.0_f32, 0.0_f32,- 0.2_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mKneeRight".to_owned(), vec![-
0.001_f32, 0.049_f32,- 0.491_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Legs".to_owned(), "base".to_owned(),
vec![- 0.029_f32, 0.0_f32,- 0.469_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("R_LOWER_LEG".to_owned(), vec![-
0.02_f32, 0.0_f32,- 0.2_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![0.06_f32, 0.06_f32, 0.25_f32], "Collision".to_owned(), "base"
.to_owned(), vec![- 0.01_f32, 0.0_f32,- 0.15_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mAnkleRight".to_owned(), vec![-
0.029_f32, 0.0_f32,- 0.468_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Legs".to_owned(), "base".to_owned(),
vec![0.112_f32, 0.0_f32,- 0.061_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("R_FOOT".to_owned(), vec![0.077_f32,
0.0_f32,- 0.041_f32], vec![0.0_f32, 10.0_f32, 0.0_f32], vec![0.13_f32,
0.05_f32, 0.05_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.089_f32, 0.0_f32,- 0.026_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFootRight".to_owned(),
vec![0.112_f32,- 0.0_f32,- 0.061_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Extra".to_owned(), "base".to_owned(),
vec![0.105_f32,- 0.01_f32, 0.0_f32], true), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mToeRight".to_owned(), vec![0.109_f32,
0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Extra".to_owned(), "base".to_owned(), vec![0.02_f32,
0.0_f32, 0.0_f32], false), vec![], vec![], vec![0.105399_f32,-
0.010408_f32,- 0.000104_f32], "avatar_mToeRight".to_owned(), false)],
vec![0.111956_f32,- 0.0_f32,- 0.060637_f32], "avatar_mFootRight"
.to_owned(), true)], vec![- 0.028869_f32, 0.0_f32,- 0.468494_f32],
"rFoot avatar_mAnkleRight".to_owned(), true)], vec![- 0.00078_f32,
0.048635_f32,- 0.490922_f32], "rShin avatar_mKneeRight".to_owned(),
true)], vec![0.03362_f32,- 0.128806_f32,- 0.041086_f32],
"rThigh avatar_mHipRight".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHipLeft".to_owned(), vec![0.034_f32,
0.127_f32,- 0.041_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Legs".to_owned(), "base".to_owned(), vec![-
0.001_f32,- 0.046_f32,- 0.491_f32], true), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("L_UPPER_LEG".to_owned(), vec![-
0.02_f32,- 0.05_f32,- 0.22_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![0.09_f32, 0.09_f32, 0.32_f32], "Collision".to_owned(), "base"
.to_owned(), vec![0.0_f32, 0.0_f32,- 0.2_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mKneeLeft".to_owned(), vec![-
0.001_f32,- 0.046_f32,- 0.491_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Legs".to_owned(), "base".to_owned(),
vec![- 0.029_f32, 0.001_f32,- 0.469_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("L_LOWER_LEG".to_owned(), vec![-
0.02_f32, 0.0_f32,- 0.2_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![0.06_f32, 0.06_f32, 0.25_f32], "Collision".to_owned(), "base"
.to_owned(), vec![- 0.01_f32, 0.0_f32,- 0.15_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mAnkleLeft".to_owned(), vec![-
0.029_f32, 0.001_f32,- 0.468_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Legs".to_owned(), "base".to_owned(),
vec![0.112_f32, 0.0_f32,- 0.061_f32], false), vec![crate
::skeleton::CollisionVolume::from_base(crate
::skeleton::JointBase::from_parts("L_FOOT".to_owned(), vec![0.077_f32,
0.0_f32,- 0.041_f32], vec![0.0_f32, 10.0_f32, 0.0_f32], vec![0.13_f32,
0.05_f32, 0.05_f32], "Collision".to_owned(), "base".to_owned(),
vec![0.089_f32, 0.0_f32,- 0.026_f32], true))], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mFootLeft".to_owned(),
vec![0.112_f32,- 0.0_f32,- 0.061_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Extra".to_owned(), "base".to_owned(),
vec![0.105_f32, 0.008_f32, 0.001_f32], true), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mToeLeft".to_owned(), vec![0.109_f32,
0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Extra".to_owned(), "base".to_owned(), vec![0.02_f32,
0.0_f32, 0.0_f32], false), vec![], vec![], vec![0.105387_f32,
0.00827_f32, 0.000871_f32], "avatar_mToeLeft".to_owned(), false)],
vec![0.111956_f32,- 0.0_f32,- 0.06062_f32], "avatar_mFootLeft"
.to_owned(), true)], vec![- 0.028887_f32, 0.001378_f32,- 0.468449_f32],
"lFoot avatar_mAnkleLeft".to_owned(), true)], vec![- 0.000887_f32,-
0.045568_f32,- 0.491053_f32], "lShin avatar_mKneeLeft".to_owned(),
true)], vec![0.033757_f32, 0.126765_f32,- 0.040998_f32],
"lThigh avatar_mHipLeft".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mTail1".to_owned(), vec![- 0.116_f32,
0.0_f32, 0.047_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Tail".to_owned(), "extended".to_owned(), vec![-
0.197_f32, 0.0_f32, 0.0_f32], true), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mTail2".to_owned(), vec![- 0.197_f32,
0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Tail".to_owned(), "extended".to_owned(), vec![-
0.168_f32, 0.0_f32, 0.0_f32], true), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mTail3".to_owned(), vec![- 0.168_f32,
0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Tail".to_owned(), "extended".to_owned(), vec![-
0.142_f32, 0.0_f32, 0.0_f32], true), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mTail4".to_owned(), vec![- 0.142_f32,
0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Tail".to_owned(), "extended".to_owned(), vec![-
0.112_f32, 0.0_f32, 0.0_f32], true), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mTail5".to_owned(), vec![- 0.112_f32,
0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Tail".to_owned(), "extended".to_owned(), vec![-
0.094_f32, 0.0_f32, 0.0_f32], true), vec![], vec![crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mTail6".to_owned(), vec![- 0.094_f32,
0.0_f32, 0.0_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Tail".to_owned(), "extended".to_owned(), vec![-
0.089_f32, 0.0_f32, 0.0_f32], true), vec![], vec![], vec![- 0.094_f32,
0.0_f32, 0.0_f32], "avatar_mTail6".to_owned(), true)], vec![- 0.112_f32,
0.0_f32, 0.0_f32], "avatar_mTail5".to_owned(), true)], vec![- 0.142_f32,
0.0_f32, 0.0_f32], "avatar_mTail4".to_owned(), true)], vec![- 0.168_f32,
0.0_f32, 0.0_f32], "avatar_mTail3".to_owned(), true)], vec![- 0.197_f32,
0.0_f32, 0.0_f32], "avatar_mTail2".to_owned(), true)], vec![- 0.116_f32,
0.0_f32, 0.047_f32], "avatar_mTail1".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mGroin".to_owned(), vec![0.064_f32,
0.0_f32,- 0.097_f32], vec![0.0_f32, 0.0_f32, 0.0_f32], vec![1.0_f32,
1.0_f32, 1.0_f32], "Groin".to_owned(), "extended".to_owned(),
vec![0.004_f32, 0.0_f32,- 0.066_f32], false), vec![], vec![],
vec![0.064_f32, 0.0_f32,- 0.097_f32], "avatar_mGroin".to_owned(), false),
crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHindLimbsRoot".to_owned(), vec![-
0.2_f32, 0.0_f32, 0.084_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Limb".to_owned(), "extended"
.to_owned(), vec![- 0.204_f32, 0.0_f32, 0.0_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHindLimb1Left".to_owned(), vec![-
0.204_f32, 0.129_f32,- 0.125_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Limb".to_owned(), "extended"
.to_owned(), vec![0.002_f32,- 0.046_f32,- 0.491_f32], true), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHindLimb2Left".to_owned(),
vec![0.002_f32,- 0.046_f32,- 0.491_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Limb".to_owned(), "extended"
.to_owned(), vec![- 0.03_f32,- 0.003_f32,- 0.468_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHindLimb3Left".to_owned(), vec![-
0.03_f32,- 0.003_f32,- 0.468_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Limb".to_owned(), "extended"
.to_owned(), vec![0.112_f32, 0.0_f32,- 0.061_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHindLimb4Left".to_owned(),
vec![0.112_f32, 0.0_f32,- 0.061_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Limb".to_owned(), "extended"
.to_owned(), vec![0.105_f32, 0.008_f32, 0.0_f32], true), vec![], vec![],
vec![0.112_f32, 0.0_f32,- 0.061_f32], "avatar_mHindLimb4Left".to_owned(),
true)], vec![- 0.03_f32,- 0.003_f32,- 0.468_f32], "avatar_mHindLimb3Left"
.to_owned(), true)], vec![0.002_f32,- 0.046_f32,- 0.491_f32],
"avatar_mHindLimb2Left".to_owned(), true)], vec![- 0.204_f32, 0.129_f32,-
0.125_f32], "avatar_mHindLimb1Left".to_owned(), false), crate
::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHindLimb1Right".to_owned(), vec![-
0.204_f32,- 0.129_f32,- 0.125_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Limb".to_owned(), "extended"
.to_owned(), vec![0.002_f32, 0.046_f32,- 0.491_f32], true), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHindLimb2Right".to_owned(),
vec![0.002_f32, 0.046_f32,- 0.491_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Limb".to_owned(), "extended"
.to_owned(), vec![- 0.03_f32, 0.003_f32,- 0.468_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHindLimb3Right".to_owned(), vec![-
0.03_f32, 0.003_f32,- 0.468_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Limb".to_owned(), "extended"
.to_owned(), vec![0.112_f32, 0.0_f32,- 0.061_f32], false), vec![],
vec![crate ::skeleton::Joint::from_parts(crate
::skeleton::JointBase::from_parts("mHindLimb4Right".to_owned(),
vec![0.112_f32, 0.0_f32,- 0.061_f32], vec![0.0_f32, 0.0_f32, 0.0_f32],
vec![1.0_f32, 1.0_f32, 1.0_f32], "Limb".to_owned(), "extended"
.to_owned(), vec![0.105_f32,- 0.008_f32, 0.0_f32], true), vec![], vec![],
vec![0.112_f32, 0.0_f32,- 0.061_f32], "avatar_mHindLimb4Right"
.to_owned(), true)], vec![- 0.03_f32, 0.003_f32,- 0.468_f32],
"avatar_mHindLimb3Right".to_owned(), true)], vec![0.002_f32, 0.046_f32,-
0.491_f32], "avatar_mHindLimb2Right".to_owned(), true)], vec![-
0.204_f32,- 0.129_f32,- 0.125_f32], "avatar_mHindLimb1Right".to_owned(),
false)], vec![- 0.2_f32, 0.0_f32, 0.084_f32], "avatar_mHindLimbsRoot"
.to_owned(), false)
],
vec![0.0_f32, 0.0_f32, 1.067015_f32],
"hip avatar_mPelvis".to_owned(),
false,
),
2.0_f32,
false,
"133".to_owned(),
"26".to_owned(),
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn generated_default_shape() {
let skeleton = default_skeleton();
assert_eq!(skeleton.version(), 2.0);
assert_eq!(skeleton.num_bones(), "133");
assert_eq!(skeleton.num_collision_volumes(), "26");
assert_eq!(skeleton.bone().base.name(), "mPelvis");
}
}