Effigy/Rig/CitizenSkeleton.cs
using System;

namespace Effigy;

/// <summary>
/// Citizen's skeleton, as data.
///
/// WHY A TABLE AND NOT A LOAD. A playermodel is a model that convinces the engine it is citizen -
/// the animations bind by bone NAME against citizen's bind pose, so anything meant to play them
/// has to carry citizen's 95 bones in citizen's hierarchy, posed the way citizen is posed. Reading
/// that out of the compiled model at runtime needs an engine, which puts every test that touches
/// retargeting behind a running editor. As a table it is engine-free like the rest of the kernel,
/// the headless suite can exercise the whole retarget, and the Godot option stays open.
///
/// WHERE THE NUMBERS CAME FROM, since a wrong bind pose here is invisible until something animates.
/// Read off the engine - <see cref="EffigySkeletonImport"/> rebuilds citizen's 95 bones from the
/// compiled `models/citizen/citizen.vmdl` and `effigy_skeleton_probe ... local` dumps each bone's
/// LOCAL basis, which these rows are. The first version came out of a converter that read
/// `citizen.fbx` and changed coordinate systems, and it got every POSITION right while silently
/// getting every ORIENTATION wrong - a transpose at the pelvis, a 180 degree flip on the thighs.
/// Positions are roll-independent, so every check that only compared .Origin passed; the first
/// sign of trouble was a playermodel that walked into a knot. The orientations are now pinned
/// against the engine's own bind pose (0.02 degrees, see CitizenSkeletonTests), which is the one
/// thing citizen's animations were authored against.
///
/// TWO ROOTS, DELIBERATELY. `pelvis` carries the body; `root_IK` carries the IK targets and aim
/// matrices, which are driven rather than skinned. RigDiagnostics complains about multiple roots
/// and is right to in general - this is the exception, and it is citizen's own arrangement, not a
/// mistake to be tidied up.
/// </summary>
public static class CitizenSkeleton
{
	/// <summary>Bones in citizen's own bind pose, parents before children.</summary>
	public static Skeleton Build()
	{
		var s = new Skeleton();

		Add( s, "pelvis", -1, 0.000000f, -0.000003f, 1.000000f, 1.000000f, 0.000001f, -0.000000f, -0.000001f, 1.000000f, 0.000002f, 1.266582f, 0.000015f, 31.073600f );
		Add( s, "spine_0", 0, 1.000000f, -0.000113f, 0.000000f, 0.000113f, 1.000000f, 0.000517f, -0.000001f, -0.000517f, 1.000000f, 3.921827f, -0.002448f, -0.000116f );
		Add( s, "spine_1", 1, 1.000000f, 0.000548f, 0.000000f, -0.000548f, 1.000000f, -0.000794f, -0.000000f, 0.000794f, 1.000000f, 5.610455f, -0.000002f, 0.000034f );
		Add( s, "spine_2", 2, 1.000000f, 0.000182f, 0.000505f, -0.000182f, 1.000000f, 0.000424f, -0.000505f, -0.000424f, 1.000000f, 5.610455f, 0.000010f, 0.000039f );
		Add( s, "neck_0", 3, 0.999205f, -0.039875f, -0.000499f, 0.039875f, 0.999205f, -0.000174f, 0.000506f, 0.000154f, 1.000000f, 5.820026f, -0.093485f, -0.002965f );
		Add( s, "head", 4, 0.999229f, 0.039260f, 0.000000f, -0.039260f, 0.999229f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 4.510826f, -0.000764f, -0.000021f );
		Add( s, "ear_R", 5, -0.000002f, -0.258809f, -0.965928f, 0.130527f, 0.957665f, -0.256595f, 0.991445f, -0.126081f, 0.033780f, 5.621445f, -0.415436f, -5.929162f );
		Add( s, "ear_L", 5, 0.000002f, -0.258830f, 0.965924f, -0.130523f, -0.957660f, -0.256615f, 0.991446f, -0.126075f, -0.033785f, 5.621471f, -0.415518f, 5.929078f );
		Add( s, "face_lid_lower_R", 5, -0.766044f, -0.617889f, 0.177173f, -0.642788f, 0.736370f, -0.211147f, 0.000000f, -0.275633f, -0.961263f, 6.908779f, 5.140452f, -3.234578f );
		Add( s, "face_lid_lower_L", 5, -0.766044f, -0.617887f, -0.177179f, -0.642788f, 0.736368f, 0.211155f, -0.000001f, 0.275642f, -0.961260f, 6.908836f, 5.140447f, 3.234681f );
		Add( s, "face_lid_upper_L", 5, 0.642789f, 0.736368f, 0.211152f, 0.766043f, -0.617888f, -0.177179f, -0.000001f, 0.275641f, -0.961261f, 6.908882f, 5.140457f, 3.234683f );
		Add( s, "face_lid_upper_R", 5, 0.642789f, 0.736369f, -0.211146f, 0.766043f, -0.617889f, 0.177174f, 0.000001f, -0.275633f, -0.961263f, 6.908894f, 5.140500f, -3.234588f );
		Add( s, "eye_L", 5, 0.000003f, 1.000000f, 0.000011f, 1.000000f, -0.000003f, -0.000001f, -0.000001f, 0.000011f, -1.000000f, 6.908875f, 5.140468f, 3.234679f );
		Add( s, "eye_R", 5, 0.000003f, 1.000000f, 0.000011f, 1.000000f, -0.000003f, -0.000001f, -0.000001f, 0.000011f, -1.000000f, 6.908855f, 5.140492f, -3.234586f );
		Add( s, "clavicle_L", 3, 0.057047f, -0.236123f, 0.970048f, 0.015016f, 0.971723f, 0.235648f, -0.998259f, 0.001124f, 0.058980f, 4.038116f, 0.275209f, 1.103955f );
		Add( s, "arm_upper_L", 14, 0.689452f, 0.146935f, 0.709271f, -0.103924f, 0.989144f, -0.103894f, -0.716837f, -0.002080f, 0.697237f, 6.218333f, 0.000024f, 0.000050f );
		Add( s, "arm_upper_L_twist1", 15, 1.000000f, 0.000000f, -0.000001f, -0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, 5.022614f, 0.000016f, -0.000027f );
		Add( s, "arm_lower_L", 15, 0.955941f, 0.293560f, -0.000001f, -0.293559f, 0.955941f, 0.000000f, 0.000001f, 0.000000f, 1.000000f, 10.045190f, 0.000021f, -0.000038f );
		Add( s, "arm_lower_L_twist0", 17, 1.000000f, 0.000001f, -0.000001f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, -0.000001f, 1.000000f, 0.000026f, -0.000002f, -0.000061f );
		Add( s, "hand_L", 17, 0.994660f, 0.072851f, 0.073097f, -0.084982f, 0.980058f, 0.179619f, -0.058554f, -0.184872f, 0.981016f, 7.706685f, 0.000005f, -0.000080f );
		Add( s, "hold_L", 19, 0.633178f, -0.215812f, 0.743311f, 0.690174f, -0.277272f, -0.668417f, 0.350351f, 0.936240f, -0.026614f, 5.361074f, 0.621719f, 3.394421f );
		Add( s, "hand_R_to_L_ikrule", 19, 0.047319f, 0.382733f, 0.922647f, 0.382733f, 0.846240f, -0.370667f, -0.922647f, 0.370667f, -0.106441f, -28.151850f, 11.309700f, 27.264180f );
		Add( s, "finger_thumb_0_L", 19, 0.631348f, 0.716268f, 0.297254f, -0.439571f, 0.014745f, 0.898087f, 0.638889f, -0.697669f, 0.324160f, 1.127939f, 1.648623f, 0.866791f );
		Add( s, "finger_thumb_1_L", 22, 0.947017f, 0.000008f, 0.321182f, -0.000008f, 1.000000f, -0.000003f, -0.321183f, 0.000000f, 0.947017f, 1.906575f, -0.000019f, -0.000051f );
		Add( s, "finger_thumb_2_L", 23, 0.985823f, 0.000000f, 0.167790f, -0.000000f, 1.000000f, 0.000000f, -0.167790f, -0.000000f, 0.985823f, 2.136335f, -0.000023f, -0.000057f );
		Add( s, "finger_index_meta_L", 19, 0.973791f, 0.213591f, -0.078172f, -0.202528f, 0.970696f, 0.129353f, 0.103510f, -0.110130f, 0.988513f, 2.075293f, 1.204094f, 0.377499f );
		Add( s, "finger_index_0_L", 25, 0.849878f, -0.130198f, 0.510643f, 0.133798f, 0.990558f, 0.029878f, -0.509712f, 0.042930f, 0.859274f, 3.068913f, -0.000026f, -0.000088f );
		Add( s, "finger_index_1_L", 26, 0.890936f, 0.000006f, 0.454128f, -0.000004f, 1.000000f, -0.000003f, -0.454128f, 0.000001f, 0.890936f, 2.283295f, -0.000006f, -0.000130f );
		Add( s, "finger_index_2_L", 27, 0.999622f, 0.000005f, 0.027516f, -0.000005f, 1.000000f, -0.000010f, -0.027516f, 0.000010f, 0.999622f, 1.594418f, -0.000056f, -0.000151f );
		Add( s, "finger_middle_meta_L", 19, 0.996821f, -0.038042f, -0.070019f, 0.039293f, 0.999091f, 0.016572f, 0.069325f, -0.019270f, 0.997408f, 2.100662f, -0.159080f, 0.285816f );
		Add( s, "finger_middle_0_L", 29, 0.890944f, 0.002115f, 0.454109f, -0.002930f, 0.999995f, 0.001090f, -0.454104f, -0.002302f, 0.890946f, 2.999247f, -0.000021f, -0.000084f );
		Add( s, "finger_middle_1_L", 30, 0.892075f, 0.000081f, 0.451886f, -0.000077f, 1.000000f, -0.000028f, -0.451886f, -0.000010f, 0.892076f, 2.560955f, 0.000002f, -0.000095f );
		Add( s, "finger_middle_2_L", 31, 0.995350f, -0.000065f, 0.096325f, 0.000067f, 1.000000f, -0.000024f, -0.096325f, 0.000031f, 0.995350f, 1.683010f, -0.000020f, -0.000147f );
		Add( s, "finger_ring_meta_L", 19, 0.964135f, -0.254768f, 0.074414f, 0.262215f, 0.957708f, -0.118489f, -0.041080f, 0.133751f, 0.990163f, 2.104892f, -1.444509f, 0.223248f );
		Add( s, "finger_ring_0_L", 33, 0.924820f, 0.108582f, 0.364579f, -0.111945f, 0.993643f, -0.011965f, -0.363560f, -0.029747f, 0.931096f, 2.824311f, -0.000027f, -0.000107f );
		Add( s, "finger_ring_1_L", 34, 0.868304f, -0.000104f, 0.496033f, 0.000150f, 1.000000f, -0.000054f, -0.496033f, 0.000121f, 0.868304f, 2.198013f, 0.000006f, -0.000111f );
		Add( s, "finger_ring_2_L", 35, 0.994922f, 0.000019f, 0.100648f, -0.000017f, 1.000000f, -0.000026f, -0.100649f, 0.000024f, 0.994922f, 1.535358f, -0.000020f, -0.000143f );
		Add( s, "arm_lower_L_twist1", 17, 1.000000f, 0.000000f, -0.000001f, -0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, 3.853358f, -0.000003f, -0.000057f );
		Add( s, "arm_elbow_helper_L", 17, -0.148414f, -0.988925f, -0.000000f, 0.988925f, -0.148414f, -0.000000f, 0.000000f, -0.000000f, 1.000000f, 0.000013f, -0.000005f, -0.000050f );
		Add( s, "arm_upper_L_twist0", 15, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000015f, 0.000013f, -0.000015f );
		Add( s, "clavicle_R", 3, 0.056067f, -0.236415f, -0.970034f, 0.014778f, 0.971652f, -0.235955f, 0.998318f, -0.001106f, 0.057972f, 4.036995f, 0.274871f, -1.108170f );
		Add( s, "arm_upper_R", 40, 0.689452f, 0.146937f, -0.709271f, -0.103928f, 0.989144f, 0.103894f, 0.716837f, 0.002083f, 0.697238f, 6.218301f, 0.000004f, -0.000057f );
		Add( s, "arm_lower_R", 41, 0.955941f, 0.293559f, -0.000001f, -0.293559f, 0.955941f, 0.000001f, 0.000001f, -0.000000f, 1.000000f, 10.045180f, 0.000010f, -0.000034f );
		Add( s, "arm_lower_R_twist0", 42, 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 0.000003f, 0.000010f, -0.000034f );
		Add( s, "arm_elbow_helper_R", 43, -0.148424f, -0.988924f, -0.000001f, 0.988924f, -0.148424f, 0.000001f, -0.000001f, -0.000000f, 1.000000f, 0.000004f, 0.000009f, -0.000027f );
		Add( s, "hand_R", 42, 0.994661f, 0.072851f, -0.073097f, -0.084982f, 0.980059f, -0.179620f, 0.058554f, 0.184873f, 0.981017f, 7.706668f, 0.000013f, -0.000042f );
		Add( s, "hold_R", 45, 0.633178f, -0.215811f, -0.743311f, -0.690173f, 0.277272f, -0.668417f, 0.350351f, 0.936240f, 0.026616f, 5.361098f, 0.621881f, -3.394508f );
		Add( s, "hand_L_to_R_ikrule", 45, 0.047320f, 0.382733f, -0.922646f, 0.382731f, 0.846240f, 0.370667f, 0.922647f, -0.370666f, -0.106440f, -28.151810f, 11.309840f, -27.264330f );
		Add( s, "finger_thumb_0_R", 45, 0.631340f, 0.716274f, -0.297257f, -0.439576f, 0.014743f, -0.898084f, -0.638892f, 0.697664f, 0.324165f, 1.127935f, 1.648661f, -0.866875f );
		Add( s, "finger_thumb_1_R", 48, 0.947018f, -0.000007f, -0.321181f, 0.000008f, 1.000000f, 0.000002f, 0.321181f, -0.000005f, 0.947018f, 1.906584f, 0.000008f, -0.000034f );
		Add( s, "finger_thumb_2_R", 49, 0.985820f, 0.000001f, -0.167802f, -0.000001f, 1.000000f, 0.000000f, 0.167802f, -0.000000f, 0.985820f, 2.136345f, 0.000019f, -0.000067f );
		Add( s, "finger_index_meta_R", 45, 0.973789f, 0.213598f, 0.078166f, -0.202536f, 0.970694f, -0.129351f, -0.103505f, 0.110129f, 0.988513f, 2.075287f, 1.204121f, -0.377586f );
		Add( s, "finger_index_0_R", 51, 0.849883f, -0.130194f, -0.510636f, 0.133793f, 0.990559f, -0.029877f, 0.509704f, -0.042927f, 0.859278f, 3.068913f, 0.000014f, 0.000004f );
		Add( s, "finger_index_1_R", 52, 0.890938f, -0.000002f, -0.454125f, 0.000005f, 1.000000f, 0.000004f, 0.454125f, -0.000006f, 0.890938f, 2.283289f, 0.000012f, -0.000031f );
		Add( s, "finger_index_2_R", 53, 0.999621f, 0.000001f, -0.027527f, -0.000001f, 1.000000f, 0.000009f, 0.027527f, -0.000009f, 0.999621f, 1.594448f, 0.000052f, -0.000074f );
		Add( s, "finger_middle_meta_R", 45, 0.996821f, -0.038035f, 0.070012f, 0.039285f, 0.999090f, -0.016572f, -0.069318f, 0.019269f, 0.997408f, 2.100664f, -0.159062f, -0.285912f );
		Add( s, "finger_middle_0_R", 55, 0.890948f, 0.002121f, -0.454101f, -0.002937f, 0.999995f, -0.001091f, 0.454096f, 0.002306f, 0.890950f, 2.999241f, 0.000039f, 0.000011f );
		Add( s, "finger_middle_1_R", 56, 0.892078f, 0.000075f, -0.451881f, -0.000070f, 1.000000f, 0.000028f, 0.451881f, 0.000006f, 0.892078f, 2.560987f, 0.000024f, -0.000042f );
		Add( s, "finger_middle_2_R", 57, 0.995349f, -0.000070f, -0.096336f, 0.000073f, 1.000000f, 0.000024f, 0.096336f, -0.000031f, 0.995349f, 1.683018f, 0.000041f, -0.000057f );
		Add( s, "finger_ring_meta_R", 45, 0.964137f, -0.254761f, -0.074419f, 0.262208f, 0.957710f, 0.118487f, 0.041086f, -0.133751f, 0.990163f, 2.104872f, -1.444489f, -0.223320f );
		Add( s, "finger_ring_0_R", 59, 0.924822f, 0.108587f, -0.364572f, -0.111951f, 0.993642f, 0.011965f, 0.363553f, 0.029748f, 0.931098f, 2.824306f, 0.000048f, -0.000008f );
		Add( s, "finger_ring_1_R", 60, 0.868306f, -0.000109f, -0.496030f, 0.000156f, 1.000000f, 0.000052f, 0.496030f, -0.000123f, 0.868306f, 2.198006f, 0.000029f, -0.000050f );
		Add( s, "finger_ring_2_R", 61, 0.994921f, 0.000018f, -0.100658f, -0.000016f, 1.000000f, 0.000025f, 0.100658f, -0.000023f, 0.994921f, 1.535378f, 0.000063f, -0.000090f );
		Add( s, "arm_lower_R_twist1", 42, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 3.853341f, 0.000007f, -0.000042f );
		Add( s, "arm_upper_R_twist1", 41, 1.000000f, 0.000000f, 0.000001f, -0.000000f, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 5.022589f, 0.000008f, -0.000031f );
		Add( s, "arm_upper_R_twist0", 41, 1.000000f, 0.000000f, 0.000001f, -0.000000f, 1.000000f, 0.000000f, -0.000001f, 0.000000f, 1.000000f, 0.000000f, 0.000010f, -0.000046f );
		Add( s, "neck_clothing", 3, 0.999205f, -0.039875f, -0.000499f, 0.039875f, 0.999205f, -0.000174f, 0.000506f, 0.000154f, 1.000000f, 5.820026f, -0.093483f, -0.002965f );
		Add( s, "leg_upper_R", 0, -1.000000f, -0.000003f, 0.000002f, -0.000003f, 1.000000f, 0.000000f, -0.000002f, 0.000000f, -1.000000f, -0.288153f, -0.426444f, -4.427378f );
		Add( s, "leg_lower_R", 67, 0.999332f, -0.036556f, -0.000000f, 0.036556f, 0.999332f, -0.000003f, 0.000000f, 0.000003f, 1.000000f, 14.470370f, -0.000016f, 0.000000f );
		Add( s, "ankle_R", 68, 0.693459f, 0.720496f, 0.000002f, -0.720496f, 0.693460f, 0.000000f, -0.000001f, -0.000002f, 1.000000f, 12.515520f, 0.000005f, 0.000004f );
		Add( s, "ball_R", 69, 0.694663f, 0.719336f, -0.000003f, -0.719336f, 0.694663f, 0.000000f, 0.000002f, 0.000002f, 1.000000f, 4.429118f, 0.000003f, 0.000004f );
		Add( s, "leg_lower_R_twist0", 68, 1.000000f, 0.000000f, -0.000000f, 0.000000f, 1.000000f, -0.000000f, 0.000000f, -0.000000f, 1.000000f, -0.000004f, 0.000005f, -0.000010f );
		Add( s, "leg_lower_R_twist1", 68, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, 6.257763f, 0.000006f, -0.000003f );
		Add( s, "leg_knee_helper_R", 68, -0.018241f, 0.999834f, 0.000003f, -0.999833f, -0.018241f, -0.000001f, -0.000001f, -0.000003f, 1.000000f, 0.000006f, 0.000006f, -0.000008f );
		Add( s, "leg_upper_R_twist1", 67, 1.000000f, 0.000000f, 0.000000f, -0.000000f, 1.000000f, -0.000000f, -0.000000f, 0.000000f, 1.000000f, 7.235193f, 0.000024f, -0.000014f );
		Add( s, "leg_upper_R_twist0", 67, 1.000000f, 0.000006f, 0.000000f, -0.000006f, 1.000000f, -0.000000f, -0.000000f, 0.000000f, 1.000000f, 0.000008f, 0.000006f, -0.000017f );
		Add( s, "leg_glute_helper_R", 67, 0.000004f, -1.000000f, 0.000003f, 1.000000f, 0.000004f, -0.000001f, 0.000001f, 0.000003f, 1.000000f, -0.000008f, 0.000000f, -0.000008f );
		Add( s, "leg_upper_L", 0, -1.000000f, -0.000003f, 0.000002f, -0.000003f, 1.000000f, 0.000000f, -0.000002f, 0.000000f, -1.000000f, -0.288130f, -0.426438f, 4.427379f );
		Add( s, "leg_lower_L", 77, 0.999332f, -0.036559f, 0.000001f, 0.036559f, 0.999332f, -0.000006f, -0.000001f, 0.000006f, 1.000000f, 14.470370f, -0.000046f, -0.000025f );
		Add( s, "ankle_L", 78, 0.693460f, 0.720495f, 0.000004f, -0.720496f, 0.693460f, 0.000005f, 0.000001f, -0.000007f, 1.000000f, 12.515520f, 0.000005f, -0.000007f );
		Add( s, "ball_L", 79, 0.694661f, 0.719337f, -0.000002f, -0.719337f, 0.694661f, -0.000000f, 0.000001f, 0.000002f, 1.000000f, 4.429111f, 0.000005f, -0.000009f );
		Add( s, "leg_lower_L_twist0", 78, 1.000000f, -0.000000f, -0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, -0.000000f, 1.000000f, -0.000010f, 0.000003f, -0.000011f );
		Add( s, "leg_lower_L_twist1", 78, 1.000000f, 0.000000f, 0.000000f, -0.000000f, 1.000000f, -0.000000f, -0.000000f, -0.000000f, 1.000000f, 6.257762f, 0.000006f, -0.000009f );
		Add( s, "leg_knee_helper_L", 78, -0.018243f, 0.999834f, -0.000002f, -0.999834f, -0.018243f, -0.000006f, -0.000007f, 0.000002f, 1.000000f, -0.000013f, 0.000003f, -0.000011f );
		Add( s, "leg_upper_L_twist1", 77, 1.000000f, 0.000000f, 0.000000f, -0.000000f, 1.000000f, -0.000000f, -0.000000f, -0.000000f, 1.000000f, 7.235189f, 0.000019f, -0.000010f );
		Add( s, "leg_upper_L_twist0", 77, 1.000000f, -0.000000f, -0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, -0.000000f, 1.000000f, 0.000008f, 0.000010f, -0.000009f );
		Add( s, "leg_glute_helper_L", 77, 0.000003f, -1.000000f, 0.000003f, 1.000000f, 0.000003f, -0.000000f, 0.000000f, 0.000003f, 1.000000f, -0.000006f, 0.000002f, -0.000004f );
		Add( s, "root_IK", -1, 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -0.000000f, 0.000000f, 1.000000f, 1.266575f, 0.000007f, 0.000000f );
		Add( s, "hand_R_IK_target", 87, 0.350350f, -0.690175f, -0.633177f, 0.936241f, 0.277271f, 0.215811f, 0.026614f, -0.668416f, 0.743311f, 0.693991f, -20.394730f, 39.247990f );
		Add( s, "hand_L_IK_target", 87, 0.350353f, 0.690174f, -0.633177f, 0.936239f, -0.277274f, 0.215812f, -0.026616f, -0.668415f, -0.743312f, 0.694105f, 20.394710f, 39.247960f );
		Add( s, "aim_matrix_02a", 87, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 0.000000f, 0.000000f, -0.000000f, 1.000000f, 4.638925f, 0.000001f, 9.842500f );
		Add( s, "aim_matrix_02b", 90, 1.000000f, -0.000000f, -0.000000f, -0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, 3.937002f, -0.000000f, 0.000001f );
		Add( s, "aim_matrix_01", 87, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 0.000000f, 0.000000f, -0.000000f, 1.000000f, 4.638925f, 0.000001f, 11.811000f );
		Add( s, "foot_R_IK_target", 87, 0.694660f, 0.000001f, -0.719338f, 0.719338f, 0.000003f, 0.694660f, 0.000002f, -1.000000f, 0.000002f, -0.884065f, -4.427398f, 3.807914f );
		Add( s, "foot_L_IK_target", 87, 0.694659f, -0.000002f, -0.719339f, 0.719339f, -0.000003f, 0.694659f, -0.000004f, -1.000000f, -0.000000f, -0.884095f, 4.427402f, 3.807924f );
		return s;
	}

	/// <summary>One row of the table. Length is left at the default and filled in by
	/// <see cref="Skeleton"/> consumers that want a tail; citizen's bones carry no length of their
	/// own, and inventing one here would put a number in the table that nothing measured.</summary>
	static void Add( Skeleton s, string name, int parent,
		float xx, float xy, float xz, float yx, float yy, float yz, float zx, float zy, float zz,
		float ox, float oy, float oz ) =>
		s.AddBone( name, parent,
			new Xform( new Vec3( xx, xy, xz ), new Vec3( yx, yy, yz ), new Vec3( zx, zy, zz ),
				new Vec3( ox, oy, oz ) ) );
}