Please see AnimJ for an explaination on what an Animation file actually does and what this does.
Binary structure
An Animx is encoded in raw binary, and as such is a little difficult to decode.
The format is as follows in order as of version 1. (All is written and read by the System.IO.BinaryReader object):
Name | Type | Summary | Notes |
---|---|---|---|
Magic Word | String | "AnimX" to specify this file is Animx | |
File Version | Byte | 0 to most recent for Version of file. | |
Track Amount | 7 bit int | A number that says how many tracks are in the animation | |
Global Duration | Single | How long the animation is in seconds | |
Name | String | The name of the animation file | |
Encoding | Byte | The encoding of the rest of the file | 0 means read as normal default binary reader, 1 means LZ4S stream, and 2 means LZ4S memory stream |
Track Array | Track Array | The track types and their data | See Decoding Tracks |
Decoding Tracks Binary structure
When the decoder is decoding tracks, it uses the Activator class to create a new object of the track it is trying to decode.
Every iteration during the Track Array reading, it will read a starting byte.
Version 0
Name | Type | Summary | Notes |
---|---|---|---|
Track Type | Byte | If TYPE is equal to 1, it is a Curve track type, if it is 0 it is a Raw track type. see Type:TrackType. | |
Value Type | NONE SEE NOTES | is equal to Track Type >> 1 (a bitshift) |
This doesn't read a byte for this file version strangely. just sets the variable for Value Type for what is explained in summary.
|
Version 1
Name | Type | Summary | Notes |
---|---|---|---|
Track Type | Byte | converts the number directly based on the enum values of Type:TrackType | |
Value Type | Byte | Uses #ElementTypesTable to convert to the proper type |
ElementTypesTable
all bytes are in Little Endian
Name | Value | Description |
---|---|---|
bool
|
0 | Byte with starting 1 bits being the value |
bool2
|
1 | Byte with starting 2 bits being the value |
bool3
|
2 | Byte with starting 3 bits being the value |
bool4
|
3 | Byte with starting 4 bits being the value |
byte
|
4 | Byte |
ushort
|
5 | 2 Bytes |
uint
|
6 | 4 Bytes |
ulong
|
7 | 8 Bytes |
sbyte
|
8 | 1 Byte |
short
|
9 | 2 Bytes |
int
|
10 | 4 Bytes |
long
|
11 | 8 Bytes |
int2
|
12 | 8 Bytes |
int3
|
13 | 12 Bytes |
int4
|
14 | 16 bytes |
uint2
|
15 | 8 Bytes |
uint3
|
16 | 12 Bytes |
uint4
|
17 | 16 Bytes |
long2
|
18 | 16 Bytes |
long3
|
19 | 24 Bytes |
long4
|
20 | 32 Bytes |
float
|
21 | 4 Bytes |
float2
|
22 | 8 Bytes |
float3
|
23 | 12 Bytes |
float4
|
24 | 16 Bytes |
floatQ
|
25 | 16 Bytes (x,y,z,w) |
float2x2
|
26 | 16 bytes arranged by rows starting at top left down to bottom right. |
float3x3
|
27 | 36 bytes arranged by rows starting at top left down to bottom right. |
float4x4
|
28 | 64 bytes arranged by rows starting at top left down to bottom right. |
double
|
29 | 8 Bytes |
double2
|
30 | 16 Bytes |
double3
|
31 | 24 Bytes |
double4
|
32 | 32 Bytes |
doubleQ
|
33 | 40 Bytes |
double2x2
|
34 | 32 Bytes arranged by rows starting at top left down to bottom right. |
double3x3
|
35 | 72 Bytes arranged by rows starting at top left down to bottom right. |
double4x4
|
36 | 128 Bytes arranged by rows starting at top left down to bottom right. |
color
|
37 | 16 Bytes which is 4 floats for RGBA |
color32
|
38 | 4 bytes which is 4 bytes for RGBA |
string
|
39 | starts with a 7 bit encoded int with the amount of string bytes. each char is 1 byte also known as UTF-8. NOTE: This begins with a nullable 1 byte boolean if being written as part of a string animation track value. (aka Discrete or Raw string animation track) |
Tracks
It then decodes the track data based on one of the TrackTypes.
Raw
Name | Type | Summary | Notes |
---|---|---|---|
Node | String | See AnimJ | |
Property | String | See AnimJ | |
Amount Of Frames | 7 bit integer | See AnimJ on what frames are. these are encoded with no empty frames between. | |
Interval | Float | See AnimJ | |
Elements | Array of Value Type from #Decoding Tracks Binary structure |
A list of encoded binary values stacked on each other Amount Of Frames times. |
See #ElementTypesTable on how to decode each value type |
Discrete
Name | Type | Summary | Notes |
---|---|---|---|
Node | String | See AnimJ | |
Property | String | See AnimJ | |
Amount Of Frames | 7 bit integer | See AnimJ on what frames are. these are encoded with no empty frames between. | |
Frames | Array of Frames | list of Frames that first starts with a binary encoded float for the time position, then followed by a binary encoded Value Type from #Decoding Tracks Binary structure. this repeats for Amount Of Frames . |
Curve
Name | Type | Summary | Notes |
---|---|---|---|
Node | String | See AnimJ | |
Property | String | See AnimJ | |
Amount Of Frames | 7 bit integer | See AnimJ on what frames are. these are encoded with no empty frames between. | |
Separate Interpolations && Tangents | Byte | See AnimJ for what these do | Starting bit represents if it has different interpolations per frame, second bit represents if it has tangents |
Interpolations | Byte array | Has a length of Amount Of Frames and the numerical value of the Type:KeyframeInterpolation enum. |
NOTE!!! ONLY IF: Shared Interpolations is true this will be written!!!
|
Shared Interpolation Type | Byte | A byte representing the numerical value of the Type:KeyframeInterpolation enum. | NOTE!!! ONLY IF: Shared Interpolations is false this will be written!!!
|
KeyFrames | List of Frames | list of Frames that first starts with a binary encoded Value Type from #Decoding Tracks Binary structure, then followed by a binary encoded float for the time position. this repeats for Amount Of Frames . |
|
Tangents | List of Tangent pairs | List of tangent pairs that starts with a binary encoded Value Type from #Decoding Tracks Binary structure for the right, followed by a binary encoded Value Type from #Decoding Tracks Binary structure for the left. this repeats for Amount Of Frames . |
Bezier
NOT SUPPORTED YET.
Using the data or encoding the data
Using the data or encoding the data can be done by using Python's struct library or a programming language with the binary reader of your choice.
Make sure to use LittleEndian when reading and writing the binary.
Tools that can decode and write AnimX easier
- TODO