Skip to content

Skeletons and bone identity

AnvilAnimationApplies toRRSWS

Skeleton (0x24AECB7C) stores a bone hierarchy and local/global transforms. All 1,138 Skeleton resources present in the six-archive inventory consume exactly with the checked grammar, with no refusals; their 54,925 bones are keyed by CRC-32 name hashes, matching Animation mappings. Proven · grammar coverage Observed · name mapping

Ordered body portion Representation Confidence
Managed prefix / enum One byte, then u32 9C78EB24 (0–8 and 14 occur) Proven · all 1,138 Skeletons
Bones Count, tagged Bone objects 0x95741049 Proven · all 1,138 Skeletons
Root Null 03 or 02 + u64 back-reference Proven · all 1,138 Skeletons
Own position / rotation Two f32 vec4 values Proven · all 1,138 Skeletons
BodyPartMapping Ten-byte resource reference Proven · all 1,138 Skeletons
Pose groups Counted SkeletonPoseGroup → SkeletonPose → SkeletonPoseBone objects Proven · all 1,138 Skeletons
IKData Null or inline object 0x9A33101E, no stored fields Proven · all 1,138 Skeletons
LookAt / ReflexSystem Resource reference, then null ReflexSystem in all 1,138 Proven · all 1,138 Skeletons
Remaining fields Two f32, optional byte-buffer Reflex3SkeletonConstraints, counted u32 array Proven · all 1,138 Skeletons

A Bone starts with its name hash, parent pointer, a second bone pointer and null BoneDisplayData in all checked bones. Global position, global rotation, local position and local rotation are vec4; rotations are unit xyzw quaternions, positions have fourth lane zero. The second pointer fits self on a chain and the opposite side on paired bones, but its full meaning is inferred. Observed Inferred

The rest includes a byte, enum, empty BoneModifier array, u32 array, constant word seven, float one and a packed word whose low 16 bits are array position and high 16 bits descendant count in checked data. SkeletonPoseBone has a custom 16-byte body not described by its registry list. Observed

SkeletonComponent (0x71FDA747) has four base bytes, main Skeleton reference, counted addon Skeleton references (mode byte 04), ExpressionPack reference (null as 03 and nine zero bytes), counted 20-byte AnimTrackDefinition objects (u64 + type 0xA8037D53 + 8 bytes) and embedded WindForce (u64 + type 0xE7F9A244 + 12 bytes). The addon Skeletons are the MAD_CHR_SkelAddon_* rigs a character’s parts add (head, upper and lower body, outfit, hair); they repeat the main skeleton’s upper chain, and bones join by name hash. 146 SkeletonComponents are stored. Length is 56 + 10 × addons + 20 × track definitions in the checked profile, including 56-byte NPC and 116-byte bike examples. Observed

For the checked rider pose, the Skeleton’s own transform replaces the root bone’s local transform rather than multiplying an additional offset onto it. The runtime pose snapshot distinguishes replacement from composition; mesh inverse bind matrices correspond to stored global transforms. Observed

The engine’s runtime pose array holds 48-byte records (position vec4, rotation vec4, scale). For MAD_CHR_Skel_U its root is at (0, 0, 0.964) with a +90° turn about z, the Skeleton’s own transform, and the other bones hold their stored locals. For MAD_CHR_Skel_Bike_U the stored root local turns −90° and the own transform +90°, and the runtime root turns +90°: composing the two would give identity, so the own transform replaces the root local. In 1,033 of 1,120 Skeletons the stored root local already equals the own transform. Observed · runtime pose snapshot of two skeletons; stored census

Every Skeleton has exactly one parentless bone, bone 0, the root. Stored bone globals exclude the own transform. Rider clips are authored with it applied: of 1,238 rider-root clip tracks, the median first-key z is 0.901, and 69% lie within 0.2 of 0.964. A rider faces +x in bone space (toes +x, left +y), which is the game’s +y forward after the quarter turn. Observed

How do all skeleton modifiers and pose records execute?

Stored bones and bind transforms do not establish IK, Reflex constraint execution, the complete 16-byte pose-bone packing or all addon assembly rules. Unknown

The full inventory has 1,138 Skeleton entries, all in the four DataPC/USNAT base and patch archives; both WhiteRoom archives contain none. The exact-end check therefore covers every installed Skeleton despite not opening WhiteRoom patch. Proven

only in SWS

Shaun White Skateboarding’s Skeleton keeps the bone tree and the four bind transforms of each bone with 32-bit ids, and adds orientation constraints, pose groups, IK and centre-of-mass data and mirror pairs; it has no own transform, BodyPartMapping, LookAt or Reflex fields. Every Skeleton of the 33 data forges reads with the layout below to its exact end: 521 Skeletons holding 17,405 bones. Proven · SWS[every Skeleton of the install]

Skeleton bodyvariableSWS76% known

Little-endian. n is the bone count. All 521 Skeletons of the install.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x01u8 = 1managedProven
0x14u32idProven
0x54u32 = 0x24AECB7CclassProven
0x94u32unknownUnknown0 or 2
0xD4u32bone count nProven
0x11variablebonesbonesProvenn Bone records (below), each parent before its children
variable5referencerootProventag 2 and the first bone's id
variable4u32unknownUnknown
variablevariableobjectspose groupsProvenu32 count; each id, class 0xC8F8ABFF, u32 count of poses; a pose is id, class 0x209CF072, u32, u32 count of pose bones; a pose bone is id, class 0x071CEE50, bone name CRC, position f32 × 4, rotation f32 × 4
variablevariablepointerIK dataProventag 3 none, or 0, id, class 0x9A33101E and a u32 count of bone name CRCs
variablevariablepointercentre-of-mass dataProventag 3 none, or 0, id, class 0x9A67179A and two f32 × 4
variable4u32unknownUnknown
variablevariableobjectmirror dataProvenid, class 0xE96B19A5, u32 count of pairs; a pair is id, class 0xE03CA1FD, two bone name CRCs and two bytes; the body ends here
Bone recordvariableSWS100% known

Little-endian. All 17,405 bones of the install.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x01u8 = 0pointer tagProven
0x11u8 = 1managedProven
0x24u32idProven
0x64u32 = 0x95741049classProvenBone
0xA4u32nameObservedCRC-32 of the bone's name, the key Animation mappings use
0xE1 or 5referenceparentProventag 3 none (the root), or 2 and the id of a bone read before
variable73objectBoneInitialTransformsProventag 0, id, class 0x6350E5A6, then global position, global rotation, local position, local rotation, f32 × 4 each
variablevariableobjectsorientation constraintsProvenu32 count; each tag 0, id, class 0x75116750, bone reference (itself), u8, u32 count of targets (tag 0, id, class 0xDF638110, bone reference, f32), u8 and a quaternion
variable1u8indexProventhe bone's position in the list
variable1u8bones belowProvenits descendant count

A position is x, y, z and 0, a rotation a unit quaternion x, y, z, w. On every one of the 16,884 bones that have a parent, the global transform is the parent’s global composed with the bone’s local transform (rotation q_parent · q_local, position p_parent + q_parent · p_local) to within 1e-3; a root’s global equals its local. Proven · SWS[every bone of the install]

A skinned mesh’s MeshBone matrices hold the inverse of the bind: their rotation equals the inverse of the bone’s global bind rotation on 7,126 of 8,403 checked mesh bones, while their translations match on only 240, the others differing by a per-mesh scale mostly between 1.02 and 1.10. Observed · SWS[the meshes and skeletons loaded up to the second level]

The renderer skins with the MeshBone matrices. Its skinning vertex shaders hold a g_Bones array of 96 float4 registers from c39, three per palette entry: a bone’s 3×4 matrix, the bone’s pose times its MeshBone matrix in column form (the stored matrix is row-vector form, translation in its last row), with the world matrix in a separate g_World. A palette entry’s bone is its draw range’s palette index into the mesh’s MeshBones. For a bone and its parent in the same draw, IB_p · S_p⁻¹ · S_c · IB_c⁻¹ (S the registers, IB the MeshBone matrix in column form) is the child’s local transform, and its translation is the Skeleton’s stored local position to within 1e-3 on every one of the 85 parent-child pairs in the first frame each mesh is drawn. Over six frames, 214 of the 270 pairs are; the others are four bones of one mesh that its animation moves by 1.3 to 1.5 mm after its second frame. Observed · SWS[the bone constants of 40 skinned draws of six meshes (a train and five pigeons) traced at the draws, each draw’s palette and mesh matched to stored data]