The section list is a list of strings. Each string is stored with a leading byte which is the number of characters in the string.
Table 1 is used to work out how many entries there are in each section. It is an array of structures. I have figured out most of it, but with a couple of issues.
typedef struct Table1Entry
{
Int32 Offset;
Int32 StartRecord;
Int16 NumberOfRecords;
Int16 Type;
};
Offset should start at 0, but it seems to start at 0x1c. It may be some kind of size instead.
Type seems to work this way.
0x0000 == String (or string plus value)
0x0002 == Accumulated short (used for lod distance table)
0x0101 == Bytes (used for face groups and face lists)
0x0004 == Vertex plus normal
0x0003 == Floats (shadow verts and UV coordinates)
I have no idea what table 2 is for yet
Table 3 starts with the file offset of the actual data.
Each Int32 after that is the size of the corresponding sub record.
So for the first record you look up it's name from the section list, you look at table 1 and you know it has 3 sub records. You look at table 3 and find the sizes of each of the sub records.
So an example look up.
Section[0] = "[Common]"
Table1[0] = 0x001C,0x0000,0x0003,0x0000
Table3[0] = 0x000C,0x0012,0x000D
Data
0x09,"NumBones",0x0000
0x0B,"FramesType",0x07,"Single"
0x0A,"NumFrames",0x0001
Everything matches up nicely except I don't know how the code can tell between a string and a string plus value. It might be hardcoded.
The LOD distance table is defined as an accumulation of shorts, doing the same exercise for the LOD table gives me
Section[1]="[LOD]"
Table[1] = 0x0026,0x0003,0x0004,0x0002
Table[3] = 0x0002,0x0002,0x0002,0x0002
Data
0x0028,0x0078,0x00FA,0x0258
Converting this to text gives you
[Common]
NumBones 0
FramesType Single
NumFrames 1
[LOD]
40
160
410
1010
Hope this helps