Skip to content

Animation clips and tracks

AnvilAnimationApplies toRRSWS

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

Animation fixed prefixvariableRR24% known

Little-endian. Offsets are relative to this structure.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x01u8ManagedObject byteUnknown01.
0x14f32LengthObserved
0x54u32F4F597FFUnknownVaries by clip.
0x94u32322B96B8UnknownZero throughout the clip census.
0xD4u32556E9166 array count AUnknownStored bytes; meaning is not established.
0x112Au16[]556E9166UnknownEmpty throughout the census.
17+2A4u32251905D9 array count BUnknownStored bytes; meaning is not established.
21+2A2Bu16[]251905D9UnknownEmpty throughout the census.
21+2A+2B4u8[4]four bool fieldsUnknownHashes 1F4DA15F, 93847F6A, ABC2D4B8, 0D7D1D50; fourth set on 390 streamed clips.
25+2A+2B4u32event countObserved
29+2A+2BvariableobjectsAnimTrackEventsUnknownType 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

Animation track block9 + times + valuesRR56% known

Little-endian. Offsets are relative to this structure.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x01u8tagObserved3 × kind + time form.
0x14u32size wordUnknownWithin eight bytes of stored payload length in checked clips; not a payload byte count.
0x54u32key count KObserved
0x9Tbytestime dataObservedSelected by tag modulo 3.
9+TK × value widthbytesvaluesObserved
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

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

How does the engine interpolate and select tracks?

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

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]

Animation object (from the byte after the header byte)variableSWS100% known

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.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x03u8[3] = 02 00 00table bytesProven
0x34u32row count kProven
0x712krowstableUnknownper 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+12k1u8 = 1managedProven
8+12k4u32idProventhe directory's id
12+12k4u32 = 0x0FA3067FclassProven
16+12k4f32lengthProvenseconds; every track's last key lies on length × 60 but for 25 of 6,593,436
20+12k4u32layout wordObservedrepeated by AnimTrackData; clips sharing it share their mapping list for 274 of 275 values
24+12k4u32unknownUnknown0 on the clips the game loads up to the second level
28+12k2u16unknownUnknown0 on the clips the game loads up to the second level
30+12k4u32unknownUnknownthe clip's id plus 3 on 13,823 of the 14,363 Animation objects the game loads up to the second level
34+12k4u32event countProven
38+12kEobjectsAnimTrackEventsUnknownnot decoded; AnimTrackData is the first place after them that reads as it, which is unique on every clip
38+12k+E4u32unknownUnknown0 on the clips the game loads up to the second level
42+12k+E1u8 = 0AnimTrackData tagProven
43+12k+E4u32AnimTrackData idObserved0 on the clips the game loads up to the second level
47+12k+E4u32 = 0x0181EFE8classProvenAnimTrackData
51+12k+E4u32layout wordObservedequals the one above on 80,367 of 80,466 objects
55+12k+E4u32mapping count nProven
59+12k+E12nmappingsmappingsProvenper mapping: id (0), class 0x653CAA76, CRC-32 of the bone name (0: the root's motion)
59+12k+E+12n2u16unknownUnknown0 on the clips the game loads up to the second level
61+12k+E+12n4u32track countProvenequals n
65+12k+E+12nvariableblockstracksProvenone 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]

Track block9 + T + K × widthSWS100% known

Little-endian. All 6,593,436 tracks of the install.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x01u8tagProvenkind << 2; bit 0: u16 times; bit 1: unknown flag that adds 2 bytes in memory
0x14u32in-memory sizeProven2 + T, plus 2 with bit 1, rounded up to the kind's alignment, plus K × width
0x54u32key count KProvenat least 1
0x9Tu8[] or u16[]key timesProvenK − 1 times in 1/60 s, the first key at 0; strictly rising on every track
9+TK × widthbytesvaluesProven

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]

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