ANIM (Metroid Prime)

From Retro Modding Wiki
Revision as of 06:25, 12 April 2016 by imported>Jackoalan (→‎Quaternion Array Format (Uncompressed))
Jump to navigation Jump to search

This article is for the ANIM format used in Metroid Prime. See ANIM (File Format) for the other revisions of this format.

The ANIM format is used in conjunction with CINF + CSKR rigging to animate CMDL meshes.

There are two versions of the ANIM format in Metroid Prime (indicated by the file's first u32 value), one with compressed animations and one with uncompressed ones:

Version Description
0x0 Quaternion Array Format (Uncompressed)
0x2 Rotation Vector Bitstream Format (Compressed)

Quaternion Array Format (Uncompressed)

The Quaternion Array Format (0x0) is a less common animation format in Metroid Prime. It only appears in a Ridley intro animation and the rotating pirate data artifact hologram above the Impact Crater, as well as some unused Samus animations.

The format stores uncompressed animations by mapping animation channels to bones and supplying rotations as an array of quaternion (WXYZ) keys. Optionally, translations may be specified for a subset of bones as an array of float3 keys.

Layout

Offset Type Element Count Name Notes
0x4 float 1 Duration [1/2 in CCharAnimTime] Time in seconds that the animation plays for
0x8 u32 1 Differential State Enum [2/2 in CCharAnimTime] State of Duration time point for proper integration control
  1. Non Zero
  2. Zero Increasing
  3. Zero Steady
  4. Zero Decreasing
  5. Infinity
0xC float 1 Key Interval [1/2 in CCharAnimTime] Time in seconds between keys of each bone channel (reciprocal of frame-rate)
0x10 u32 1 Differential State Enum [2/2 in CCharAnimTime] State of Key Interval time point for proper integration control
0x14 u32 1 Key Count Count of keys for each bone channel (keys are set for every frame of the animation)
0x18 u32 1 Root Bone ID ID of the root bone in this ANIM
0x1C u32 1 Rotation Channel Index Count Count of rotation channel indices in the next array. Always 100.
0x20 u8 Rotation Channel Index Count Rotation Channel Index Array This table maps each bone to a rotation channel, with the index-position corresponding to a Bone ID in the associated CINF, while the value corresponds to the index of a rotation channel. The value is 0xFF if the bone is not animated by this ANIM.
u32 1 Translation Channel Index Count Count of translation channel indices in the next array. Matches the number of valid rotation channels.
u8 Translation Channel Index Count Translation Channel Index Array This table maps each rotation channel to a translation channel, with the index-position corresponding to an entry in the Rotation Channel Index Array above (disregarding 0xFF entries), while the value corresponds to the index of a translation channel. The value is 0xFF if the bone is not translated by this ANIM.
u32 1 Quaternion Key Count Count of elements in Quaternion Key Array below
float4 Quaternion Key Count Quaternion Key Array The quaternion keys are interleaved as such (bone-major):
|------------|------------|-----|------------|
| bone0/key0 | bone0/key1 | ... | bone0/keyN |
| bone1/key0 | bone1/key1 | ... | bone1/keyN |
| .......... | .......... | ... | .......... |
| boneN/key0 | boneN/key1 | ... | boneN/keyN |
|------------|------------|-----|------------|
u32 1 Translation Key Count Count of elements in Translation Key Array below
float3 Translation Key Count Translation Key Array The translation keys are interleaved the same way as the rotation keys. Any bone channels that were marked 0xFF in the Translation Channel Index Array are skipped.
EVNT 1 EVNT Ref ID for this ANIM's EVNT resource, or 0xFFFFFFFF if no events triggered

Rotation Vector Bitstream Format (Compressed)

The Rotation Vector Bitstream Format (0x2) is the most widely used animation format in Metroid Prime. The format uses a compressed bitstream to store keys that have been delta encoded and quantized to make for a very compact, compressed animation. The data is processed sequentially to reconstruct the uncompressed bone channel data as quaternions.

In addition to the bitstream quantization, the format includes a bitmap specifying which frames of the animation have keys added. Consequently, the runtime generates missing keys via interpolation (reducing animation size further).

Key Values

When decoding the animation, each bone's rotation (and possibly translation) values are initialized to the Initial * values in the bone channel descriptors. For every frame of every bone channel, the key value in the bitstream is added with the previous key value (to resolve the delta encoding).

Once resolved, rotation components are divided by Rotation Divisor, resulting in an axis-angle rotation vector. This rotation vector is converted to quaternion imaginary components with the W component derived via normalized-difference and a sign-bit packed into the bitstream:

q = π / 2.0 / rotation_divisor
X = sin(rx * q)
Y = sin(ry * q)
Z = sin(rz * q)
W = sqrt(MAX((1.0 - (X*X + Y*Y + Z*Z)), 0.0))
W = sign_bit ? -W : W

Translation components are multiplied by Translation Multiplier, yielding world units.

Layout

Offset Type Element Count Name Notes
0x4 u32 1 Scratch Size Amount of memory that the animation system needs to allocate to process animation
0x8 EVNT 1 EVNT Ref ID for this ANIM's EVNT resource, or 0xFFFFFFFF if no events triggered
0xC u32 1 Unknown 1 Always 0x1
0x10 float 1 Duration Time in seconds that the animation plays for
0x14 float 1 Interval Time in seconds between frames (reciprocal of frame-rate, typically 30-fps)
0x18 u32 1 Root Bone ID ID of the root bone in this ANIM
0x1C u32 1 Unknown 3 Always 0x0
0x20 u32 1 Rotation Divisor Rotation vectors are divided by this value before being applied
0x20 float 1 Translation Multiplier Translation vectors are multiplied by this value before being applied
0x24 u32 1 Bone Channel Count Count of bone channels present in ANIM
0x28 4 u32 Unknown 4 Always 0x1
0x2C u32 1 Key Bitmap Length Number of bits in Key Bitmap
0x30 u32 round_up(Key Bitmap Length / 32) Key Bitmap Word-packed bitmap. Each word is read from least-significant to most-significant bit. A set bit indicates the frame at the bit's position has keys for each bone channel. If the bit is unset, the keys must be generated via interpolation.
u32 1 Bone Channel Count Count of animated bone channels (matches the previous bone channel count)
u32 1 Bone Channel Descriptor Count Count of bone channel descriptors in Bone Channel Descriptor Table. Matches the Bone Channel Counts.
Bone Channel Descriptor Bone Channel Descriptor Count Bone Channel Descriptor Table Table describing animated bone channels
u32 <remainder of file> Key Bitstream Word-packed bitstream laid out as described by the descriptor table. The bitstream is unpacked just like Key Bitmap (least-significant to most-significant).

Key values are tightly-packed, quantized integers whose bit-depth is specified by the q_* values in the descriptor table. Each bone-channel key-set starts with a single bit providing the W sign-bit (1 for negative, 0 for positive).

The key integers are signed using Two's complement representation.

The keys are interleaved as such (key-major):

|------------|------------|-----|------------|
| bone0/key0 | bone1/key0 | ... | boneN/key0 |
| bone0/key1 | bone1/key1 | ... | boneN/key1 |
| .......... | .......... | ... | .......... |
| bone0/keyN | bone1/keyN | ... | boneN/keyN |
|------------|------------|-----|------------|

Bone Channel Descriptor

Offset Type Name Notes
0x0 u32 Bone ID Bone ID in the associated CINF for this bone channel
0x4 u16 Rotation Key Count Number of rotation keys in the bitstream for this bone channel.

If this value is 0, the remaining Rotation fields aren't present

0x6 s16 Initial Rotation X Initial X value of bone's rotation vector
0x8 u8 Rotation Bits X Number of bits allocated to bone's rotation delta X in bitstream
0x9 s16 Initial Rotation Y Initial Y value of bone's rotation vector
0xB u8 Rotation Bits Y Number of bits allocated to bone's rotation delta Y in bitstream
0xC s16 Initial Rotation Z Initial Z value of bone's rotation vector
0xE u8 Rotation Bits Z Number of bits allocated to bone's rotation delta Z in bitstream
0xF u16 Translation Key Count If this bone channel has an animated translation, its value will match Rotation Key Count; otherwise the value will be 0.

If the value is 0, the remaining Translation fields aren't present

0x11 s16 Initial Translation X Initial X value of bone's translation vector
0x13 u8 Translation Bits X Number of bits allocated to bone's translation delta X in bitstream
0x14 s16 Initial Translation Y Initial Y value of bone's translation vector
0x16 u8 Translation Bits Y Number of bits allocated to bone's translation delta Y in bitstream
0x17 s16 Translation Delta Z Initial Z value of bone's translation vector
0x19 u8 Translation Bits Z Number of bits allocated to bone's translation delta Z in bitstream
0x1A End of descriptor