Animation clips and tracks
Animation (0x0FA3067F) stores clip metadata, bone-name mappings and keyframe tracks. The complete track enumeration across DataPC, DataPC patch, USNAT, USNAT patch and base WhiteRoom contains 9,087 clips, 1,396,592 tracks and 25,241,022 keys; every clip’s track framing consumes exactly to its body end. Event payloads remain opaque and use a following-object anchor, so this is complete track framing rather than complete event decoding. Observed · five archives
All 9,087 checked clips use the extended resource header. There are 1,923 clips with events, 4,053 with TTECLAnimation objects and 390 with a nonzero boolean flag in that enumeration. Observed · five archives
Body order
Section titled “Body order”Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 | ManagedObject byte | Unknown | 01. |
| 0x1 | 4 | f32 | Length | Observed | |
| 0x5 | 4 | u32 | F4F597FF | Unknown | Varies by clip. |
| 0x9 | 4 | u32 | 322B96B8 | Unknown | Zero throughout the clip census. |
| 0xD | 4 | u32 | 556E9166 array count A | Unknown | Stored bytes; meaning is not established. |
| 0x11 | 2A | u16[] | 556E9166 | Unknown | Empty throughout the census. |
| 17+2A | 4 | u32 | 251905D9 array count B | Unknown | Stored bytes; meaning is not established. |
| 21+2A | 2B | u16[] | 251905D9 | Unknown | Empty throughout the census. |
| 21+2A+2B | 4 | u8[4] | four bool fields | Unknown | Hashes 1F4DA15F, 93847F6A, ABC2D4B8, 0D7D1D50; fourth set on 390 streamed clips. |
| 25+2A+2B | 4 | u32 | event count | Observed | |
| 29+2A+2B | variable | objects | AnimTrackEvents | Unknown | Type 0x41682213; nested audio events not fully decoded. |
After the events comes AnimTrackData: 00 + u64 id + type 0x0181EFE8, a u32 hash field, a mapping count, mapping objects, and a u16. Each mapping is u64 id + type 0x653CAA76 + u32 bone-name CRC-32; zero names root-motion tracks. Mappings and tracks correspond one-to-one in order. Observed
Next is ECLAnimation: 03 null, or 00 + u64 + type 0xAC692A57 followed by byte, u32, u16 and byte arrays, each counted. Then come buffer B832D26F (u32 byte length + bytes), u32 CB4E5F18, track count and track blocks. This order is checked on all 9,087 clips and differs from registry field order. Observed · five archives
Track blocks
Section titled “Track blocks”Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 | tag | Observed | 3 × kind + time form. |
| 0x1 | 4 | u32 | size word | Unknown | Within eight bytes of stored payload length in checked clips; not a payload byte count. |
| 0x5 | 4 | u32 | key count K | Observed | |
| 0x9 | T | bytes | time data | Observed | Selected by tag modulo 3. |
| 9+T | K × value width | bytes | values | Observed |
| Time form | Serialized times | Unit / evidence | Confidence |
|---|---|---|---|
| 0 | K−1 u8 values; first time implicit zero | 1/60 s, endpoints compared with Length | Observed |
| 1 | K−1 u16 values; first time implicit zero | 1/60 s, endpoints compared with Length | Observed |
| 2 | Marker then 1–8 mask bytes; popcount equals K | Set-bit frame at 1/30 s; 3,683 sampled tracks | Observed |
For mask form, low six marker bits count bytes; high bits are 0x40, 0x80 or 0xC0. Their complete semantic distinction is unknown. All interpreted track times rise and remain within Length plus 1/30 s in the whole-corpus value check. Observed
| Kind | Bytes / value | Meaning or decode | Confidence |
|---|---|---|---|
| 3 | 4 | Smallest-three quaternion, three 10-bit components | Observed |
| 4 | 6 | Smallest-three quaternion, three 15-bit components | Observed |
| 5 | 8 | Smallest-three quaternion, three 20-bit components on a bit ring | Observed |
| 7 | 2 | Rotation about z from low 15 bits | Observed |
| 8 | 12 | Quaternion xyz as f32, positive reconstructed w | Observed |
| 9 | 12 | Translation xyz as f32 | Observed |
| 16, 18 | 1 | Scalar bytes, complete semantics unresolved | Unknown |
| 17 | 2 | Scalar word, complete semantics unresolved | Unknown |
| 21, 22 | 4 | Values associated with non-bone hashes | Unknown |
| 25 | 8 | Eight observed tracks; packing unresolved | Unknown |
Packed component decode is (v / maximum × 2 − 1) / sqrt(2), with maxima 1023, 32767 or 1048575. The omitted quaternion component is the nonnegative square root making unit length. First-key matches against mapped Skeleton local rotations distinguish these packings from alternatives; this is data evidence rather than execution of the track decoder. Observed
For kind 3, bits 30–31 select the omitted component; bits 20–29, 10–19 and 0–9 give retained components in component order. Observed
Kind 4 uses the low 15 bits of each u16 as the retained components in component order. Bit 15 of word zero is the omitted index’s low bit and bit 15 of word one its high bit (0 x, 1 y, 2 z, 3 w), the order Shaun White Skateboarding’s executable uses. Bit 15 of word two is 0 on all 5,540,257 kind 4 keys of the five archives. Observed · five archives
The order is told by the keys, not by running the game’s decoder. Over the 60,004 consecutive key pairs of kind 4 tracks whose index changes between 0 or 3 and 1 or 2, each of the eight such changes keeps 72.8% to 87.5% of its pairs within |dot| > 0.99 with word zero’s bit as the low bit, and 1.6% to 4.2% with the bits read the other way round; changes between 0 and 3 or between 1 and 2, which both orders read the same, keep 74.3% to 75.7%, and keys of one index 98.8% to 99.1%. First keys agree: of the tracks whose bone has a single local rotation across every Skeleton, 318 of the 841 first keys with only word one’s bit set and 738 of the 2,149 with only word zero’s bit set lie within 1 − |dot| < 1e-6 of that rotation with word zero’s bit as the low bit, against 0 and 1 with the other order, while 438 of 974 (both bits clear) and 1,004 of 2,907 (both set) match under either. Observed · every kind 4 track of the five archives
For kind 5, retained components are bits 8–27, bits 52–63 followed by bits 0–7, and bits 32–51. The ring component is (low8 << 12) | high12. Bits 30–31 select the omitted component; bits 28–29 are zero on the checked keys. All 53,647 keys of 600 sampled tracks fit the component-square bound. Observed
Entity use
Section titled “Entity use”AnimComponent (0x8C8AA19D) contains four base bytes, u32 count and ten-byte Animation references, then a tail. In the checked five-archive Entity enumeration, 70 Entities carry it and 19 list Animations. Rider clip selection therefore is not established by scanning these references alone. Observed
Linear, Nearest, Cardinal, Natural and HermiteVel classes exist in the registry, but exact used-kind interpolation is not established. Event elements, high mask bits, kind-seven’s top bit and kinds 16–25 still have unresolved semantics. The rider’s Kino graph is not decoded here. Unknown
The complete six-archive index has 9,111 stored Animation entries. WhiteRoom patch contributes 24 entries outside the five-archive exact-end check above. All six archive tables are counted, with no index-reader refusals. Proven · inventory count
Shaun White Skateboarding
Section titled “Shaun White Skateboarding”only in SWS
Shaun White Skateboarding keeps the order of the Riders Republic body (length, a clip word, the event array, AnimTrackData with its bone mappings, then one track block per mapping) with 32-bit ids, no ECLAnimation, buffer or CB4E5F18 fields, and its own track tags and kinds. Every Animation of the 33 data forges reads with the layouts below to the object’s exact end: 80,466 objects holding 2,708 distinct clips and 6,593,436 tracks, with no refusals. Proven · SWS[every Animation of the install; framing, sizes and track values]
Animation is a block-allocator object (object header): its header byte is 1, and its bytes run past the declared body by exactly 7 + 12k, the table that opens them. Proven · SWS[all 80,466 Animation objects]
Little-endian. k is the table's row count, E the events' length, n the mapping count. All 80,466 Animation objects of the install.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 3 | u8[3] = 02 00 00 | table bytes | Proven | |
| 0x3 | 4 | u32 | row count k | Proven | |
| 0x7 | 12k | rows | table | Unknown | per row: a class id (0, or an event class such as AnimTrackEvent, EventSeed, AudioEvent, AudioEventSeed), u16 0, u16, u32; the AnimTrackEvent rows' u32 is the event count where checked |
| 7+12k | 1 | u8 = 1 | managed | Proven | |
| 8+12k | 4 | u32 | id | Proven | the directory's id |
| 12+12k | 4 | u32 = 0x0FA3067F | class | Proven | |
| 16+12k | 4 | f32 | length | Proven | seconds; every track's last key lies on length × 60 but for 25 of 6,593,436 |
| 20+12k | 4 | u32 | layout word | Observed | repeated by AnimTrackData; clips sharing it share their mapping list for 274 of 275 values |
| 24+12k | 4 | u32 | unknown | Unknown | 0 on the clips the game loads up to the second level |
| 28+12k | 2 | u16 | unknown | Unknown | 0 on the clips the game loads up to the second level |
| 30+12k | 4 | u32 | unknown | Unknown | the clip's id plus 3 on 13,823 of the 14,363 Animation objects the game loads up to the second level |
| 34+12k | 4 | u32 | event count | Proven | |
| 38+12k | E | objects | AnimTrackEvents | Unknown | not decoded; AnimTrackData is the first place after them that reads as it, which is unique on every clip |
| 38+12k+E | 4 | u32 | unknown | Unknown | 0 on the clips the game loads up to the second level |
| 42+12k+E | 1 | u8 = 0 | AnimTrackData tag | Proven | |
| 43+12k+E | 4 | u32 | AnimTrackData id | Observed | 0 on the clips the game loads up to the second level |
| 47+12k+E | 4 | u32 = 0x0181EFE8 | class | Proven | AnimTrackData |
| 51+12k+E | 4 | u32 | layout word | Observed | equals the one above on 80,367 of 80,466 objects |
| 55+12k+E | 4 | u32 | mapping count n | Proven | |
| 59+12k+E | 12n | mappings | mappings | Proven | per mapping: id (0), class 0x653CAA76, CRC-32 of the bone name (0: the root's motion) |
| 59+12k+E+12n | 2 | u16 | unknown | Unknown | 0 on the clips the game loads up to the second level |
| 61+12k+E+12n | 4 | u32 | track count | Proven | equals n |
| 65+12k+E+12n | variable | blocks | tracks | Proven | one per mapping, in order; they end the object |
Mappings are sorted by their bone CRC, and a bone with two tracks has its translation track first and its rotation track second. Observed · SWS[the 14,363 Animation objects the game loads up to the second level]
Little-endian. All 6,593,436 tracks of the install.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 | tag | Proven | kind << 2; bit 0: u16 times; bit 1: unknown flag that adds 2 bytes in memory |
| 0x1 | 4 | u32 | in-memory size | Proven | 2 + T, plus 2 with bit 1, rounded up to the kind's alignment, plus K × width |
| 0x5 | 4 | u32 | key count K | Proven | at least 1 |
| 0x9 | T | u8[] or u16[] | key times | Proven | K − 1 times in 1/60 s, the first key at 0; strictly rising on every track |
| 9+T | K × width | bytes | values | Proven |
Shaun White Skateboarding has no mask time form: bit 1 of the tag does not change the stored times. The in-memory size rule, with the widths and alignments of the table below, holds for every track block of the install, so a block whose size field disagrees is not a valid track. Proven · SWS[every track of the install]
| Kind (tag >> 2) | Width / alignment | Value | Confidence |
|---|---|---|---|
| 4 | 6 / 2 | Rotation: smallest-three with 15-bit components in component order, as Riders Republic’s kind 4: the omitted index’s low bit is bit 15 of the first word and its high bit bit 15 of the second (0 x, 1 y, 2 z, 3 w); bit 15 of the third word is 0 on every key | Observed · SWS |
| 5 | 8 / 4 | Rotation: smallest-three with 20-bit components on a bit ring, the Riders Republic kind 5 layout; bits 28 and 29 are 0 on every key | Observed · SWS |
| 6 | 12 / 4 | Rotation: x, y and z as f32, w the positive root | Observed · SWS |
| 7 | 12 / 4 | Three f32 on a few bones, not a unit quaternion’s xyz | Unknown |
| 8 | 4 / 4 | Translation: x bits 21–31, y bits 10–20, z bits 0–9, two’s complement, 1 mm units | Observed · SWS |
| 9 | 6 / 2 | Translation: three i16, 1 mm units | Observed · SWS |
| 10 | 4 / 4 | One f32 on tracks whose mapping is not a bone name | Unknown |
| 11, 17 | 1 / 1 | One byte on tracks whose mapping is not a bone name | Unknown |
The widths are fixed by the block grammar, which reads every track to the object’s end. The decodes are told apart by the data: on the 14,363 Animation objects the game loads up to the second level, consecutive keys of the three rotation kinds have a median smallest |dot| of 0.9986 (kind 4), 0.9986 (kind 5) and 0.9979 (kind 6), where the other 64-bit layouts tried give 0.14; every key decodes to a unit quaternion. For kind 8 the median largest step between consecutive keys is 16 units with the 11/11/10 split and over 1,000 with the 10/11/11 and 11/10/11 splits. Kind 4’s index bit order is told by the keys around a change of index. Over the 24,274 consecutive key pairs of the 2,708 distinct clips whose index changes, each of the twelve kinds of change keeps 96% to 99% of its pairs within |dot| > 0.9 of each other with word zero’s bit as the low bit, as keys of one index do (99.6% to 100%). With the bits read the other way round, the eight changes between index 0 or 3 and index 1 or 2 keep 1% to 24%. Keys that leave out y or z are 11% of kind 4 first keys. Over the install, 275,189 of 5,046,170 rotation first keys lie within 1e-5 of a bind rotation of a bone of that name, and 96,881 of 614,189 translation first keys within 1 mm of a bind position; the 1 mm unit fits kind 9’s i16 values against bind positions with a median ratio of 999 to 1,000 per metre. Observed · SWS
The executable’s PackedQuat48 unpack gives the same decode. Run unmodified in an emulator, the six-byte form (at 0x103F1D0 in the patched executable) and its two-key form (at 0x103F340, which the kind 4 sampler calls at 0x1060BC7) take words zero and one as u16 and word two as an i16, and turn each kept value v & 0x7FFF into f32(f32(v × C) − f32(1/sqrt(2))), where C is the f32 nearest sqrt(2)/32767 widened to a double (0x3F06A0CBA0000000): (v / 32767 × 2 − 1) / sqrt(2) up to rounding. The omitted component is sqrt(max(0, 1 − a² − b² − c²)) in double precision, and bit 15 of words zero and one pick its lane with word zero’s as the low bit: words (1234, 5678, 2345) put the root in x, (9234, 5678, 2345) in y, (1234, d678, 2345) in z and (9234, d678, 2345) in w (hexadecimal). Every one of the 891,984 distinct kind 4 values in the install decodes by this
rule to the same bits as the executed unpack gives. Proven · SWS[the engine’s unpack executed on every distinct value]
The renderer’s bone matrices confirm the kind 5, 6, 8 and 9 decodes. A traced frame’s local bone transforms come from its bone constants and MeshBone matrices as on the skeleton page, and a stored clip is sampled at a time between keys (linear, rotations normalized):
- a skinned train in four consecutive frames: one clip, at 4, 5, 9 and 13 ticks, gives the seven parent-child bones’ rotations (kind 6) to within 1 − |dot| = 3e-8 and their four translations (kind 9) to within 0.04 mm; in the two frames before, the bones are at their bind pose;
- a walking worker’s legs and torso in ten frames 20 presents apart: one clip, at times rising by about 13.8 ticks a step, gives every rotation (kind 5) to within 1 − |dot| = 1.3e-7 and every translation (kind 8) to within 0.013 mm.
A second walking character and the heads match no single stored clip at any time (the best leave 1 − |dot| of 0.09 to 0.17, or 1e-4 on one head bone), so they are blended or driven otherwise: no stored clip, of any kind and at any time, gives even one of their bones within 1 − |dot| = 1e-6 (a bone the clip has no track for taken at its bind rotation), and their child bones lie up to 2.4 m from their stored positions with no clip translating them. Kind 4, which their nearest clips use, is therefore not checked against the renderer under either index bit order. Observed · SWS[the bone constants of 290 skinned draws of 16 meshes in 16 traced frames of two runs]
AnimSet
Section titled “AnimSet”An AnimSet (0x31984F55) is a managed object: the managed byte 1, its id, its class, a u32 (0), a u32 count of AnimPairs and a final byte (0, or 1 on a few sets). An AnimPair is its id, the class 0x9DE9A987 and two u32 Animation ids. Every one of the 7,471 AnimSet objects of the install reads so to its exact end, and both ids of all 101,996 pairs are Animation ids of the install. Which clip of a pair the game plays when is not known. Proven · SWS[all AnimSets] Unknown · the pair’s roles